using Assets.Scripts.Ble; using Assets.Scripts.Devices.Ble.Interfaces; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using UnityEngine; namespace Assets.Scripts.Devices.Ble.Characteristic { public class C2RowerData : ICharacteristic, IRowerCommonData { public Guid Uuid => ServiceUuids.Characteristics.C2RowerData35; public Guid ServiceUuid => ServiceUuids.Characteristics.C2Service; public bool IsOptional => false; public static event EventHandler EnableChanged; public static event EventHandler RowerTypeChanged; private static bool _isEnabled; public static bool IsEnabled { get => _isEnabled; set { _isEnabled = value; if (EnableChanged != null) { EnableChanged(_isEnabled, null); } } } //0.1 lbs of force, max=6553.5m 单位0.1磅 public double PeakDriveForce { get; set; } public double AverageDriveForce { get; set; } public event EventHandler PullChanged; private ushort _pullValue; public ushort PullValue { get { return _pullValue; } set { _pullValue = value; if (this.PullChanged != null) { this.PullChanged(this, null); } } } public static bool isReadyStatus { get; private set; } public static RowerTaskPanel.RowerType rowerType = new RowerTaskPanel.RowerType() { type = 0 ,value = 0}; public void HandleAttributeReceived(byte[] data) { if (data[0] == 0x35) { PeakDriveForce = LbsToNewton(Convert.ToDouble(BitConvertHelper.ToUInt16(data, 13)) / 10, true); AverageDriveForce = LbsToNewton(Convert.ToDouble(BitConvertHelper.ToUInt16(data, 15)) / 10, true); StrokeCount = BitConvertHelper.ToUInt16(data, 19); } else if (data[0] == 0x3d) { if (data[2] == 0) { PullValue = 0; } //老款表头不支持 //List r = new List(); for (int i = 3; i < data.Length; i += 2) { ushort pull = Convert.ToUInt16(Math.Round(LbsToNewton(data[i], true))); //r.Add(pull); PullValue = pull; } // Debug.Log("拉力曲线:" + string.Join(",", r)); } else if (data[0] == 0x31) { ElapsedTime = (int)(Convert.ToDouble(BitConvertHelper.ToUInt24(data, 1)) / 100); TotalDistance = (uint)(Convert.ToDouble(BitConvertHelper.ToUInt24(data, 4)) / 10); int status = (int)data[7]; int value = (data[17] << 16) + (data[16] << 8) + data[15]; int type = 0; //3 里程 5 时间 1直接划船 if (status == 3) { type = 1; } if (status == 5) { type = 2; value /= 100; } //如果课程发生变化 if (status != 0 && type > 0 && ( rowerType.type != type || rowerType.value != value)) { Debug.Log($"status{status}-type{type}-value{value}"); rowerType.type = type; rowerType.value = value; RowerTypeChanged?.Invoke(this,null); } var time = ((data[3] << 16) + (data[2] << 8) + data[1]) / 100; Debug.Log("划船时间" + time); isReadyStatus = data[9] == 0; var hasChanged = data[19] != ResistanceLevel; ResistanceLevel = data[19]; if (RowerResChanged != null && hasChanged) { RowerResChanged.Invoke(this, null); } //isReadyStatus = data[2] == 1 || data[2] == 129; } else if (data[0] == 0x32) { InstantaneousPace = (ushort)(Convert.ToDouble(BitConvertHelper.ToUInt16(data, 8)) / 100); AveragePace = (ushort)(Convert.ToDouble(BitConvertHelper.ToUInt16(data, 10)) / 100); //AveragePower = BitConvertHelper.ToUInt16(data, 17); StrokeRate = (uint)data[6]; } else if (data[0] == 0x33) { TotalEnergy = BitConvertHelper.ToUInt16(data, 7); AveragePower = BitConvertHelper.ToUInt16(data, 5); } else if (data[0] == 0x36) { InstantaneousPower = BitConvertHelper.ToUInt16(data, 4); //TotalEnergy = BitConvertHelper.ToUInt16(data, 6); } else if (data[0] == 0x39) { TrainingTime = (Convert.ToDouble(BitConvertHelper.ToUInt24(data, 5)) / 100); ElapsedTime = (int)TrainingTime; TotalDistance = (uint)(Convert.ToDouble(BitConvertHelper.ToUInt24(data, 8)) / 10); CompleteEvent?.Invoke(this, null); } Debug.Log("数据" + string.Join(",", data) + $" | {ElapsedTime}-{TotalDistance}"); //else if (data[0] == 34) //{ // isReadyStatus = data[2] == 1 || data[2] == 129; //} } public event EventHandler StartEvent; public event EventHandler CompleteEvent; private double LbsToNewton(double lbs,bool isKg = false) => 4.4482216 * lbs * (isKg ? (1f / 9.8f) : 1f); public void SetUnavailable() { //throw new NotImplementedException(); } /// /// 划桨频率 /// public uint StrokeRate { get; set; } = 0; /// /// 划桨次数 /// public UInt16 StrokeCount { get; set; } = 0; /// /// 平均划桨频率 /// public int AverageStrokeRate { get; set; } = 0; private UInt32 _totalDistance = 1; public UInt32 TotalDistance { get => _totalDistance; set { if (_totalDistance == 0 && value != 0 && StartEvent != null) { StartEvent.Invoke(this, null); } _totalDistance = value; } } //private UInt16 _instantaneousPace = 0; /// /// 即时配速 /// public UInt16 InstantaneousPace { get; set; } = 0; /// /// 平均配速 /// public UInt16 AveragePace { get; set; } = 0; public int InstantaneousPower { get; set; } = 0; public int AveragePower { get; set; } = 0; public int ElapsedTime { get; set; } = 0; public double TrainingTime { get; set; } = 0; public int TotalEnergy { get; set; } = 0; public int EnergyPerHour { get; set; } = 0; public int EnergyPerMinute { get; set; } = 0; public event EventHandler RowerResChanged; public int ResistanceLevel { get; set; } = 0; public void Reset() { this.StrokeRate = 0; this.StrokeCount = 0; this.AverageStrokeRate = 0; this.TotalDistance = 0; this.InstantaneousPace = 0; this.AveragePace = 0; this.InstantaneousPower = 0; this.AveragePower = 0; this.ResistanceLevel = 0; this.TotalEnergy = 0; this.EnergyPerHour = 0; this.EnergyPerMinute = 0; this.ElapsedTime = 0; this.TrainingTime = 0; } } }