public async Task <CalibrationExecutionReport> FinishAsync() { if (_states.CanFire(CalibratorAction.Finish)) { CalibrationExecutionReport report = null; if (_pointsLeft <= 0) { var result = await _tracker.ComputeCalibrationAsync(); var data = _tracker.GetCalibration(); var plan = new CalibrationPlan(_calibratedPoints); report = new CalibrationExecutionReport(plan, result, data); _calibrations.Add(result); CalibrationFinished?.Invoke(this, result); } await _states.FireAsync(CalibratorAction.Finish); return(report); } else { throw new InvalidOperationException($"Cannot finish calibration in the current state of Calibrator: {State.ToString()}"); } }