| using System.Threading; | using System.Threading; | ||||
| using System.Windows.Forms; | using System.Windows.Forms; | ||||
| namespace FSRemotePowerSwitch | |||||
| { | |||||
| public partial class MainForm : Form | |||||
| { | |||||
| namespace FSRemotePowerSwitch { | |||||
| public partial class MainForm : Form { | |||||
| private static string SETTINGS_FILE = "Settings.txt"; | private static string SETTINGS_FILE = "Settings.txt"; | ||||
| private static string EXP_FIRMWARE_VER = "ExpectedFirmwareVersion"; | private static string EXP_FIRMWARE_VER = "ExpectedFirmwareVersion"; | ||||
| private static bool connected; | private static bool connected; | ||||
| private static Boolean Connected | |||||
| { | |||||
| private static Boolean Connected { | |||||
| [MethodImpl(MethodImplOptions.Synchronized)] | [MethodImpl(MethodImplOptions.Synchronized)] | ||||
| get { return connected; } | get { return connected; } | ||||
| [MethodImpl(MethodImplOptions.Synchronized)] | [MethodImpl(MethodImplOptions.Synchronized)] | ||||
| } | } | ||||
| private static bool requestPending; | private static bool requestPending; | ||||
| private static Boolean RequestPending | |||||
| { | |||||
| private static Boolean RequestPending { | |||||
| [MethodImpl(MethodImplOptions.Synchronized)] | [MethodImpl(MethodImplOptions.Synchronized)] | ||||
| get { return requestPending; } | get { return requestPending; } | ||||
| [MethodImpl(MethodImplOptions.Synchronized)] | [MethodImpl(MethodImplOptions.Synchronized)] | ||||
| private Boolean initializing; | private Boolean initializing; | ||||
| private string firmwareVersion; | private string firmwareVersion; | ||||
| public MainForm() | |||||
| { | |||||
| public MainForm() { | |||||
| initializing = false; | initializing = false; | ||||
| Connected = false; | Connected = false; | ||||
| RequestPending = false; | RequestPending = false; | ||||
| initializeSerialPortComboBox(); | initializeSerialPortComboBox(); | ||||
| } | } | ||||
| private void onFormShown(object sender, EventArgs e) | |||||
| { | |||||
| private void onFormShown(object sender, EventArgs e) { | |||||
| connect(); | connect(); | ||||
| } | } | ||||
| private void connect() | |||||
| { | |||||
| if (serialPort.IsOpen) | |||||
| { | |||||
| private void connect() { | |||||
| if (serialPort.IsOpen) { | |||||
| serialPort.Close(); | serialPort.Close(); | ||||
| } | } | ||||
| if (serialPortsCboBox.SelectedItem != null) | |||||
| { | |||||
| if (serialPortsCboBox.SelectedItem != null) { | |||||
| Application.UseWaitCursor = true; | Application.UseWaitCursor = true; | ||||
| serialPort.PortName = serialPortsCboBox.SelectedItem.ToString(); | serialPort.PortName = serialPortsCboBox.SelectedItem.ToString(); | ||||
| serialPort.Open(); | serialPort.Open(); | ||||
| Thread waitThread = new Thread(Wait); | Thread waitThread = new Thread(Wait); | ||||
| waitThread.Start(); | waitThread.Start(); | ||||
| } | |||||
| else | |||||
| { | |||||
| } else { | |||||
| initStatusLbl.Text = "Kein Port verfügbar!"; | initStatusLbl.Text = "Kein Port verfügbar!"; | ||||
| connectedSerialPortLbl.Text = "Port: "; | connectedSerialPortLbl.Text = "Port: "; | ||||
| initProgressBar.Style = ProgressBarStyle.Continuous; | initProgressBar.Style = ProgressBarStyle.Continuous; | ||||
| } | } | ||||
| } | } | ||||
| private void Wait() | |||||
| { | |||||
| private void Wait() { | |||||
| Stopwatch stopwatch = new Stopwatch(); | Stopwatch stopwatch = new Stopwatch(); | ||||
| stopwatch.Start(); | stopwatch.Start(); | ||||
| while (stopwatch.ElapsedMilliseconds < 3000) | |||||
| { | |||||
| while (stopwatch.ElapsedMilliseconds < 3000) { | |||||
| Thread.Sleep(50); | Thread.Sleep(50); | ||||
| if (Connected) | |||||
| { | |||||
| if (Connected) { | |||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| if (!Connected) | |||||
| { | |||||
| BeginInvoke(new EventHandler(delegate | |||||
| { | |||||
| if (!Connected) { | |||||
| BeginInvoke(new EventHandler(delegate { | |||||
| initStatusLbl.Text = "Zeitüberschreitung!"; | initStatusLbl.Text = "Zeitüberschreitung!"; | ||||
| connectedSerialPortLbl.Text = "Port: "; | connectedSerialPortLbl.Text = "Port: "; | ||||
| initProgressBar.Style = ProgressBarStyle.Continuous; | initProgressBar.Style = ProgressBarStyle.Continuous; | ||||
| Cursor.Position = Cursor.Position; | Cursor.Position = Cursor.Position; | ||||
| } | } | ||||
| private void initializeSerialPortComboBox() | |||||
| { | |||||
| private void initializeSerialPortComboBox() { | |||||
| initializing = true; | initializing = true; | ||||
| string[] ports = SerialPort.GetPortNames(); | string[] ports = SerialPort.GetPortNames(); | ||||
| foreach (string port in ports) | |||||
| { | |||||
| foreach (string port in ports) { | |||||
| serialPortsCboBox.Items.Add(port); | serialPortsCboBox.Items.Add(port); | ||||
| } | } | ||||
| PropertiesHandler serialPortCfg = new PropertiesHandler(SETTINGS_FILE); | PropertiesHandler serialPortCfg = new PropertiesHandler(SETTINGS_FILE); | ||||
| } | } | ||||
| private void onSerialPortsCboBoxSelectedIndexChanged(object sender, EventArgs e) | |||||
| { | |||||
| private void onSerialPortsCboBoxSelectedIndexChanged(object sender, EventArgs e) { | |||||
| PropertiesHandler serialPortCfg = new PropertiesHandler(SETTINGS_FILE); | PropertiesHandler serialPortCfg = new PropertiesHandler(SETTINGS_FILE); | ||||
| serialPortCfg.set(SERIALPORT_KEY, serialPortsCboBox.SelectedItem); | serialPortCfg.set(SERIALPORT_KEY, serialPortsCboBox.SelectedItem); | ||||
| serialPortCfg.Save(); | serialPortCfg.Save(); | ||||
| if (!initializing) | |||||
| { | |||||
| if (!initializing) { | |||||
| reconnectBtn.Visible = false; | reconnectBtn.Visible = false; | ||||
| connect(); | connect(); | ||||
| } | } | ||||
| } | } | ||||
| private void onSerialPortDataReceived(object sender, SerialDataReceivedEventArgs e) | |||||
| { | |||||
| private void onSerialPortDataReceived(object sender, SerialDataReceivedEventArgs e) { | |||||
| string s = readSerialPortData((SerialPort)sender); | string s = readSerialPortData((SerialPort)sender); | ||||
| try | |||||
| { | |||||
| try { | |||||
| Message msg = JsonConvert.DeserializeObject<Message>(s); | Message msg = JsonConvert.DeserializeObject<Message>(s); | ||||
| if (msg.Sender.Equals(Message.CMD_SENDER_AN) && msg.Cmd.Equals(Message.CMD_VER) && msg.Val.Equals(firmwareVersion)) | |||||
| { | |||||
| if (msg.Sender.Equals(Message.CMD_SENDER_AN) && msg.Cmd.Equals(Message.CMD_VER) && msg.Val.Equals(firmwareVersion)) { | |||||
| RequestPending = false; | RequestPending = false; | ||||
| BeginInvoke(new EventHandler(delegate | |||||
| { | |||||
| BeginInvoke(new EventHandler(delegate { | |||||
| sendRelayStatusCmd(); | sendRelayStatusCmd(); | ||||
| Connected = true; | Connected = true; | ||||
| initStatusLbl.Text = "Verbunden"; | initStatusLbl.Text = "Verbunden"; | ||||
| powerSwitchButton.Enabled = true; | powerSwitchButton.Enabled = true; | ||||
| statusTimer.Enabled = true; | statusTimer.Enabled = true; | ||||
| })); | })); | ||||
| } | |||||
| else if (msg.Sender.Equals(Message.CMD_SENDER_AN) && msg.Cmd.Equals(Message.CMD_STATUS_RELAY)) | |||||
| { | |||||
| } else if (msg.Sender.Equals(Message.CMD_SENDER_AN) && msg.Cmd.Equals(Message.CMD_STATUS_RELAY)) { | |||||
| RequestPending = false; | RequestPending = false; | ||||
| BeginInvoke(new EventHandler(delegate | |||||
| { | |||||
| if (msg.Val.Equals(Message.CMD_VAL_ON)) | |||||
| { | |||||
| BeginInvoke(new EventHandler(delegate { | |||||
| if (msg.Val.Equals(Message.CMD_VAL_ON)) { | |||||
| powerStateLed.BackgroundImage = FSRemotePowerSwitch.Properties.Resources.blue_led_on; | powerStateLed.BackgroundImage = FSRemotePowerSwitch.Properties.Resources.blue_led_on; | ||||
| powerSwitchButton.CheckStateChanged -= onSwitchCheckStateChanged; | powerSwitchButton.CheckStateChanged -= onSwitchCheckStateChanged; | ||||
| powerSwitchButton.Checked = true; | powerSwitchButton.Checked = true; | ||||
| powerSwitchButton.CheckStateChanged += onSwitchCheckStateChanged; | powerSwitchButton.CheckStateChanged += onSwitchCheckStateChanged; | ||||
| } | |||||
| else if (msg.Val.Equals(Message.CMD_VAL_OFF)) | |||||
| { | |||||
| } else if (msg.Val.Equals(Message.CMD_VAL_OFF)) { | |||||
| powerStateLed.BackgroundImage = FSRemotePowerSwitch.Properties.Resources.blue_led_off; | powerStateLed.BackgroundImage = FSRemotePowerSwitch.Properties.Resources.blue_led_off; | ||||
| powerSwitchButton.CheckStateChanged -= onSwitchCheckStateChanged; | powerSwitchButton.CheckStateChanged -= onSwitchCheckStateChanged; | ||||
| powerSwitchButton.Checked = false; | powerSwitchButton.Checked = false; | ||||
| } | } | ||||
| })); | })); | ||||
| } | } | ||||
| } | |||||
| catch (Exception ex) when (ex is Newtonsoft.Json.JsonReaderException || | |||||
| ex is Newtonsoft.Json.JsonSerializationException) | |||||
| { | |||||
| } catch (Exception ex) when (ex is Newtonsoft.Json.JsonReaderException || | |||||
| ex is Newtonsoft.Json.JsonSerializationException) { | |||||
| RequestPending = false; | RequestPending = false; | ||||
| initStatusLbl.Text = "Json Deserialize Exception!"; | initStatusLbl.Text = "Json Deserialize Exception!"; | ||||
| serialPort.DiscardInBuffer(); | serialPort.DiscardInBuffer(); | ||||
| } | } | ||||
| } | } | ||||
| private void onOpenBtnClick(object sender, EventArgs e) | |||||
| { | |||||
| if (serialPort.PortName != "COM1" && !serialPort.IsOpen) | |||||
| { | |||||
| private void onOpenBtnClick(object sender, EventArgs e) { | |||||
| if (serialPort.PortName != "COM1" && !serialPort.IsOpen) { | |||||
| serialPort.Open(); | serialPort.Open(); | ||||
| openBtn.Enabled = false; | openBtn.Enabled = false; | ||||
| closeBtn.Enabled = true; | closeBtn.Enabled = true; | ||||
| } | } | ||||
| } | } | ||||
| private void onCloseBtnClick(object sender, EventArgs e) | |||||
| { | |||||
| if (serialPort.IsOpen) | |||||
| { | |||||
| private void onCloseBtnClick(object sender, EventArgs e) { | |||||
| if (serialPort.IsOpen) { | |||||
| serialPort.Close(); | serialPort.Close(); | ||||
| openBtn.Enabled = true; | openBtn.Enabled = true; | ||||
| closeBtn.Enabled = false; | closeBtn.Enabled = false; | ||||
| } | } | ||||
| } | } | ||||
| private void onReconnectBtnClick(object sender, EventArgs e) | |||||
| { | |||||
| private void onReconnectBtnClick(object sender, EventArgs e) { | |||||
| reconnectBtn.Visible = false; | reconnectBtn.Visible = false; | ||||
| connect(); | connect(); | ||||
| } | } | ||||
| private void onSwitchCheckStateChanged(object sender, EventArgs e) | |||||
| { | |||||
| if (powerSwitchButton.Checked) | |||||
| { | |||||
| private void onSwitchCheckStateChanged(object sender, EventArgs e) { | |||||
| if (powerSwitchButton.Checked) { | |||||
| sendRelayPowerCmd(Message.CMD_VAL_ON); | sendRelayPowerCmd(Message.CMD_VAL_ON); | ||||
| } | |||||
| else | |||||
| { | |||||
| } else { | |||||
| sendRelayPowerCmd(Message.CMD_VAL_OFF); | sendRelayPowerCmd(Message.CMD_VAL_OFF); | ||||
| } | } | ||||
| } | } | ||||
| private void onWebCamPowerSwitchCheckStateChanged(object sender, EventArgs e) | |||||
| { | |||||
| if (webCamRotatorPowerSwitch.Checked) | |||||
| { | |||||
| private void onWebCamPowerSwitchCheckStateChanged(object sender, EventArgs e) { | |||||
| if (webCamRotatorPowerSwitch.Checked) { | |||||
| sendWebCamPowerCmd(Message.CMD_VAL_ON); | sendWebCamPowerCmd(Message.CMD_VAL_ON); | ||||
| } | |||||
| else | |||||
| { | |||||
| } else { | |||||
| sendWebCamPowerCmd(Message.CMD_VAL_OFF); | sendWebCamPowerCmd(Message.CMD_VAL_OFF); | ||||
| } | } | ||||
| } | } | ||||
| private String readSerialPortData(SerialPort serialPort) | |||||
| { | |||||
| private String readSerialPortData(SerialPort serialPort) { | |||||
| string data = ""; | string data = ""; | ||||
| while (serialPort.BytesToRead > 0) | |||||
| { | |||||
| while (serialPort.BytesToRead > 0) { | |||||
| data += serialPort.ReadExisting(); | data += serialPort.ReadExisting(); | ||||
| Thread.Sleep(50); | Thread.Sleep(50); | ||||
| } | } | ||||
| return data; | return data; | ||||
| } | } | ||||
| private void sendVersionCmd() | |||||
| { | |||||
| private void sendVersionCmd() { | |||||
| Message msg = new Message(); | Message msg = new Message(); | ||||
| msg.Sender = Message.CMD_SENDER_PC; | msg.Sender = Message.CMD_SENDER_PC; | ||||
| msg.Cmd = Message.CMD_VER; | msg.Cmd = Message.CMD_VER; | ||||
| msg.Val = null; | msg.Val = null; | ||||
| string msJson = JsonConvert.SerializeObject(msg); | string msJson = JsonConvert.SerializeObject(msg); | ||||
| if (serialPort.IsOpen && !RequestPending) | |||||
| { | |||||
| if (serialPort.IsOpen && !RequestPending) { | |||||
| serialPort.Write(msJson); | serialPort.Write(msJson); | ||||
| RequestPending = true; | RequestPending = true; | ||||
| } | } | ||||
| } | } | ||||
| private void sendRelayPowerCmd(string value) | |||||
| { | |||||
| private void sendRelayPowerCmd(string value) { | |||||
| Message msg = new Message(); | Message msg = new Message(); | ||||
| msg.Sender = Message.CMD_SENDER_PC; | msg.Sender = Message.CMD_SENDER_PC; | ||||
| msg.Cmd = Message.CMD_POWER_RELAY; | msg.Cmd = Message.CMD_POWER_RELAY; | ||||
| msg.Val = value; | msg.Val = value; | ||||
| string msJson = JsonConvert.SerializeObject(msg); | string msJson = JsonConvert.SerializeObject(msg); | ||||
| if (serialPort.IsOpen && !RequestPending) | |||||
| { | |||||
| if (serialPort.IsOpen && !RequestPending) { | |||||
| serialPort.Write(msJson); | serialPort.Write(msJson); | ||||
| RequestPending = true; | RequestPending = true; | ||||
| } | } | ||||
| } | } | ||||
| private void sendRelayStatusCmd() | |||||
| { | |||||
| private void sendRelayStatusCmd() { | |||||
| Message msg = new Message(); | Message msg = new Message(); | ||||
| msg.Sender = Message.CMD_SENDER_PC; | msg.Sender = Message.CMD_SENDER_PC; | ||||
| msg.Cmd = Message.CMD_STATUS_RELAY; | msg.Cmd = Message.CMD_STATUS_RELAY; | ||||
| msg.Val = null; | msg.Val = null; | ||||
| string msJson = JsonConvert.SerializeObject(msg); | string msJson = JsonConvert.SerializeObject(msg); | ||||
| if (serialPort.IsOpen && !RequestPending) | |||||
| { | |||||
| if (serialPort.IsOpen && !RequestPending) { | |||||
| serialPort.Write(msJson); | serialPort.Write(msJson); | ||||
| RequestPending = true; | RequestPending = true; | ||||
| } | } | ||||
| } | } | ||||
| private void sendWebCamZeroCmd() | |||||
| { | |||||
| private void sendWebCamZeroCmd() { | |||||
| Message msg = new Message(); | Message msg = new Message(); | ||||
| msg.Sender = Message.CMD_SENDER_PC; | msg.Sender = Message.CMD_SENDER_PC; | ||||
| msg.Cmd = Message.CMD_ZERO_CAM; | msg.Cmd = Message.CMD_ZERO_CAM; | ||||
| msg.Val = "0"; | msg.Val = "0"; | ||||
| string msJson = JsonConvert.SerializeObject(msg); | string msJson = JsonConvert.SerializeObject(msg); | ||||
| if (serialPort.IsOpen && !RequestPending) | |||||
| { | |||||
| if (serialPort.IsOpen && !RequestPending) { | |||||
| serialPort.Write(msJson); | serialPort.Write(msJson); | ||||
| RequestPending = true; | RequestPending = true; | ||||
| } | } | ||||
| } | } | ||||
| private void sendWebCamAzimutCmd() | |||||
| { | |||||
| private void sendWebCamAzimutCmd() { | |||||
| Message msg = new Message(); | Message msg = new Message(); | ||||
| msg.Sender = Message.CMD_SENDER_PC; | msg.Sender = Message.CMD_SENDER_PC; | ||||
| msg.Cmd = Message.CMD_AZIMUT_CAM; | msg.Cmd = Message.CMD_AZIMUT_CAM; | ||||
| msg.Val = webCamRotator.Value.ToString(); | msg.Val = webCamRotator.Value.ToString(); | ||||
| string msJson = JsonConvert.SerializeObject(msg); | string msJson = JsonConvert.SerializeObject(msg); | ||||
| if (serialPort.IsOpen && !RequestPending) | |||||
| { | |||||
| if (serialPort.IsOpen && !RequestPending) { | |||||
| serialPort.Write(msJson); | serialPort.Write(msJson); | ||||
| RequestPending = true; | RequestPending = true; | ||||
| } | } | ||||
| } | } | ||||
| private void sendWebCamPowerCmd(string value) | |||||
| { | |||||
| private void sendWebCamPowerCmd(string value) { | |||||
| Message msg = new Message(); | Message msg = new Message(); | ||||
| msg.Sender = Message.CMD_SENDER_PC; | msg.Sender = Message.CMD_SENDER_PC; | ||||
| msg.Cmd = Message.CMD_POWER_CAM; | msg.Cmd = Message.CMD_POWER_CAM; | ||||
| msg.Val = value; | msg.Val = value; | ||||
| string msJson = JsonConvert.SerializeObject(msg); | string msJson = JsonConvert.SerializeObject(msg); | ||||
| if (serialPort.IsOpen && !RequestPending) | |||||
| { | |||||
| if (serialPort.IsOpen && !RequestPending) { | |||||
| serialPort.Write(msJson); | serialPort.Write(msJson); | ||||
| RequestPending = true; | RequestPending = true; | ||||
| } | } | ||||
| } | } | ||||
| private void onStatusTimerTick(object sender, EventArgs e) | |||||
| { | |||||
| private void onStatusTimerTick(object sender, EventArgs e) { | |||||
| sendRelayStatusCmd(); | sendRelayStatusCmd(); | ||||
| } | } | ||||
| private void onMainFormClosing(object sender, FormClosingEventArgs e) | |||||
| { | |||||
| private void onMainFormClosing(object sender, FormClosingEventArgs e) { | |||||
| Stopwatch stopwatch = new Stopwatch(); | Stopwatch stopwatch = new Stopwatch(); | ||||
| stopwatch.Start(); | stopwatch.Start(); | ||||
| while (RequestPending && stopwatch.ElapsedMilliseconds < 2000) | |||||
| { | |||||
| while (RequestPending && stopwatch.ElapsedMilliseconds < 2000) { | |||||
| Thread.Sleep(50); | Thread.Sleep(50); | ||||
| } | } | ||||
| if (serialPort.IsOpen) | |||||
| { | |||||
| if (serialPort.IsOpen) { | |||||
| serialPort.DiscardInBuffer(); | serialPort.DiscardInBuffer(); | ||||
| serialPort.DiscardOutBuffer(); | serialPort.DiscardOutBuffer(); | ||||
| serialPort.Close(); | serialPort.Close(); | ||||
| } | } | ||||
| } | } | ||||
| private void onWebCamRotatorValueChanged(object Sender) | |||||
| { | |||||
| private void onWebCamRotatorValueChanged(object Sender) { | |||||
| rotatorActValue.Text = webCamRotator.Value.ToString(); | rotatorActValue.Text = webCamRotator.Value.ToString(); | ||||
| } | } | ||||
| private void onSetWebCamZero(object sender, EventArgs e) | |||||
| { | |||||
| private void onSetWebCamZero(object sender, EventArgs e) { | |||||
| sendWebCamZeroCmd(); | sendWebCamZeroCmd(); | ||||
| } | } | ||||
| private void onWebCamRotatorMiddleAreaClicked(object Sender) | |||||
| { | |||||
| private void onWebCamRotatorMiddleAreaClicked(object Sender) { | |||||
| sendWebCamAzimutCmd(); | sendWebCamAzimutCmd(); | ||||
| } | } | ||||