using System.Collections.Generic; using System.Linq; namespace HeartRateMonitorAndroid.Models { /// /// 心率会话数据,包含一次监测会话的所有数据和统计信息 /// public class HeartRateSessionData { private readonly object _heartRateDataLock = new object(); // 线程安全操作的锁对象 private List _heartRateData = new List(); /// /// 会话开始时间 /// public DateTime SessionStartTime { get; private set; } /// /// 最新心率值 /// public int LatestHeartRate { get; private set; } /// /// 最小心率值 /// public int MinHeartRate { get; private set; } /// /// 最大心率值 /// public int MaxHeartRate { get; private set; } /// /// 平均心率值 /// public double AverageHeartRate { get; private set; } /// /// 获取心率数据点列表的副本 /// public List HeartRateData { get { lock (_heartRateDataLock) { return _heartRateData.ToList(); } } } /// /// 是否有新的心率数据 /// public bool HasNewHeartRateData { get; private set; } /// /// 初始化心率会话数据 /// public HeartRateSessionData() { ResetData(); } /// /// 重置会话数据 /// public void ResetData() { lock (_heartRateDataLock) { _heartRateData.Clear(); LatestHeartRate = 0; MinHeartRate = 0; MaxHeartRate = 0; AverageHeartRate = 0; HasNewHeartRateData = false; } } /// /// 添加新的心率数据点 /// /// 心率值 public void AddHeartRate(int heartRate) { lock (_heartRateDataLock) { // 添加新的数据点 var dataPoint = new HeartRateDataPoint { Timestamp = DateTime.Now, HeartRate = heartRate }; // 如果是第一个数据点,记录会话开始时间 if (_heartRateData.Count == 0) { SessionStartTime = DateTime.Now; } _heartRateData.Add(dataPoint); LatestHeartRate = heartRate; // 限制数据点数量,保留最新的100个点 if (_heartRateData.Count > 100) { _heartRateData.RemoveAt(0); } // 更新统计信息 if (_heartRateData.Count > 0) { MinHeartRate = _heartRateData.Min(p => p.HeartRate); MaxHeartRate = _heartRateData.Max(p => p.HeartRate); AverageHeartRate = _heartRateData.Average(p => p.HeartRate); } HasNewHeartRateData = true; } } /// /// 重置新数据标记 /// public void ResetNewDataFlag() { HasNewHeartRateData = false; } /// /// 获取当前会话的监测时长 /// public TimeSpan GetSessionDuration() { if (_heartRateData.Count == 0) return TimeSpan.Zero; return DateTime.Now - SessionStartTime; } } }