private void OnSplitGoalCompletedEvent(SplitGoalCompletedEventArgs e) { EventHandler <SplitGoalCompletedEventArgs> handler = SplitGoalCompletedEvent; if (handler != null) { try { handler(this, e); } catch (Exception ex) { // Don't let downstream exceptions bubble up Logger.LogWarning(ex, ex.ToString()); } } }
/// <summary> /// Handle player state changes. /// Event distance is given in meters. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void RiderStateEventHandler(object sender, RiderStateEventArgs e) { if (!m_started || !m_splits.ShowSplits) { return; } SplitGoal goal = null; if (m_splitGoals != null) { if (m_splitCount >= m_splitGoals.Goals.Count) { return; } // get the in-progress goal goal = m_splitGoals.Goals[m_splitCount]; } DateTime now = DateTime.Now; TimeSpan runningTime = (now - m_startTime); TimeSpan splitTime = (now - m_splitStartTime); if (m_eventCount++ == 0) { // Capture the current distance traveled value to use as an offset to each successive distance value. m_distanceSeedValue = e.Distance; } // Calculate total distance travelled int totalMeters = e.Distance - m_distanceSeedValue; double kmsTravelled = totalMeters / 1000.0; double milesTravelled = kmsTravelled / 1.609; double totalDistance = Math.Round(m_splits.SplitsInKm ? kmsTravelled : milesTravelled, 1); //double averageKph = Math.Round((kmsTravelled / runningTime.TotalSeconds) * 3600, 1); //double averageMph = Math.Round((milesTravelled / runningTime.TotalSeconds) * 3600, 1); // Calculate how deep into the split distance the rider is. int splitMeters = totalMeters - (m_splits.SplitDistanceAsMeters * m_splitCount); double splitKmTravelled = Math.Round(splitMeters / 1000.0, 1); double splitMiTravelled = Math.Round(splitKmTravelled / 1.609, 1); double splitDistance = m_splits.SplitsInKm ? splitKmTravelled : splitMiTravelled; double splitSpeed = Math.Round((splitDistance / splitTime.TotalSeconds) * 3600, 1); //double splitAverageKph = Math.Round((splitKmTravelled / splitTime.TotalSeconds) * 3600, 1); //double splitAverageMph = Math.Round((splitMiTravelled / splitTime.TotalSeconds) * 3600, 1); if (goal != null) { if (splitKmTravelled >= goal.SplitDistanceKm) { // Calculate the deltaTime, positive number is good, negative bad. TimeSpan deltaTime = goal.TotalTime.Subtract(runningTime); // This completes the split. TotalDistance travelled and Delta is included. SplitGoalCompletedEventArgs args = new SplitGoalCompletedEventArgs(m_splitCount + 1, splitTime, splitSpeed, totalDistance, runningTime, m_splits.SplitsInKm, deltaTime); OnSplitGoalCompletedEvent(args); // Reset time and begin next split m_splitStartTime = now; m_splitCount++; m_lastSplitMeters = 0; } else { if (splitMeters - m_lastSplitMeters >= 100) // only raise update event every 100 meters or so { // This is an update to the split in-progress. SplitDistance travelled is included. SplitEventArgs args = new SplitEventArgs(m_splitCount + 1, splitTime, splitSpeed, splitDistance, runningTime, m_splits.SplitsInKm); OnSplitUpdatedEvent(args); m_lastSplitMeters = splitMeters; } } } else { if (splitKmTravelled >= m_splits.SplitDistanceAsKm) { // This completes the split. TotalDistance traveled is included. SplitEventArgs args = new SplitEventArgs(m_splitCount + 1, splitTime, splitSpeed, totalDistance, runningTime, m_splits.SplitsInKm); OnSplitCompletedEvent(args); // Reset time and begin next split m_splitStartTime = now; m_splitCount++; m_lastSplitMeters = 0; } else { if (splitMeters - m_lastSplitMeters >= 100) // only raise update event every 100 meters or so { // This is an update to the split in-progress. SplitDistance traveled is included. SplitEventArgs args = new SplitEventArgs(m_splitCount + 1, splitTime, splitSpeed, splitDistance, runningTime, m_splits.SplitsInKm); OnSplitUpdatedEvent(args); m_lastSplitMeters = splitMeters; } } } }