private void InitializeWorkspaceFromDataflash([NotNull] ArcticFoxConfiguration.CustomBattery battery)
        {
            if (battery == null)
            {
                throw new ArgumentNullException("battery");
            }

            for (var i = 0; i < battery.Data.Length; i++)
            {
                var data     = battery.Data[i];
                var percents = Math.Max(MinPrc, Math.Min(data.Percents, MaxPrc));
                var voltage  = Math.Max(MinVolts, Math.Min(data.Voltage / 100m, MaxVolts));
                var point    = new DataPoint(percents, (double)voltage)
                {
                    MarkerStyle = MarkerStyle.Circle,
                    MarkerSize  = 7,
                    Label       = string.Format("{0} %", percents),
                    Tag         = "draggable"
                };

                m_curveControls[i].PercentsUpDown.Value         = percents;
                m_curveControls[i].PercentsUpDown.Tag           = point;
                m_curveControls[i].PercentsUpDown.ValueChanged += PercentsUpDown_ValueChanged;

                m_curveControls[i].VoltsUpDown.Value         = voltage;
                m_curveControls[i].VoltsUpDown.Tag           = point;
                m_curveControls[i].VoltsUpDown.ValueChanged += VoltsUpDown_ValueChanged;

                DischargeChart.Series[0].Points.Add(point);
            }
            CutoffUpDown.Value = battery.Cutoff / 100m;
        }
        public DischargeProfileWindow([NotNull] ArcticFoxConfiguration.CustomBattery battery)
        {
            if (battery == null)
            {
                throw new ArgumentNullException("battery");
            }

            m_battery = battery;

            InitializeComponent();
            InitializeChart();
            InitializeControls();
            InitializeWorkspaceFromDataflash(m_battery);
        }
        private void SaveWorkspaceToDataflash([NotNull] ArcticFoxConfiguration.CustomBattery battery)
        {
            if (battery == null)
            {
                throw new ArgumentNullException("battery");
            }

            for (var i = 0; i < battery.Data.Length; i++)
            {
                var data = m_curveControls[i];

                battery.Data[i].Percents = (ushort)data.PercentsUpDown.Value;
                battery.Data[i].Voltage  = (ushort)(data.VoltsUpDown.Value * 100);
            }
            battery.Cutoff = (ushort)(CutoffUpDown.Value * 100);
        }
        private void ImportButton_Click(object sender, EventArgs e)
        {
            string filePath;

            using (var op = new OpenFileDialog {
                Filter = FileFilters.XmlFilter
            })
            {
                if (op.ShowDialog() != DialogResult.OK)
                {
                    return;
                }
                filePath = op.FileName;
            }

            try
            {
                using (var fs = File.Open(filePath, FileMode.Open))
                {
                    var data = Serializer.Read <BatteryProfile>(fs);
                    if (data == null || data.Points == null || data.Points.Length != m_curveControls.Length)
                    {
                        InfoBox.Show("Invalid battery profile file.");
                        return;
                    }
                    var custom = new ArcticFoxConfiguration.CustomBattery
                    {
                        Cutoff = (ushort)(data.Cutoff * 100),
                        Data   = data.Points.Select(x => new ArcticFoxConfiguration.PercentsVoltage
                        {
                            Percents = x.Percent,
                            Voltage  = (ushort)(x.Voltage * 100)
                        }).ToArray()
                    };
                    InstallPreset(custom);
                }
            }
            catch (Exception ex)
            {
                Trace.Warn(ex);
                InfoBox.Show("An error occurred during battery profile import.");
            }
        }
        private void InstallPreset(ArcticFoxConfiguration.CustomBattery customBattery)
        {
            m_isInstallingPreset = true;
            for (var i = 0; i < customBattery.Data.Length; i++)
            {
                var data  = customBattery.Data[i];
                var group = m_curveControls[i];

                var percents = Math.Max(MinPrc, Math.Min(data.Percents, MaxPrc));
                var voltage  = Math.Max(MinVolts, Math.Min(data.Voltage / 100m, MaxVolts));

                group.PercentsUpDown.Minimum = MinPrc;
                group.PercentsUpDown.Maximum = MaxPrc;
                group.PercentsUpDown.Value   = percents;

                group.VoltsUpDown.Minimum = MinVolts;
                group.VoltsUpDown.Maximum = MaxVolts;
                group.VoltsUpDown.Value   = voltage;
            }
            m_isInstallingPreset = false;
            UpdatePointsMinMax();
        }