powerfun-unity/Assets/Scenes/Ride/Scripts/DeviceServiceMonoBase.cs

286 lines
9.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
{
var device = (CurrentTrainer as FitDevice);
if (device != null)
{
device.SetTrackResistance(grade);
}
}
#region
public AbstractAntDevice CurrentTrainer
{
get {
var devices = AntConnector.Instance().discoveredDevices.Where(d => d.State == DeviceState.Connected && (d.Sensor == SensorType.Trainer));
if (devices.Count() > 0)
{
_device = devices.OrderByDescending(d => d.Sensor == SensorType.Trainer).First();
var RiderWeight = (_device as IRequiresRiderWeight).RiderWeight;
if (RiderWeight == 0)
{
(_device as IRequiresRiderWeight).RiderWeight = App.CurrentUser.Weight;
}
ManufacturerId = _device.ManufacturerId;
DeviceNumber = $"{ _device.DeviceNumber },{ _device.DeviceType }";
AntModelId = _device.AntModelId;
}
return _device;
}
}
/// <summary>
/// 更新速度(KM/H)
///
/// </summary>
public double UpDateSpeed()
{
return SpeedDevice == null ? 0 : SpeedDevice.Speed;
}
/// <summary>
/// 更新心率
/// </summary>
/// <param name="heart"></param>
public int? UpDateHeart()
{
if (HeartDevice != null)
{
return HeartDevice.HeartRate;
}
else
{
return null;
}
}
/// <summary>
/// 更新功率
/// </summary>
public double UpdatePower()
{
return PowerDevice == null ? 0 : PowerDevice.Power;
}
/// <summary>
/// 更新踏频
/// </summary>
/// <param name="cadence"></param>
public int UpdateCadence()
{
return CadenceDevice == null ? 0 : CadenceDevice.Cadence;
}
/// <summary>
/// 更新距离(KM)
/// </summary>
/// <param name="distance"></param>
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<string, string> _routeDataCache = new Dictionary<string, string>();
#endregion
#region
//用户骑行界面非正常关闭(不清楚有哪些非正常),资源没有释放,导致定时器仍在运作。
public static bool baseExit { get; set; } = false;
#endregion
public bool CheckAnt()
{
_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 = 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;
}
}
/// <summary>
/// 心率设备
/// </summary>
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;
}
}
/// <summary>
/// 功率设备
/// </summary>
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;
}
}
/// <summary>
/// 踏频设备
/// </summary>
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
///// <summary>
///// 设置骑行模式和骑行数据
///// </summary>
///// <param name="model">0自由骑2阻力模式3轨道模式</param>
///// <param name="data"></param>
//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
}
}