private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
 {
     USB_device.Close();
 }
        public MainWindow()
        {
            InitializeComponent();

            OutLevelComboBox.ItemsSource = OutLevelsStrings;
            ModeImage.Source             = new BitmapImage(new Uri("images/Mode_Heat.jpg", UriKind.Relative));

            Boolean USBDevDetected = USB_device.Open();

            ShowConnectionState(USBDevDetected);

            if (USBDevDetected)
            {
                byte[] USBPacket = new byte[USB_PACKET_SIZE];
                USBPacket[0]           = USB_REPORT_ID;
                USBPacket[USB_CMD_POS] = USB_CMD_EEPROM_READ;
                Boolean USBSuccess = USB_device.Write(USBPacket);

                USBSuccess = USB_device.Read(USBPacket);

                byte FirmwareVersion = USBPacket[USB_DATA_POS + MAXIMUM_ON_TIME_OFFSET + MAXIMUM_ON_TIME_SIZE];

                if (USBPacket[USB_DATA_POS + MODE_OFFSET] <= MODE_COOL)
                {
                    if (USBPacket[USB_DATA_POS + MODE_OFFSET] == MODE_HEAT)
                    {
                        HeatMode.IsChecked = true;
                        ModeImage.Source   = new BitmapImage(new Uri("images/Mode_Heat.jpg", UriKind.Relative));
                    }

                    else
                    {
                        CoolMode.IsChecked = true;
                        ModeImage.Source   = new BitmapImage(new Uri("images/Cool_Heat.jpg", UriKind.Relative));
                    }

                    Tnorm.Text = ((float)((USBPacket[USB_DATA_POS + TEMP_NOMINAL_OFFSET] | (USBPacket[USB_DATA_POS + TEMP_NOMINAL_OFFSET + 1] << 8)) / TEMP_FLOAT_TO_INT_VALUE)).ToString("f2");
                    dTH.Text   = ((float)((USBPacket[USB_DATA_POS + TEMP_DELTA_HIGH_OFFSET] | (USBPacket[USB_DATA_POS + TEMP_DELTA_HIGH_OFFSET + 1] << 8)) / TEMP_FLOAT_TO_INT_VALUE)).ToString("f2");
                    dTL.Text   = ((float)((USBPacket[USB_DATA_POS + TEMP_DELTA_LOW_OFFSET] | (USBPacket[USB_DATA_POS + TEMP_DELTA_LOW_OFFSET + 1] << 8)) / TEMP_FLOAT_TO_INT_VALUE)).ToString("f2");
                    OutLevelComboBox.SelectedIndex = USBPacket[USB_DATA_POS + ACTIVE_LEVEL_OFFSET];
                    RnomTextBox.Text   = (USBPacket[USB_DATA_POS + THERMISTOR_R_NOMINAL_OFFSET] | (USBPacket[USB_DATA_POS + THERMISTOR_R_NOMINAL_OFFSET + 1] << 8) | (USBPacket[USB_DATA_POS + THERMISTOR_R_NOMINAL_OFFSET + 2] << 16) | (USBPacket[USB_DATA_POS + THERMISTOR_R_NOMINAL_OFFSET + 3] << 24)).ToString();
                    BconstTextBox.Text = (USBPacket[USB_DATA_POS + THERMISTOR_B_CONSTANT_OFFSET] | (USBPacket[USB_DATA_POS + THERMISTOR_B_CONSTANT_OFFSET + 1] << 8)).ToString();

                    if (FirmwareVersion >= MINIMUM_FIRMWARE_VER)
                    {
                        if (USBPacket[USB_DATA_POS + PROTECTION_ACTIVE_OFFSET] == PROTECTION_ENABLED)
                        {
                            ProtectionCheck.IsChecked = true;
                        }

                        ProtectionTimeTextBox.Text = (USBPacket[USB_DATA_POS + MAXIMUM_ON_TIME_OFFSET] | (USBPacket[USB_DATA_POS + MAXIMUM_ON_TIME_OFFSET + 1] << 8)).ToString();
                    }
                    else
                    {
                        ProtectionBorder.IsEnabled = false;
                    }
                }

                if (FirmwareVersion < MINIMUM_FIRMWARE_VER)
                {
                    MessageBox.Show(OldFirmwareVersionMessage, OldFirmwareVersionHeader, MessageBoxButton.OK, MessageBoxImage.Exclamation);
                }
                else
                {
                    FirmwareTextBlock.Text = FirmwareVersionPhrase + (FirmwareVersion >> 4).ToString() + "." + (FirmwareVersion & 0x0F).ToString();
                }
            }
        }
        private void DownloadButton_Click(object sender, RoutedEventArgs e)
        {
            byte[] USBPacket = new byte[USB_PACKET_SIZE];
            USBPacket[0]           = USB_REPORT_ID;
            USBPacket[USB_CMD_POS] = USB_CMD_EEPROM_WRITE;

            if (HeatMode.IsChecked == true)
            {
                USBPacket[USB_DATA_POS + MODE_OFFSET] = MODE_HEAT;
            }
            else
            {
                USBPacket[USB_DATA_POS + MODE_OFFSET] = MODE_COOL;
            }

            Int16 IntSetValue = 0;

            if (TryParseStringToInt(Tnorm.Text, out IntSetValue))
            {
                USBPacket[USB_DATA_POS + TEMP_NOMINAL_OFFSET]     = (byte)IntSetValue;
                USBPacket[USB_DATA_POS + TEMP_NOMINAL_OFFSET + 1] = (byte)(IntSetValue >> 8);
            }
            else
            {
                UserInputErrorMessage(UserInputErrorTnom);
                return;
            }

            if (TryParseStringToInt(dTH.Text, out IntSetValue))
            {
                USBPacket[USB_DATA_POS + TEMP_DELTA_HIGH_OFFSET]     = (byte)IntSetValue;
                USBPacket[USB_DATA_POS + TEMP_DELTA_HIGH_OFFSET + 1] = (byte)(IntSetValue >> 8);
            }
            else
            {
                UserInputErrorMessage(UserInputErrordTH);
                return;
            }

            if (TryParseStringToInt(dTL.Text, out IntSetValue))
            {
                USBPacket[USB_DATA_POS + TEMP_DELTA_LOW_OFFSET]     = (byte)IntSetValue;
                USBPacket[USB_DATA_POS + TEMP_DELTA_LOW_OFFSET + 1] = (byte)(IntSetValue >> 8);
            }
            else
            {
                UserInputErrorMessage(UserInputErrordTL);
                return;
            }

            USBPacket[USB_DATA_POS + ACTIVE_LEVEL_OFFSET] = (byte)OutLevelComboBox.SelectedIndex;

            UInt32 Uint32Val = 0;

            if (UInt32.TryParse(RnomTextBox.Text, out Uint32Val))
            {
                for (byte i = 0; i < THERMISTOR_R_NOMINAL_SIZE; i++)
                {
                    USBPacket[USB_DATA_POS + THERMISTOR_R_NOMINAL_OFFSET + i] = (byte)(Uint32Val >> (8 * i));
                }
            }
            else
            {
                UserInputErrorMessage(UserInputErrorRnom);
                return;
            }

            if (UInt32.TryParse(BconstTextBox.Text, out Uint32Val))
            {
                USBPacket[USB_DATA_POS + THERMISTOR_B_CONSTANT_OFFSET]     = (byte)Uint32Val;
                USBPacket[USB_DATA_POS + THERMISTOR_B_CONSTANT_OFFSET + 1] = (byte)(Uint32Val >> 8);
            }
            else
            {
                UserInputErrorMessage(UserInputErrorBconst);
                return;
            }

            if (ProtectionCheck.IsChecked == true)
            {
                USBPacket[USB_DATA_POS + PROTECTION_ACTIVE_OFFSET] = PROTECTION_ENABLED;
            }
            else
            {
                USBPacket[USB_DATA_POS + PROTECTION_ACTIVE_OFFSET] = PROTECTION_DISABLED;
            }

            if ((!UInt32.TryParse(ProtectionTimeTextBox.Text, out Uint32Val)) || (!((Uint32Val >= PROTECTION_MINUTE_MIN) && (Uint32Val <= PROTECTION_MINUTE_MAX))))
            {
                UserInputErrorMessage(UserInputErrorProtectTime);
                return;
            }
            else
            {
                USBPacket[USB_DATA_POS + MAXIMUM_ON_TIME_OFFSET]     = (byte)Uint32Val;
                USBPacket[USB_DATA_POS + MAXIMUM_ON_TIME_OFFSET + 1] = (byte)(Uint32Val >> 8);
            }

            Boolean USBSuccess = USB_device.Write(USBPacket);

            if (USBSuccess)
            {
                MessageBox.Show(DownloadCommandSuccess, DownloadCommandHeader, MessageBoxButton.OK, MessageBoxImage.Information);
            }
            else
            {
                MessageBox.Show(DownloadCommandError, DownloadCommandHeader, MessageBoxButton.OK, MessageBoxImage.Error);
            }

            ShowConnectionState(USBSuccess);
        }