using Assets.Scripts.Devices.Ant; using Assets.Scripts.Devices.Ant.Interfaces; using System; using System.Collections.Generic; using System.Linq; using UnityEngine; namespace Assets.Scenes.Ride.Scripts { public class DeviceServiceMonoBase: MonoBehaviour { public void TrackResistance(double grade) { if (grade > 10) { grade = 10; } if (grade <-10 ) { grade = -10; } var device = (_device as FitDevice); if (device != null) { device.SetTrackResistance(grade); } } #region 获取设备数据 /// /// 更新速度(KM/H) /// /// public double UpDateSpeed() { return SpeedDevice == null ? 0 : SpeedDevice.Speed; } /// /// 更新心率 /// /// public int? UpDateHeart() { if (HeartDevice != null) { return HeartDevice.HeartRate; } else { return null; } } /// /// 更新功率 /// public double UpdatePower() { return PowerDevice == null ? 0 : PowerDevice.Power; } /// /// 更新踏频 /// /// public int UpdateCadence() { return CadenceDevice == null ? 0 : CadenceDevice.Cadence; } /// /// 更新距离(KM) /// /// public double UpdateDistance(double speed) { return Math.Round(speed / 3600, 5,MidpointRounding.AwayFromZero); } #endregion #region 设备接口 #region field protected AbstractAntDevice _device; protected AntConnector _antConnector; public int ManufacturerId { get; private set; } public string DeviceNumber { get; private set; } public int? AntModelId { get; private set; } private readonly static System.Collections.Generic.Dictionary _routeDataCache = new Dictionary(); #endregion #region 事件 //用户骑行界面非正常关闭(不清楚有哪些非正常),资源没有释放,导致定时器仍在运作。 public static bool baseExit { get; set; } = false; #endregion public bool CheckAnt() { //TODO //if (!ConfigHelper.IsNeedContectedToDevice) //{ // return true; //} _antConnector = AntConnector.Instance(); var devices = _antConnector.discoveredDevices.Where(d => d.State == DeviceState.Connected && (d.Sensor == SensorType.Trainer || d.Sensor == SensorType.Power)); if (devices.Count() > 0) { _device = devices.OrderByDescending(d => d.Sensor == SensorType.Trainer).First(); if (_device != null && _device is IRequiresRiderWeight) { (_device as IRequiresRiderWeight).RiderWeight = 65;//TODO:App.CurrentUser.Weight; } ManufacturerId = _device.ManufacturerId; DeviceNumber = $"{ _device.DeviceNumber },{ _device.DeviceType }"; AntModelId = _device.AntModelId; } else { return false; } //if (App.CurrentUser.FTP <= 0) //{ // return false; //} if (_device == null) { return false; } return true; } //设备列表 ///速率设备 protected ISpeedDevice SpeedDevice { get { //速度和踏频一体的传感器,里面的速度是不可以读的,只允许读 踏频,切记 if (_antConnector == null) { return null; } var device = _antConnector.discoveredDevices.Where(d => d.State == DeviceState.Connected && d is ISpeedDevice).FirstOrDefault(); if (device != null) { return (ISpeedDevice)device; } return null; } } /// /// 心率设备 /// protected IHeartRateDevice HeartDevice { get { if (_antConnector == null) { return null; } var device = _antConnector.discoveredDevices.Where(d => d.State == DeviceState.Connected && d is IHeartRateDevice).FirstOrDefault(); if (device != null) { return (IHeartRateDevice)device; } return null; } } /// /// 功率设备 /// protected IPowerDevice PowerDevice { get { if (_antConnector == null) { return null; } var powerDevices = _antConnector.discoveredDevices.Where(d => d.State == DeviceState.Connected && d is IPowerDevice).ToList(); var power = powerDevices.FirstOrDefault(d => d.Sensor == SensorType.Power); if (power != null) { return (IPowerDevice)power; } if (powerDevices.Any()) { return (IPowerDevice)powerDevices.FirstOrDefault(); } return null; } } /// /// 踏频设备 /// protected ICadenceDevice CadenceDevice { get { if (_antConnector == null) { return null; } var cadences = _antConnector.discoveredDevices.Where(d => d.State == DeviceState.Connected && d is ICadenceDevice).ToList(); var cadence = cadences.FirstOrDefault(d => d.Sensor == SensorType.Cadence); if (cadence != null) { return (ICadenceDevice)cadence; } var spdCad = cadences.FirstOrDefault(d => d.Sensor == SensorType.SpeedCadence); if (spdCad != null) { return (ICadenceDevice)spdCad; } if (cadences.Any()) { return (ICadenceDevice)cadences.FirstOrDefault(); } return null; } } #endregion #region 设备交互 ///// ///// 设置骑行模式和骑行数据 ///// ///// 0自由骑,2阻力模式,3轨道模式 ///// //public void SetCyClingModelData(string model, double data) //{ // if (recorderData == null) // { // return; // } // switch (model) // { // case "0": // recorderData.SendDataMode = SendDataMode.Freedom; // SeedFecWindResistance(); // break; // case "1": // break; // case "2": // recorderData.SendDataMode = SendDataMode.Resistance; // SeedFecResistance(data); // //{ // // recorderData.SlopeGrade = data; // // TrackResistance(data); // //} // break; // case "3": // recorderData.SendDataMode = SendDataMode.Track; // int index = Route.GetStepIndex(recorderData.EndDistance); // double grade = Route.GetPatchByIndex(index, false, recorderData.EndDistance); // recorderData.SlopeGrade = grade; // var grade1 = this._sensitivity / 100D * grade; // //Trace.WriteLine("给设备发的坡度:"+grade, nameof(MapboxController)); // TrackResistance(grade1); // break; // default: // break; // } //} #endregion } }