using Assets.Scripts.Ble;
using Assets.Scripts.Devices;
using Assets.Scripts.Devices.Ant;
using Assets.Scripts.Devices.Ant.Interfaces;
using Assets.Scripts.Devices.Ble;
using Assets.Scripts.Scenes;
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace Assets.Scenes.Ride.Scripts
{
public class DeviceServiceMonoBase: BaseScene
{
public void TrackResistance(double grade)
{
var device = (CurrentTrainer as ITrainerDevice);
if (device != null)
{
device.SetTrackResistance(grade);
}
}
#region 获取设备数据
public AbstractDevice CurrentTrainer
{
get {
var devices = App.MainDeviceAdapter.GetDevices().Where(d => d.State == DeviceState.Connected && (d.Sensor == SensorType.Trainer));
_device = null;//重置设备状态
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;
}
if (_device.Network == NetworkType.ANT)
{
var antDevice = _device as AbstractAntDevice;
ManufacturerId = antDevice.ManufacturerId;
AntModelId = antDevice.AntModelId;
DeviceNumber = $"{ antDevice.DeviceNumber },{ antDevice.DeviceType}";
}
else
{
var bleDevice = _device as BleDevice;
DeviceNumber = $"{ Helper.FormateMacAddress(bleDevice.Address) },{ ServiceUuids.GetBySensor(bleDevice.Sensor) }";
ManufacturerName = bleDevice.Name + "," + bleDevice.Network + "," + bleDevice.Sensor;
}
}
return _device;
}
}
///
/// 更新速度(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()
{
var t = PowerDevice == null ? 0 : PowerDevice.Power;
return t;
}
///
/// 更新踏频
///
///
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 AbstractDevice _device;
protected AntConnector _antConnector;
public int? ManufacturerId { get; private set; }
public string ManufacturerName { 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()
{
//_antConnector = AntConnector.Instance();
var devices = App.MainDeviceAdapter.GetDevices().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;
}
if (_device.Network == NetworkType.ANT)
{
var antDevice = _device as AbstractAntDevice;
ManufacturerId = antDevice.ManufacturerId;
AntModelId = antDevice.AntModelId;
DeviceNumber = $"{ antDevice.DeviceNumber },{ antDevice.DeviceType}";
}
else
{
var bleDevice =_device as BleDevice;
DeviceNumber = $"{ bleDevice.Address },{ bleDevice.Sensor }";
ManufacturerName = bleDevice.Name + " " + bleDevice.Network + " " + bleDevice.Sensor;
}
}
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 = App.MainDeviceAdapter.GetDevices().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 = App.MainDeviceAdapter.GetDevices().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 = App.MainDeviceAdapter.GetDevices().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 = App.MainDeviceAdapter.GetDevices().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
}
}