using UnityEngine; using Assets.Scripts.Apis.Models; using System; using Assets.Scripts.Apis; using System.Linq; using System.Collections.Generic; using System.Globalization; using Assets.Scenes.Ride.Scripts.Model; using System.IO; namespace Assets.Scenes.Ride.Scripts { public class PlayerController : AbstractPlayer { #region 骑行逻辑 public List RiderDatas = new List(); protected override void Init() { base.Init(); } protected override void Compute() { //计算数据 power = 2000;//功率 speed = Helper.CalculateSpeed(elevation, currentSlope, power, weight, bicycleWeight); distance = Math.Round(speed / 3600, 6); totalDistance += distance; //记录骑行数据 var recordText = string.Format($"{ ticks },{ power.ToString(CultureInfo.InvariantCulture) },{ speed.ToString(CultureInfo.InvariantCulture) },{ Math.Round(totalDistance, 6).ToString(CultureInfo.InvariantCulture) },{ cadance.ToString(CultureInfo.InvariantCulture) },{ heartRate.ToString(CultureInfo.InvariantCulture) },{ Math.Round(nextlatlong.x, 6).ToString(CultureInfo.InvariantCulture) },{ Math.Round(nextlatlong.y, 6).ToString(CultureInfo.InvariantCulture) }"); Debug.Log(recordText); RiderDatas.Add(new TargetData { Ticks = ticks, _Power = power, _Speed = speed, _Distance = totalDistance, _Cadence = cadance, _HeartRate = heartRate, _Lat = nextlatlong.x, _Lon = nextlatlong.y }); } //上传数据 protected override void Upload() { } #region 保存骑行数据 准备迁移 private string ContinueMark = "TODO"; private int ContinueIndex=0; private int Competitionid =0; private bool IsNeedRanking = true; private double CurrentRouteStartDistance = 0; private int ManufacturerId=0; private int AntModelId =0 ; private CyclingModel cyclingModel = CyclingModel.Single; private DateTime EndTime; void Complete() { EndTime = startTime.AddSeconds(ticks); MapInterruptRecordApi api = new MapInterruptRecordApi(); string newFileName = Guid.NewGuid().ToString(); int FTP = Helper.GetFtp(); double NP = Helper.GetNP(RiderDatas); //强度 double IF = NP / FTP; //训练量 double TSS = (RiderDatas.Count * NP * IF) / (FTP * 3600) * 100; var recordId = Guid.NewGuid().ToString(); var averagePower = Helper.AveragePower(RiderDatas); var interruptRecord = new MapInterruptRecord { Id = recordId, RouteId = 1, RouteName = "", TotalDistance = mapData.TotalDistance, UserId = userId, RecordFileName = newFileName + ".txt", Ftp = FTP,//FTP设置 IF = Math.Round(IF, 2), Kj = RiderDatas.Sum(a => a._Power) / 1000,//消耗 Tss = Math.Round(TSS, 2), EndDistance = totalDistance, IsCompleted = totalDistance >= mapData.TotalDistance, NormalizedPower = Math.Floor(NP),//标准化功率 AveragePower = averagePower,//平均功率 MaxPower = RiderDatas.Max(a => a._Power),//最大功率 WeightKg = Math.Round(averagePower / weight, 2), Weight = weight, BicycleWeight = bicycleWeight, ContinueMark = ContinueMark, ContinueIndex = ContinueIndex, IsDelete = false, MapCompetitionId = Competitionid, ManufacturerName = "TODO", DeviceNumber = "TODO", IsRanking = IsNeedRanking, CurrentRouteStartDistance = CurrentRouteStartDistance, ManufacturerId = ManufacturerId, AntModelId = AntModelId, StartTime = startTime, CreateTime = EndTime, Ticks = RiderDatas.Last().Ticks, Mode = cyclingModel.ToString(), //Param = Newtonsoft.Json.JsonConvert.SerializeObject(selectParam), //GlobalCyclingId = selectParam.GlobalCyclingId }; interruptRecord.SpeedRange = null; double process = Math.Round((totalDistance - interruptRecord.CurrentRouteStartDistance) /mapData.TotalDistance, 2); interruptRecord.Progress = process > 1 ? 1 : process; var cadences = RiderDatas.Where(a => a._Cadence.HasValue && a._Cadence.Value > 0); if (cadences.Any()) { interruptRecord.AverageCadence = Math.Round(cadences.Average(a => a._Cadence.GetValueOrDefault(0))); } interruptRecord.MaxCadence = Math.Round(RiderDatas.Max(a => a._Cadence.GetValueOrDefault(0))); interruptRecord.AverageHeartRate = Math.Round(RiderDatas.Average(a => a._HeartRate.GetValueOrDefault(0))); interruptRecord.MaxHeartRate = RiderDatas.Max(a => a._HeartRate.GetValueOrDefault(0)); var path = Helper.GetDataDire("MapWorkoutRecords"); var fname = path + "/" + newFileName + ".txt"; var files = new List(); using (var fs = new FileInfo(fname).OpenWrite()) { var stream = new StreamWriter(fs); stream.BaseStream.Seek(0, SeekOrigin.End); foreach (var item in RiderDatas) { stream.Write(item.Write() + "\r\n"); } stream.Flush(); stream.Close(); files.Add(fname); } var result = api.Add(interruptRecord, files); } #endregion #endregion } }