/// <summary> /// Initialize when main window was loaded. /// </summary> /// <param name="sender">Not used.</param> /// <param name="e">Not used.</param> private void MainWindow_Loaded(object sender, RoutedEventArgs e) { CfgCycleCellCount.Text = Properties.Settings.Default.CellCount; CfgCycleTaperCurr.Text = Properties.Settings.Default.TaperCurrent; CfgCycleTermVolt.Text = Properties.Settings.Default.TerminationVoltage; CfgCycleChargeRelaxHours.Text = Properties.Settings.Default.ChargeRelaxHours; CfgCycleDischargeRelaxHours.Text = Properties.Settings.Default.DischargeRelaxHours; try { int BrdsNumber = 0; string BrdsName = ""; if (board.Connect(out BrdsNumber, out BrdsName) != 0) { throw new ArgumentException("EV2300 not found."); } LogView.AddEntry("EV2300 connected..."); Console.WriteLine(BrdsName); EV23KError err = board.CheckForError(); gauge = new GaugeInfo(board); UpdateGui(null, null); } catch (Exception ex) { Console.WriteLine(ex.Message); } }
/// <summary> /// Start new learning or GPC cycle on button click. /// </summary> /// <param name="sender">Not used.</param> /// <param name="e">Not used.</param> private async void ButtonCycleStart_Click(object sender, RoutedEventArgs e) { int cellCount = 0; int.TryParse(CfgCycleCellCount.Text, out cellCount); if (cellCount <= 0 || cellCount > 7) { LogView.AddEntry("Invalid cell count!"); return; } int termVoltage = 0; int.TryParse(CfgCycleTermVolt.Text, out termVoltage); int ctv = (termVoltage / cellCount); if (termVoltage <= 0 || (ctv < 2500) || (termVoltage / cellCount > 4200)) { LogView.AddEntry("Invalid termination voltage! (" + ctv.ToString() + "mV/cell)"); return; } int taperCurrent = 0; if (!int.TryParse(CfgCycleTaperCurr.Text, out taperCurrent)) { taperCurrent = 100; // mA CfgCycleTaperCurr.Text = taperCurrent.ToString("D"); } if (taperCurrent <= 0) { LogView.AddEntry("Invalid taper current!"); return; } /* See TI SLUA848, chapter 4.2.1 */ LogView.AddEntry("Preparing..."); /* Clear FET_EN to be able to set charge and discharge FETs */ if (gauge.FlagFET_EN == true) { gauge.CommandToogleFETenable(); } await Task.Delay(CmdExecDelayMilliseconds); if (gauge.FlagFET_EN == true) { LogView.AddEntry("Failed to clear FET_EN."); return; } if (selectedCycleType == CycleType.LearningCycle) { /* Enable gauging mode */ if (gauge.FlagGAUGE_EN == false || gauge.FlagQEN == false) { gauge.CommandSetGaugeEnable(); } await Task.Delay(CmdExecDelayMilliseconds); if (gauge.FlagGAUGE_EN == false || gauge.FlagQEN == false) { LogView.AddEntry("Failed to enable gauging mode."); return; } /* Reset to disable resistance update */ gauge.CommandReset(); await Task.Delay(ResetCmdExecDelayMilliseconds); if (gauge.FlagRDIS == false) { LogView.AddEntry("Error: RDIS not set after reset."); return; } if (gauge.GetReadValue("LStatus") != 0x04) { LogView.AddEntry("Error: LStatus != 0x04."); return; } } else if (selectedCycleType == CycleType.GpcCycle) { /* Disable gauging mode */ if (gauge.FlagGAUGE_EN == true || gauge.FlagQEN == true) { gauge.CommandSetGaugeEnable(); } await Task.Delay(CmdExecDelayMilliseconds); if (gauge.FlagGAUGE_EN == true || gauge.FlagQEN == true) { LogView.AddEntry("Failed to disable gauging mode."); return; } } if (gauge.FlagDSG == false) { gauge.CommandToggleDischargeFET(); } /* Set charge and discharge FETs */ if (gauge.FlagCHG == false) { gauge.CommandToggleChargeFET(); } await Task.Delay(CmdExecDelayMilliseconds); if (gauge.FlagCHG == false && gauge.FlagDSG == false) { LogView.AddEntry("Failed to set charge and discharge FETs."); return; } LogView.AddEntry("Device preparation successful."); int relaxTimeCharge = 0; int relaxTimeDischarge = 0; if (int.TryParse(CfgCycleChargeRelaxHours.Text, out relaxTimeCharge)) { relaxTimeCharge *= 60; // Convert to minute } else { relaxTimeCharge = 120; } if (int.TryParse(CfgCycleDischargeRelaxHours.Text, out relaxTimeDischarge)) { relaxTimeDischarge *= 60; // Conver to minutes } else { relaxTimeDischarge = 300; } Properties.Settings.Default.CellCount = CfgCycleCellCount.Text; Properties.Settings.Default.TaperCurrent = CfgCycleTaperCurr.Text; Properties.Settings.Default.TerminationVoltage = CfgCycleTermVolt.Text; Properties.Settings.Default.ChargeRelaxHours = CfgCycleChargeRelaxHours.Text; Properties.Settings.Default.DischargeRelaxHours = CfgCycleDischargeRelaxHours.Text; Properties.Settings.Default.Save(); List <GenericTask> tl = new List <GenericTask>(); if (selectedCycleType == CycleType.LearningCycle) { tl = new List <GenericTask> { new DischargeTask(termVoltage), new RelaxTask(relaxTimeDischarge), new ChargeTask(taperCurrent), new RelaxTask(relaxTimeCharge), new DischargeTask(termVoltage), new RelaxTask(relaxTimeDischarge) }; if (true) { // Perform field update cycle to reach LStatus 0x0E tl.AddRange(new GenericTask[] { new ChargeTask(taperCurrent), new RelaxTask(relaxTimeCharge), new DischargeTask(termVoltage), new RelaxTask(relaxTimeDischarge) }); } } else if (selectedCycleType == CycleType.GpcCycle) { tl = new List <GenericTask> { new ChargeTask(taperCurrent), new RelaxTask(relaxTimeCharge), new DischargeTask(termVoltage), new RelaxTask(relaxTimeDischarge) }; gpcLog = new GpcDataLog(cellCount); } cycle = new Cycle(tl, gauge); cycle.CycleModeType = selectedCycleModeType; cycle.LogWriteEvent += LogView.AddEntry; cycle.CycleCompleted += OnCycleCompleted; cycle.StartCycle(); timerUpdatePlot.Start(); ButtonCycleStart.IsEnabled = false; ButtonCycleCancel.IsEnabled = true; }