149 lines
5.1 KiB
C#
149 lines
5.1 KiB
C#
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<TargetData> RiderDatas = new List<TargetData>();
|
|
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<string>();
|
|
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
|
|
}
|
|
} |