1401 lines
53 KiB
C#
Raw Normal View History

2021-09-23 18:14:53 +08:00
using Assets.Scenes.Ride.Scripts;
using Assets.Scripts;
using Assets.Scripts.Apis.Models;
2021-09-30 09:06:35 +08:00
using Assets.Scripts.Ble.Service;
using Assets.Scripts.Devices;
2021-09-23 18:14:53 +08:00
using Assets.Scripts.Devices.Ant;
using Assets.Scripts.Devices.Ant.Interfaces;
using Assets.Scripts.Devices.Ble;
using Assets.Scripts.Devices.Ble.Characteristic;
using Assets.Scripts.Devices.Ble.Devices;
using Assets.Scripts.Devices.Ble.Interfaces;
2021-09-23 18:14:53 +08:00
using ChartAndGraph;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using UnityEngine;
2022-06-14 18:37:58 +08:00
using UnityEngine.Android;
2021-09-23 18:14:53 +08:00
using UnityEngine.UI;
using static RowerTaskPanel;
2021-09-23 18:14:53 +08:00
public class RowerHomeScript : PFUIPanel
{
2022-06-08 13:05:56 +08:00
private class TempRowerCalc
2021-09-23 18:14:53 +08:00
{
public int power { get; set; }
public ushort pace { get; set; }
public uint rate { get; set; }
public int heartRate { get; set; }
public int energy { get; set; }
public int distance { get; set; }
public int strokeCount { get; set; }
2021-09-23 18:14:53 +08:00
}
/// <summary>
/// 划船机数据
/// </summary>
2022-05-11 17:11:48 +08:00
private IRowerCommonData RowerData
2021-09-23 18:14:53 +08:00
{
get
{
2022-06-01 09:54:20 +08:00
return Rower != null ? (C2RowerData.IsEnabled == true ? (IRowerCommonData)(Rower.c2RowerData) : (IRowerCommonData)(Rower.rowerData)) : null;
2022-05-11 17:11:48 +08:00
//var device = App.MainDeviceAdapter.GetDevices().FirstOrDefault(d => (d.State == DeviceState.Connected) && d.Sensor == SensorType.Rower);
//if (device != null)
//{
// return ((IRowerDevice)device).rowerData;
//}
//return null;
2021-09-23 18:14:53 +08:00
}
}
2021-09-30 09:06:35 +08:00
protected override void OnDestroy()
{
Debug.Log("銷毀");
2022-06-08 13:05:56 +08:00
if (RowerData != null)
2022-03-31 18:30:07 +08:00
{
2022-05-11 17:11:48 +08:00
RowerData.PullChanged -= PaintPullCurve;
RowerData.StartEvent -= StartFunc;
RowerData.RowerResChanged -= ResChanged;
2022-03-31 18:30:07 +08:00
}
C2RowerData.EnableChanged -= ModeChanged;
2021-09-30 09:06:35 +08:00
}
2022-06-08 13:05:56 +08:00
private IRowerDevice Rower
{
get
{
2022-06-08 13:05:56 +08:00
var device = App.MainDeviceAdapter.GetDevices().FirstOrDefault(d => d.State == DeviceState.Connected && d.Sensor == SensorType.Rower);
if (device != null)
{
return (IRowerDevice)device;
}
return null;
}
}
2021-09-23 18:14:53 +08:00
/// <summary>
/// 心率数据
/// </summary>
2022-06-08 13:05:56 +08:00
private int? HeartRate
2021-09-23 18:14:53 +08:00
{
2022-06-08 13:05:56 +08:00
get
2021-09-23 18:14:53 +08:00
{
var device = App.MainDeviceAdapter.GetDevices().FirstOrDefault(d => (d.State == DeviceState.Connected || d.State == DeviceState.Connecting) && d.Sensor == SensorType.HeartRate);
if (device != null)
{
return ((IHeartRateDevice)device).HeartRate;
}
return null;
}
}
GameObject btnStart;
2022-06-08 13:05:56 +08:00
Transform left, bottom, mid, rmydata;
Image leftImage;
Image rightImage;
float timer = 0f;
2022-05-11 17:11:48 +08:00
List<DoubleVector2> pullList, historyPullList;
2022-06-08 13:05:56 +08:00
public Dictionary<object, Sprite> spriteDict, spriteDict2;
2021-09-23 18:14:53 +08:00
List<string> records;
List<TempRowerCalc> values;
2022-04-29 18:32:04 +08:00
DateTime startTime;
DateTime? createTime;
2021-09-23 18:14:53 +08:00
double Kj = 0;
2021-09-28 17:51:58 +08:00
int seconds = 0;
bool isPause = false;
public RowerType rowerType = null;
2021-10-21 18:04:01 +08:00
/// <summary>
/// 计算停止的秒数如果超过5秒除了累加值都变成--这些值记录为0提示用户如果超过90秒将直接保存数据
/// 如果5-90秒有拉力则继续滑行
/// 如果超过90秒都没有拉力则直接保存
/// </summary>
int stopSeconds = 0;
uint totalDistance = 0;
Transform slider;
2022-06-01 16:10:42 +08:00
RowerGraphChartFeed rowerGraphChartFeed { get; set; }
RowerGraphChartFeed graphChartFeed { get; set; }
2022-02-10 12:57:43 +08:00
protected override void Start()
{
var rect = transform.GetComponent<RectTransform>();
rect.offsetMax = Vector2.zero;
rect.offsetMin = Vector2.zero;
2022-06-01 16:10:42 +08:00
rowerGraphChartFeed = mid.Find("GraphChart").GetComponent<RowerGraphChartFeed>();
graphChartFeed = transform.Find("Rower/Modes/Scroll/M2/MyData/GraphChart").GetComponent<RowerGraphChartFeed>();
2022-02-10 12:57:43 +08:00
}
2022-06-01 16:10:42 +08:00
Transform M1 { get; set; }
2021-09-23 18:14:53 +08:00
protected override void Awake()
{
2022-05-31 16:47:21 +08:00
Id = Guid.NewGuid().ToString();
2022-06-01 09:54:20 +08:00
rowerType = new RowerType() { type = 1, value = 500 };
2022-06-08 13:05:56 +08:00
2021-09-23 18:14:53 +08:00
spriteDict = new Dictionary<object, Sprite>()
{
{"Start",Resources.Load<Sprite>("Images/RowerNew/ICON_continue_44") },
{"Untagged",Resources.Load<Sprite>("Images/RowerNew/ICON_pause_44")},
2021-09-23 18:14:53 +08:00
{0,Resources.Load<Sprite>("Images/Rower/序列帧/划船机0001") },
{1,Resources.Load<Sprite>("Images/Rower/序列帧/划船机0002") },
{2,Resources.Load<Sprite>("Images/Rower/序列帧/划船机0003") },
{3,Resources.Load<Sprite>("Images/Rower/序列帧/划船机0004") },
{4,Resources.Load<Sprite>("Images/Rower/序列帧/划船机0005") },
{5,Resources.Load<Sprite>("Images/Rower/序列帧/划船机0006") },
{6,Resources.Load<Sprite>("Images/Rower/序列帧/划船机0007") },
{7,Resources.Load<Sprite>("Images/Rower/序列帧/划船机0008") },
{8,Resources.Load<Sprite>("Images/Rower/序列帧/划船机0009") },
{9,Resources.Load<Sprite>("Images/Rower/序列帧/划船机0010") },
{10,Resources.Load<Sprite>("Images/Rower/序列帧/划船机0011") },
{11,Resources.Load<Sprite>("Images/Rower/序列帧/划船机0012") },
{12,Resources.Load<Sprite>("Images/Rower/序列帧/划船机0013") },
{13,Resources.Load<Sprite>("Images/Rower/序列帧/划船机0014") },
{14,Resources.Load<Sprite>("Images/Rower/序列帧/划船机0015") },
};
2022-04-19 18:09:29 +08:00
spriteDict2 = new Dictionary<object, Sprite>()
{
{0,Resources.Load<Sprite>("Images/RowerNew/序列帧/划船机0001") },
{1,Resources.Load<Sprite>("Images/RowerNew/序列帧/划船机0002") },
{2,Resources.Load<Sprite>("Images/RowerNew/序列帧/划船机0003") },
{3,Resources.Load<Sprite>("Images/RowerNew/序列帧/划船机0004") },
{4,Resources.Load<Sprite>("Images/RowerNew/序列帧/划船机0005") },
{5,Resources.Load<Sprite>("Images/RowerNew/序列帧/划船机0006") },
{6,Resources.Load<Sprite>("Images/RowerNew/序列帧/划船机0007") },
{7,Resources.Load<Sprite>("Images/RowerNew/序列帧/划船机0008") },
{8,Resources.Load<Sprite>("Images/RowerNew/序列帧/划船机0009") },
{9,Resources.Load<Sprite>("Images/RowerNew/序列帧/划船机0010") },
{10,Resources.Load<Sprite>("Images/RowerNew/序列帧/划船机0011") },
{11,Resources.Load<Sprite>("Images/RowerNew/序列帧/划船机0012") },
{12,Resources.Load<Sprite>("Images/RowerNew/序列帧/划船机0013") },
{13,Resources.Load<Sprite>("Images/RowerNew/序列帧/划船机0014") },
{14,Resources.Load<Sprite>("Images/RowerNew/序列帧/划船机0015") },
};
2022-06-01 16:10:42 +08:00
rowerMultiModeScript = GetComponent<RowerMultiModeScript>();
2021-09-23 18:14:53 +08:00
GetComponent<RectTransform>().localScale = Vector3.one;
GetComponent<RectTransform>().localPosition = Vector3.zero;
2022-05-11 17:11:48 +08:00
records = new List<string>();
values = new List<TempRowerCalc>();
pullList = new List<DoubleVector2>();
historyPullList = new List<DoubleVector2>();
//mainNav.ShowExit();
2022-06-01 16:10:42 +08:00
M1 = transform.Find("Rower/Modes/Scroll/M1");
left = transform.Find("Rower/Modes/Scroll/M1/Left");
bottom = transform.Find("Rower/Bottom");
2022-06-01 16:10:42 +08:00
KMText = bottom.Find("KM/Value").GetComponent<Text>();
TimeText = bottom.Find("Time/Value").GetComponent<Text>();
BPMText = bottom.Find("BPM/Value").GetComponent<Text>();
mid = transform.Find("Rower/Modes/Scroll/M1/Mid");
2022-05-09 13:18:14 +08:00
rmydata = transform.Find("Rower/Modes/Scroll/M2/MyData");
slider = transform.Find("ResBar/PFUISlider");
2022-06-01 16:10:42 +08:00
WText = mid.Find("W/Value").GetComponent<Text>();
rmyWText = rmydata.Find("W/Value").GetComponent<Text>();
FiveText = bottom.Find("500/Value").GetComponent<Text>();
MSText = bottom.Find("MS/Value").GetComponent<Text>();
ExpectedText = bottom.Find("Expected/Value").GetComponent<Text>();
TimesText = left.Find("Times/Value").GetComponent<Text>();
Caloriestext = left.Find("Calories/Value").GetComponent<Text>();
rmyCaloriestext = rmydata.Find("Calories/Value").GetComponent<Text>();
AvgForceText = mid.Find("AvgForce/Value").GetComponent<Text>();
rmyAvgForceText = rmydata.Find("AvgForce/Value").GetComponent<Text>();
PeakForceText = mid.Find("PeakForce/Value").GetComponent<Text>();
rmyPeakForceText = rmydata.Find("PeakForce/Value").GetComponent<Text>();
UIManager.AddEvent(transform.Find("ResBar/BtnAdd").gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, b =>
{
2022-06-08 13:05:56 +08:00
if (RowerData != null)
{
slider.GetComponent<PFUISlider>().SetValue((RowerData.ResistanceLevel + 1 - 50) / 300f);
}
2022-06-08 13:05:56 +08:00
});
UIManager.AddEvent(transform.Find("ResBar/BtnSub").gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, b =>
{
2022-06-08 13:05:56 +08:00
if (RowerData != null)
{
slider.GetComponent<PFUISlider>().SetValue((RowerData.ResistanceLevel - 1 - 50) / 300f);
}
2022-06-08 13:05:56 +08:00
});
slider.GetComponent<PFUISlider>().valueHandler = (a) => 50 + a * 300;
slider.GetComponent<PFUISlider>().SetValueChanged(r =>
{
var v = (ushort)Math.Round((r * 300));
print("设置阻力" + v);
2022-06-14 18:37:58 +08:00
StartCoroutine(SetResistanceLevel(v));
2022-02-10 12:57:43 +08:00
});
//transform.Find("Ready/DeviceStatus").gameObject.SetActive(!flag);
//transform.Find("Ready/DeviceStatusConnect").gameObject.SetActive(flag);
UIManager.AddEvent(transform.Find("Ready/DeviceStatus").gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, b =>
{
if (checkRowing()) return;
UIManager.ShowRowerDevicePanel();
});
UIManager.AddEvent(transform.Find("Ready/DeviceStatusConnect").gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, b =>
{
if (checkRowing()) return;
UIManager.ShowRowerDevicePanel();
});
2022-06-06 18:40:31 +08:00
UIManager.AddEvent(transform.Find("Stopped/DeviceStatus").gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, b =>
{
2022-06-08 13:05:56 +08:00
//if (checkRowing()) return;
2022-06-06 18:40:31 +08:00
UIManager.ShowRowerDevicePanel();
});
UIManager.AddEvent(transform.Find("Stopped/DeviceStatusConnect").gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, b =>
{
2022-06-08 13:05:56 +08:00
//if (checkRowing()) return;
2022-06-06 18:40:31 +08:00
UIManager.ShowRowerDevicePanel();
});
//手机版tab
#if UNITY_ANDROID || UNITY_IOS
var nav = transform.Find("MainNav-mobile").GetComponent<NewMainNav>();
var c1 = new NewMainNav.CustomButton(Resources.Load<Sprite>("Images/RowerNew/ICON_create_44"), () =>
{
2022-06-06 18:40:31 +08:00
//UIManager.ShowRowerWelldone("31C5A37D-6ADD-4EE1-B6DA-5AA2F9949C4B", Init);
2022-04-19 18:09:29 +08:00
//return;
2022-06-06 18:40:31 +08:00
2022-05-31 16:51:07 +08:00
//UIManager.ShowRowerWelldone("C0F81E83-120B-4A2C-AD0E-8BC1B8EB3E74", Init);
//return;
if (checkRowing()) return;
2022-03-30 18:25:51 +08:00
if (C2RowerData.IsEnabled == true && C2RowerData.rowerType != null) return;
2022-06-08 13:05:56 +08:00
UIManager.ShowRowerTaskPanel(type =>
{
rowerType = type;
HandleSelectType();
2022-06-08 13:05:56 +08:00
}, rowerType);
}, false);
2022-06-08 13:05:56 +08:00
var c2 = new NewMainNav.CustomButton(Resources.Load<Sprite>("Images/RowerNew/记录"), () =>
{
2022-06-02 15:52:10 +08:00
if (checkRowing()) return;
2022-05-31 16:51:07 +08:00
UIManager.ShowResultListPanel();
}, false);
2022-05-31 16:51:07 +08:00
btnStart = transform.Find("MainNav-mobile/Custom2").gameObject;
//var c3 = new NewMainNav.CustomButton(Resources.Load<Sprite>("Images/RowerNew/ICON_mode_44"), () =>
//{
// ReturnHome();
//}, false);
2022-05-09 13:18:14 +08:00
//隐藏骑行
2022-05-31 16:51:07 +08:00
nav.SetButtonActive(new List<int> { 3, 7 }, null, c1, null, c2, false);
newNav = nav;
#endif
UIManager.AddEvent(transform.Find("Stopped/Confirm/BtnSave").gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, b =>
{
transform.Find("Stopped").gameObject.SetActive(false);
HandleSaveDirect();
});
UIManager.AddEvent(transform.Find("Stopped/Confirm/BtnDrop").gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, b =>
{
2022-03-31 18:30:07 +08:00
Discard();
});
2022-06-08 13:05:56 +08:00
if (RowerData != null)
2022-03-31 18:30:07 +08:00
{
2022-05-11 17:11:48 +08:00
RowerData.PullChanged -= PaintPullCurve;
RowerData.PullChanged += PaintPullCurve;
RowerData.StartEvent -= StartFunc;
RowerData.StartEvent += StartFunc;
2022-03-31 18:30:07 +08:00
}
2022-05-31 16:51:07 +08:00
rowerType = new RowerType { type = 1, value = 500 };
HandleSelectType();
Init();
2022-06-06 18:40:31 +08:00
isFirstReset = false;
}
2022-06-14 18:37:58 +08:00
IEnumerator SetResistanceLevel(ushort res)
{
yield return new WaitForSeconds(0.1f);
if (Rower != null)
{
Rower.SetResistanceLevel(res);
}
}
RowerResultModel reRowData = null;
public void ReRow(RowerResultModel r)
{
this.reRowData = r;
2022-06-08 13:05:56 +08:00
if (r != null && r.Type.HasValue)
{
2022-06-08 13:05:56 +08:00
rowerType = new RowerType { type = r.Type.Value, value = (float)r.TypeValue.Value };
if (Rower != null)
{
Rower.Reset();
}
//RowerPanel/Rower/Bottom/Expected/Title
//var dw = rowerType.type == 1 ? $"{rowerType.value}M" : $"{(rowerType.value / 60).ToString("#0.00")}Min";
//bottom.Find("Expected/Title").GetComponent<Text>().text = $"EST\n/ {dw}";
2022-04-19 18:09:29 +08:00
var dw = "";
if (rowerType.type == 0)
{
dw = $"\nM/ 30Min";
2022-06-08 13:05:56 +08:00
}
else if (rowerType.type == 2)
2022-04-19 18:09:29 +08:00
{
dw = $"\nM";
}
bottom.Find("Expected/Title").GetComponent<Text>().text = $"{App.GetLocalString("EST")}{dw}";
}
}
2022-06-08 13:05:56 +08:00
private void DeleteCacheDir()
2022-06-02 15:52:10 +08:00
{
//删除实时记录
try
{
var dir = $"{PFConstants.RowerRecordCacheFolder}/{App.CurrentUser.Id}/";
if (Directory.Exists(dir))
{
Helper.DelectDir(dir);
//Directory.Delete(dir, true);
}
}
2022-06-08 13:05:56 +08:00
catch (Exception e)
2022-06-02 15:52:10 +08:00
{
Debug.LogError(e.ToString());
}
}
2022-06-08 13:05:56 +08:00
private void Discard()
2022-03-31 18:30:07 +08:00
{
2022-06-02 15:52:10 +08:00
openTimer = false;
2022-04-19 18:09:29 +08:00
if (Application.internetReachability == NetworkReachability.NotReachable)
{
transform.Find("Stopped").gameObject.SetActive(true);
Utils.showToast(null, App.GetLocalString("Please check the network status!"));
return;
}
2022-03-31 18:30:07 +08:00
transform.Find("Stopped").gameObject.SetActive(false);
isPause = true;
2022-06-02 15:52:10 +08:00
DeleteCacheDir();
historyTime = 0;
2022-03-31 18:30:07 +08:00
if (C2RowerData.IsEnabled == true)
{
2022-04-06 10:21:30 +08:00
Utils.showToast(null, "Press \"Menu\" to save.", int.MaxValue, stopFunc: () => C2RowerData.isReadyStatus, endCallback: Init);
2022-03-31 18:30:07 +08:00
}
else
{
Init();
}
}
private void HandleSelectType()
{
if (Rower != null)
{
Rower.Reset();
}
2022-04-19 18:09:29 +08:00
reRowData = null;
//RowerPanel/Rower/Bottom/Expected/Title
//var dw = rowerType.type == 1 ? $"{rowerType.value}M" : $"{(rowerType.value / 60).ToString("#0.00")}Min";
//bottom.Find("Expected/Title").GetComponent<Text>().text = $"EST\n/ {dw}";
2022-04-19 18:09:29 +08:00
var dw = "";
if (rowerType.type == 0)
{
dw = $"\nM/ 30Min";
}
else if (rowerType.type == 2)
{
dw = $"\nM";
}
2022-04-06 10:21:30 +08:00
bottom.Find("Expected/Title").GetComponent<Text>().text = $"{App.GetLocalString("EST")}{dw}";
2021-09-23 18:14:53 +08:00
Init();
//Utils.showToast(null, "请滑动划船机并开始", isLowest: true, type: 1);
2021-09-23 18:14:53 +08:00
}
2022-06-08 13:05:56 +08:00
protected override void OnDisable()
{
base.OnDisable();
//App.MainDeviceAdapter.StopScan();
}
2021-09-23 18:14:53 +08:00
public override void Show()
{
base.Show();
//var mainNav = this.transform.Find("MainNav").GetComponent<MainNav>();
//mainNav.ShowRowerTab();
2022-06-08 13:05:56 +08:00
//App.MainDeviceAdapter.StartScan();
transform.MyDOFade();
//Debug.Log("140,开始扫描");
//App.MainDeviceAdapter.StartScan();
2021-09-23 18:14:53 +08:00
Init();
2022-05-31 16:47:21 +08:00
CheckLocalData();
2021-09-23 18:14:53 +08:00
//transform.Find("Left/Rower").GetComponent<RowerAnimation>().StartAnimation();
}
2022-06-08 13:05:56 +08:00
void Disconnect()
2021-09-30 09:06:35 +08:00
{
2022-06-08 13:05:56 +08:00
foreach (var d in App.MainDeviceAdapter.GetDevices())
2021-09-30 09:06:35 +08:00
{
2022-06-08 13:05:56 +08:00
if ((d.State == DeviceState.Connected || d.State == DeviceState.Connecting) && (d.Sensor == SensorType.Rower || d.Sensor == SensorType.HeartRate))
2021-09-30 09:06:35 +08:00
{
d.Disconnect();
}
}
App.MainDeviceAdapter.StopScan();
}
2022-06-08 13:05:56 +08:00
void HandleDiscardDirect()
2021-10-22 16:21:00 +08:00
{
openTimer = false;
isPause = true;
Debug.Log(RowerData);
btnStart.GetComponent<Image>().sprite = spriteDict["Start"];
btnStart.tag = "Start";
Init();
}
2022-06-08 13:05:56 +08:00
void HandleSaveDirect()
2021-10-21 18:04:01 +08:00
{
openTimer = false;
isPause = true;
btnStart.GetComponent<Image>().sprite = spriteDict["Start"];
btnStart.tag = "Start";
transform.Find("Stopped").gameObject.SetActive(false);
2022-03-30 18:25:51 +08:00
//Utils.showToast()
Action f = () =>
{
2022-04-19 18:09:29 +08:00
reRowData = null;
if (tempRecordData == null)
{
if (Save()) Init();
}
2022-06-08 13:05:56 +08:00
else
2022-04-19 18:09:29 +08:00
{
if (SaveFunc(tempRecordData.model, tempRecordData.files)) Init();
}
2022-03-30 18:25:51 +08:00
};
2022-04-29 18:32:04 +08:00
createTime = UIManager.Now.GetDateTime();
2022-03-30 18:25:51 +08:00
if (C2RowerData.IsEnabled == true)
{
2022-04-06 10:21:30 +08:00
Utils.showToast(null, "Press \"Menu\" to save.", int.MaxValue, stopFunc: () => C2RowerData.isReadyStatus, endCallback: f);
2022-03-30 18:25:51 +08:00
}
2022-06-08 13:05:56 +08:00
else
2022-03-30 18:25:51 +08:00
{
f.Invoke();
}
2021-10-21 18:04:01 +08:00
}
2022-05-31 16:47:21 +08:00
private string Id { get; set; }
2022-04-29 18:32:04 +08:00
int truelyTime = 0;
2022-05-11 17:11:48 +08:00
private void StartFunc(object sender, EventArgs e)
{
2022-06-15 18:07:06 +08:00
var bleDevice = App.MainDeviceAdapter.GetDevices().FirstOrDefault(d => (d.State == DeviceState.Connected || d.State == DeviceState.Connecting) && d.Sensor == SensorType.Rower) as BleDevice;
if (bleDevice != null)
{
deviceName = bleDevice.Name;
deviceNetwork = bleDevice.Network.ToString();
deviceAddress = bleDevice.Address;
deviceSensor = bleDevice.Sensor.ToString();
}
2022-06-13 18:59:02 +08:00
var rowdata = (IRowerCommonData)sender;
if (rowdata != RowerData)
return;
2022-06-10 19:31:07 +08:00
Debug.Log($"开始了:{openTimer}");
2022-06-08 13:05:56 +08:00
if (UIManager.Instance.confirm != null && UIManager.Instance.confirm.IsActive())
2022-06-07 15:54:18 +08:00
{
print("当前有弹窗");
return;
}
2022-06-08 13:05:56 +08:00
2022-05-11 17:11:48 +08:00
if (openTimer) return;
2022-05-31 16:47:21 +08:00
Id = Guid.NewGuid().ToString();
2022-06-08 13:05:56 +08:00
if (transform.parent.parent.Find("ModalPanel/RowerWelldone(Clone)") && transform.parent.parent.Find("ModalPanel/RowerWelldone(Clone)").gameObject.activeInHierarchy)
2022-04-19 18:09:29 +08:00
{
return;
}
2022-03-31 18:30:07 +08:00
//设定一个标准 如果满足条件不让他开始
if (C2RowerData.IsEnabled && RowerData != null && RowerData.ElapsedTime >= 5)
{
2022-04-06 10:21:30 +08:00
Utils.showToast(null, "Press \"Menu\" to save.", stopFunc: () => RowerData.ElapsedTime < 5);
2022-03-31 18:30:07 +08:00
return;
}
if (!isPause)
{
2022-06-08 13:05:56 +08:00
}
if (!openTimer)
{
2022-04-29 18:32:04 +08:00
startTime = UIManager.Now.GetDateTime();
createTime = null;
2022-05-31 18:40:32 +08:00
truelyTime = historyTime;
2022-05-09 13:18:14 +08:00
//TimerTicks();
openTimer = true;
timer = 0f;
}
transform.Find("Ready").gameObject.SetActive(false);
2022-04-19 18:09:29 +08:00
//if (UIManager.Instance.RowerWelldone)
//{
// UIManager.Instance.RowerWelldone.CloseModal();
//}
btnStart.GetComponent<Image>().sprite = spriteDict["Untagged"];
btnStart.tag = "Untagged";
}
2022-06-08 13:05:56 +08:00
private bool SaveFunc(RowerRecordModel model, List<string> files)
2022-04-19 18:09:29 +08:00
{
2022-06-08 13:05:56 +08:00
if (Application.internetReachability == NetworkReachability.NotReachable)
2022-04-19 18:09:29 +08:00
{
transform.Find("Stopped").gameObject.SetActive(true);
Utils.showToast(null, App.GetLocalString("Please check the network status!"));
tempRecordData = new TempRecordData(model, files);
return false;
}
2022-06-15 18:07:06 +08:00
model.ManufacturerName = deviceName + " " + deviceNetwork + " " + deviceSensor;
model.DeviceNumber = $"{ deviceAddress },{ deviceSensor }";
2022-04-19 18:09:29 +08:00
var res = ConfigHelper.rowerApi.Add(model, files);
if (res.result)
{
UIManager.ShowRowerWelldone(model.Id, Init);
2022-05-31 16:47:21 +08:00
try
{
if (File.Exists(files[0]))
{
File.Delete(files[0]);
}
2022-06-02 15:52:10 +08:00
DeleteCacheDir();
2022-05-31 16:47:21 +08:00
}
catch (Exception ex)
{
Debug.LogError(ex);
}
2022-04-19 18:09:29 +08:00
}
else
{
Utils.showToast(null, res.errMsg);
}
tempRecordData = null;
return true;
}
2022-06-08 13:05:56 +08:00
public class TempRecordData
2022-04-19 18:09:29 +08:00
{
public RowerRecordModel model;
public List<string> files;
2022-06-08 13:05:56 +08:00
public TempRecordData(RowerRecordModel model, List<string> files)
2022-04-19 18:09:29 +08:00
{
this.model = model;
this.files = files;
}
}
TempRecordData tempRecordData;
2022-06-15 18:07:06 +08:00
private string deviceName { get; set; }
private string deviceNetwork { get; set; }
private string deviceSensor { get; set; }
private string deviceAddress { get; set; }
private bool Save(string shadowids = null)
2021-09-23 18:14:53 +08:00
{
RowerRecordModel model = new RowerRecordModel();
model.Ticks = records.Count;
var bleDevice = App.MainDeviceAdapter.GetDevices().FirstOrDefault(d => (d.State == DeviceState.Connected || d.State == DeviceState.Connecting) && d.Sensor == SensorType.Rower) as BleDevice;
2022-06-08 13:05:56 +08:00
if (bleDevice != null)
2021-09-23 18:14:53 +08:00
{
model.ManufacturerName = bleDevice.Name + " " + bleDevice.Network + " " + bleDevice.Sensor;
model.DeviceNumber = $"{ bleDevice.Address },{ bleDevice.Sensor }";
}
2022-06-15 18:07:06 +08:00
else
{
model.ManufacturerName = deviceName + " " + deviceNetwork + " " + deviceSensor;
model.DeviceNumber = $"{ deviceAddress },{ deviceSensor }";
}
2022-05-31 16:47:21 +08:00
model.Id = Id;//Guid.NewGuid().ToString();
2021-09-23 18:14:53 +08:00
model.Weight = App.CurrentUser.Weight;
2022-06-08 13:05:56 +08:00
if (string.IsNullOrEmpty(shadowids))
{
model.StartTime = startTime;
}
else
{
model.StartTime = createTime.Value.AddSeconds(-values.Count);
}
2022-04-29 18:32:04 +08:00
model.CreateTime = createTime.Value;
2021-09-23 18:14:53 +08:00
Debug.Log(values.Count);
if (values.Count > 0)
{
model.MaxPower = values.Max(x => x.power);
2021-09-28 20:35:05 +08:00
if (values.Count(x => x.pace > 0) > 0)
{
model.MaxPace = values.Where(x => x.pace > 0).Min(x => x.pace);
model.AvgPace = values.Where(x => x.pace > 0).Average(x => x.pace);
}
2021-09-23 18:14:53 +08:00
model.MaxRate = values.Max(x => x.rate);
model.MaxHeartRate = values.Max(x => x.heartRate);
model.AvgPower = values.Average(x => x.power);
model.AvgRate = values.Average(x => x.rate);
model.AvgHeartRate = (int)values.Average(x => x.heartRate);
2022-03-31 18:30:07 +08:00
model.StrokeCount = (ushort)values.Max(x=>x.strokeCount);
model.TotalDistance = (ushort)values.Max(x => x.distance);
model.Kj = values.Max(x => x.energy);
2021-09-23 18:14:53 +08:00
}
model.TotalTime = records.Count;
model.Type = rowerType.type == 0 ? (int?)null : rowerType.type;
model.TypeValue = rowerType.value == 0 ? (float?)null : rowerType.value;
model.ShadowIds = string.IsNullOrEmpty(shadowids)?string.Join(",",GetComponent<RowerMultiModeScript>().shadowList.Select(x=>x.Nid)):shadowids;
2021-09-23 18:14:53 +08:00
var path = PFConstants.RowerRecordFolder + "/" + model.Id;
Helper.CreateDirectoryIfNotExsit(path);
var files = new List<string>();
try
{
var fname = path + "/" + model.Id + ".txt";
using (var fs = new FileInfo(fname).OpenWrite())
{
var stream = new StreamWriter(fs);
stream.BaseStream.Seek(0, SeekOrigin.End);
print("结果数" + records.Count);
stream.Write(string.Join("\r\n", records));
//foreach (var item in records)
//{
// stream.Write(item + "\r\n");
//}
2021-09-23 18:14:53 +08:00
stream.Flush();
stream.Close();
files.Add(fname);
}
}
catch (Exception ex)
{
Helper.DelectDir(path);
Debug.Log(ex.Message);
}
2022-04-19 18:09:29 +08:00
return SaveFunc(model, files);
//Disconnect();
2021-09-23 18:14:53 +08:00
}
private void Init()
{
ResetChart();
2022-06-15 18:07:06 +08:00
deviceName = "";
deviceNetwork = "";
deviceAddress = "";
deviceSensor = "";
2022-06-13 18:59:02 +08:00
pointCount = 0;
2022-04-19 18:09:29 +08:00
print("初始化");
2022-06-02 15:52:10 +08:00
if (Rower != null)
2021-09-23 18:14:53 +08:00
{
2022-06-02 15:52:10 +08:00
Rower.Reset();
2021-09-23 18:14:53 +08:00
}
2022-06-07 11:32:23 +08:00
//if (RowerData != null)
//{
// RowerData.Reset();
//}
GetComponent<RowerMultiModeScript>().GetShadowList(rowerType, reRowData);
2021-09-23 18:14:53 +08:00
btnStart.tag = "Start";
btnStart.GetComponent<Image>().sprite = spriteDict["Start"];
left.Find("Rower").GetComponent<Image>().sprite = spriteDict[0];
leftImage = left.Find("LeftImage/Value").GetComponent<Image>();
rightImage = left.Find("RightImage/Value").GetComponent<Image>();
leftImage.fillAmount = 0;
rightImage.fillAmount = 0;
2022-06-01 16:10:42 +08:00
TimesText.text = "---";
Caloriestext.text = "---";
rmyCaloriestext.text = "---";
2022-05-11 17:11:48 +08:00
pullList.Clear();
historyPullList.Clear();
2022-06-01 16:10:42 +08:00
//SetChartData(pullList, historyPullList);
2022-05-09 13:18:14 +08:00
//mid.Find("GraphChart").GetComponent<RowerGraphChartFeed>().SetData(pullList);
2021-09-23 18:14:53 +08:00
openTimer = false;
if (rowerType.type == 0)
{
2022-06-01 16:10:42 +08:00
TimeText.text = "---";
KMText.text = "---";
}
else
{
if (rowerType.type == 1)
{
2022-06-01 16:10:42 +08:00
TimeText.text = "---";
KMText.text = $"{rowerType.value}";
}
else
{
2022-06-01 16:10:42 +08:00
TimeText.text = TimeSpan.FromSeconds(rowerType.value).ToPFString();
KMText.text = "---";
}
}
2022-06-01 16:10:42 +08:00
WText.text = "---";
rmyWText.text = "---";
FiveText.text = "---";
MSText.text = "---";
//bottom.Find("MS/AvgValue").GetComponent<Text>().text = "---";
2021-09-23 18:14:53 +08:00
bottom.Find("BPM/Value").GetComponent<Text>().text = "---";
2022-06-01 16:10:42 +08:00
ExpectedText.text = "---";
2022-04-06 10:21:30 +08:00
bottom.Find("Expected/Title").GetComponent<Text>().text = bottom.Find("Expected/Title").GetComponent<Text>().text.Replace("EST",App.GetLocalString("EST"));
2022-06-01 16:10:42 +08:00
AvgForceText.text = "---";
rmyAvgForceText.text = "---";
PeakForceText.text = "---";
rmyPeakForceText.text = "---";
2022-05-11 17:11:48 +08:00
records.Clear();// = new List<string>();
values.Clear(); //= new List<TempRowerCalc>();
2021-09-23 18:14:53 +08:00
Kj = 0;
x = 0;
2021-09-28 17:51:58 +08:00
seconds = 0;
2021-10-21 18:04:01 +08:00
totalDistance = 0;
stopSeconds = 0;
2021-09-28 17:51:58 +08:00
isPause = false;
#if !UNITY_EDITOR
transform.Find("Ready").gameObject.SetActive(true);
#endif
C2RowerData.EnableChanged -= ModeChanged;
C2RowerData.EnableChanged += ModeChanged;
2022-05-11 17:11:48 +08:00
if (RowerData != null)
{
RowerData.RowerResChanged -= ResChanged;
RowerData.RowerResChanged += ResChanged;
}
//FtmsRowerData.RowerResChanged -= ResChanged;
//FtmsRowerData.RowerResChanged += ResChanged;
2022-04-27 14:48:06 +08:00
//标志线复位
Transform leftLine = transform.Find("Rower/Modes/Scroll/M2/Track/TraceContainer/LineMeterLeft"),
rightLine = transform.Find("Rower/Modes/Scroll/M2/Track/TraceContainer/LineMeterRight"),
finishLine = transform.Find("Rower/Modes/Scroll/M2/Track/TraceContainer/LineFinish");
leftLine.localPosition = new Vector3(-207.5f+43, leftLine.localPosition.y, leftLine.localPosition.z);
rightLine.localPosition = new Vector3(164.5f+43, rightLine.localPosition.y, rightLine.localPosition.z);
finishLine.localPosition = new Vector3(-237.5f+43, finishLine.localPosition.y, finishLine.localPosition.z);
2022-05-31 18:40:32 +08:00
historyStrokeCount = 0;
historyDistance = 0;
historyTime = 0;
historyEnergy = 0;
2022-05-11 17:11:48 +08:00
Resources.UnloadUnusedAssets();
GC.Collect();
2021-09-23 18:14:53 +08:00
}
private void ModeChanged(object sender, EventArgs e)
2021-09-23 18:14:53 +08:00
{
2022-05-11 17:11:48 +08:00
if (RowerData != null)
{
RowerData.PullChanged -= PaintPullCurve;
RowerData.PullChanged += PaintPullCurve;
RowerData.StartEvent -= StartFunc;
RowerData.StartEvent += StartFunc;
RowerData.RowerResChanged -= ResChanged;
RowerData.RowerResChanged += ResChanged;
2022-03-31 18:30:07 +08:00
}
slider.GetComponent<Slider>().interactable = !(bool)sender;
transform.Find("ResBar/BtnSub").GetComponent<Button>().interactable = !(bool)sender;
transform.Find("ResBar/BtnAdd").GetComponent<Button>().interactable = !(bool)sender;
}
2022-06-13 18:59:02 +08:00
private void ResChanged(object sender, EventArgs e)
{
2022-06-13 18:59:02 +08:00
var originData = (IRowerCommonData)sender;
if (slider && RowerData!= null && originData == RowerData)
2022-03-30 18:25:51 +08:00
{
2022-06-13 18:59:02 +08:00
var origin = RowerData.ResistanceLevel;
2022-06-10 19:31:07 +08:00
var wrapped = origin< 50 ? 50 : origin;
slider.GetComponent<PFUISlider>().SetValue((wrapped - 50) / 300f,false);
2022-03-30 18:25:51 +08:00
}
}
public bool checkRowing()
{
if (seconds > 0)
{
2022-03-30 18:25:51 +08:00
Utils.showToast(null, "Please end this training.", isLowest: true, isOnly: true);
return true;
}
return false;
}
private void ReturnHome()
{
if (checkRowing()) return;
//Disconnect();
2021-09-23 18:14:53 +08:00
UIManager.ShowHomePanel();
UIManager.ShowRowerSelector();
2021-09-23 18:14:53 +08:00
}
// Update is called once per frame
2022-05-09 13:18:14 +08:00
public bool openTimer { get; private set; } = false;
2021-09-23 18:14:53 +08:00
double x = 0f;
2021-10-21 18:04:01 +08:00
#if UNITY_EDITOR
List<ushort> tempList = new List<ushort>()
2021-09-23 18:14:53 +08:00
{
2022-04-27 20:03:56 +08:00
0,300,200,1100,400,500,120,130,160,0,0,0,200,300,400,500,600,500
};
int tempx = 0;
#endif
2022-06-01 16:10:42 +08:00
private Text WText { get; set; }
private Text rmyWText { get; set; }
private Text FiveText { get; set; }
private Text MSText { get; set; }
private Text ExpectedText { get; set; }
private Text KMText { get; set; }
private Text BPMText { get; set; }
private Text TimeText { get; set; }
private Text TimesText { get; set; }
private Text Caloriestext { get; set; }
private Text rmyCaloriestext { get; set; }
private Text AvgForceText { get; set; }
private Text rmyAvgForceText { get; set; }
private Text PeakForceText { get; set; }
private Text rmyPeakForceText { get; set; }
2022-06-13 18:59:02 +08:00
private bool interruptFlag{ get; set; }
2022-06-01 16:10:42 +08:00
2022-06-14 18:37:58 +08:00
void TimerTicks()
2022-04-27 20:03:56 +08:00
{
2022-06-14 18:37:58 +08:00
var heartRate = HeartRate ?? 0;
#if UNITY_EDITOR
2022-04-27 20:03:56 +08:00
var a = tempList[(tempx++) % tempList.Count];
//Debug.Log(a);
2022-04-27 20:03:56 +08:00
PaintPullCurve((ushort)(a / 10));
if (RowerData == null) return;
#endif
2022-06-13 18:59:02 +08:00
//#if !UNITY_EDITOR
2021-10-25 16:13:04 +08:00
if (Rower == null)
2021-10-22 16:21:00 +08:00
{
2022-06-13 18:59:02 +08:00
interruptFlag = true;
2022-06-08 13:05:56 +08:00
//HandleDiscardDirect();
2022-06-13 18:59:02 +08:00
isPause = true;
2022-06-10 19:31:07 +08:00
UIManager.ShowConfirm(App.GetLocalString("Warning"), App.GetLocalString("Save the game?"), () =>
{
HandleSaveDirect();
UIManager.CloseConfirm();
2022-06-13 18:59:02 +08:00
interruptFlag = false;
2022-06-10 19:31:07 +08:00
}, 2, ()=> {
Init();
2022-06-13 18:59:02 +08:00
interruptFlag = false;
2022-06-10 19:31:07 +08:00
});
2021-10-22 16:21:00 +08:00
return;
}
if (interruptFlag) {
transform.Find("Stopped").gameObject.SetActive(false);
return;
}
2021-09-23 18:14:53 +08:00
if (RowerData == null) return;
transform.Find("Text").GetComponent<Text>().text = $"{RowerData.ElapsedTime}:{RowerData.TotalDistance}";
//#endif
//断线重连继续()
2022-05-31 18:40:32 +08:00
var distance = (int)RowerData.TotalDistance + historyDistance;
var energy = RowerData.TotalEnergy + historyEnergy;
var strokeCount = RowerData.StrokeCount + historyStrokeCount;
var power = RowerData.InstantaneousPower;
var rate = RowerData.StrokeRate;
2022-04-29 18:32:04 +08:00
truelyTime++;
Debug.Log($"ElapsedTime :{RowerData.ElapsedTime} : {truelyTime}-{RowerData.TotalDistance}");
TempRowerCalc tmpdata = null;
2022-03-31 18:30:07 +08:00
//解决里程训练无法结束的问题
var c2notStop = rowerType.type == 1 && (rowerType.value-totalDistance) <= 5;
if (c2notStop)
{
distance = (int)rowerType.value;
KMText.text = "0";
records.Add($"{strokeCount},{RowerData.ElapsedTime},{rowerType.value},{RowerData.InstantaneousPower},{RowerData.InstantaneousPace},{RowerData.StrokeRate},{RowerData.ResistanceLevel},{heartRate},{energy},{RowerData.AveragePower},{truelyTime}");
tmpdata = new TempRowerCalc() { strokeCount = strokeCount, pace = RowerData.InstantaneousPace, power = power, rate = rate, heartRate = heartRate, distance = (int)rowerType.value, energy = energy };
values.Add(tmpdata);
SendDataToRace(tmpdata);
HandleSaveDirect();
return;
}
2022-03-31 18:30:07 +08:00
//里程停止逻辑
if (totalDistance == RowerData.TotalDistance && !c2notStop)
2021-10-21 18:04:01 +08:00
{
//判定一次停止
stopSeconds++;
}
2022-03-31 18:30:07 +08:00
else
2021-10-21 18:04:01 +08:00
{
stopSeconds = 0;
transform.Find("Stopped").gameObject.SetActive(false);
2021-10-21 18:04:01 +08:00
}
if (stopSeconds >= 2)
2021-10-21 18:04:01 +08:00
{
if (UIManager.Instance.confirm != null && UIManager.Instance.confirm.IsActive()) {
Debug.Log("stopSeconds >= 2");
transform.Find("Stopped").gameObject.SetActive(false);
2022-06-10 19:31:07 +08:00
return;
}
transform.Find("Stopped").gameObject.SetActive(true);
//if (stopSeconds == 6)
//{
// Utils.showToast(null, "Please keep rowing...", duration: 60, stopFunc: () => stopSeconds < 6, isLowest: true);
//}
if (rowerType.type == 2)
{
2022-03-31 18:30:07 +08:00
var remainTime = rowerType.value - (++seconds);
if (remainTime == 0)
{
2022-04-29 18:32:04 +08:00
records.Add($"{strokeCount},{RowerData.ElapsedTime},{distance},0,0,0,{RowerData.ResistanceLevel},{heartRate},{energy},{RowerData.AveragePower},{truelyTime}");
tmpdata = new TempRowerCalc() { strokeCount = strokeCount, pace = 0, power = 0, rate = 0, heartRate = heartRate, distance = distance, energy = energy };
values.Add(tmpdata);
SendDataToRace(tmpdata);
HandleSaveDirect();
return;
}
TimeSpan.FromSeconds(remainTime).ToPFString();
2022-06-01 16:10:42 +08:00
TimeText.text = TimeSpan.FromSeconds(remainTime).ToPFString();
}
2022-03-31 18:30:07 +08:00
else
{
2022-06-01 16:10:42 +08:00
TimeText.text = TimeSpan.FromSeconds(++seconds).ToPFString();
}
2022-06-01 16:10:42 +08:00
WText.text = "---";
rmyWText.text = "---";
FiveText.text = "---";
MSText.text = "---";
ExpectedText.text = "---";
2022-04-29 18:32:04 +08:00
records.Add($"{strokeCount},{RowerData.ElapsedTime},{distance},0,0,0,{RowerData.ResistanceLevel},{heartRate},{energy},{RowerData.AveragePower},{truelyTime}");
tmpdata = new TempRowerCalc() { strokeCount = strokeCount, pace = 0, power = 0, rate = 0, heartRate = heartRate, distance = distance, energy = energy };
values.Add(tmpdata);
SendDataToRace(tmpdata);
2021-10-21 18:04:01 +08:00
return;
2021-10-22 16:21:00 +08:00
}
2022-03-31 18:30:07 +08:00
totalDistance = (uint)distance;
var pace = RowerData.InstantaneousPace;
2022-03-30 18:25:51 +08:00
2022-06-01 16:10:42 +08:00
WText.text = power.ToString();
rmyWText.text = power.ToString();
FiveText.text = TimeSpan.FromSeconds(pace).ToPFString();
MSText.text = rate.ToString();
TimesText.text = strokeCount.ToString();
Caloriestext.text = energy.ToString();
rmyCaloriestext.text = energy.ToString();
AvgForceText.text = RowerData.AverageDriveForce.ToString("#0");
rmyAvgForceText.text = RowerData.AverageDriveForce.ToString("#0");
PeakForceText.text = RowerData.PeakDriveForce.ToString("#0");
rmyPeakForceText.text = RowerData.PeakDriveForce.ToString("#0");
2022-03-30 18:25:51 +08:00
if (pace != 0)
{
if (rowerType.type == 1)
{
//设置里程时 显示预估时间 当前时间+剩余里程/配速(转换)
var remainDistance = rowerType.value - totalDistance;
var time = values.Count + (remainDistance / (500f / pace));
2022-06-01 16:10:42 +08:00
ExpectedText.text = TimeSpan.FromSeconds(time).ToPFString();
2022-03-30 18:25:51 +08:00
}
else if (rowerType.type == 2)
{
var remainTime = rowerType.value - values.Count;
var dis = totalDistance + (remainTime * (500f / pace));
//设置时间时 显示预估里程 当前里程+剩余时间*配速
2022-06-01 16:10:42 +08:00
ExpectedText.text = $"{dis:#0}";
2022-03-30 18:25:51 +08:00
}
else
{
//自由滑 显示30min里程 当前里程+剩余时间*配速
var count30 = ((int)Math.Ceiling(values.Count / 1800f));
var remainTime = count30 * 1800 - values.Count;
var dif = 0;
if (count30 > 1 && (count30 - 1) * 1800 - 1 < values.Count)
{
dif = values[(count30 - 1) * 1800 - 1].distance;
}
var dis = totalDistance - dif + (remainTime * (500f / pace));
//设置时间时 显示预估里程 当前里程+剩余时间*配速
2022-06-01 16:10:42 +08:00
ExpectedText.text = $"{dis:#0}";
2022-03-30 18:25:51 +08:00
}
}
if (rowerType.type == 2)
2021-10-22 16:21:00 +08:00
{
2022-03-31 18:30:07 +08:00
var remainTime = rowerType.value - (++seconds);
2022-06-01 16:10:42 +08:00
TimeText.text = TimeSpan.FromSeconds(remainTime).ToPFString();
if (remainTime == 0)
{
2022-04-29 18:32:04 +08:00
records.Add($"{strokeCount},{RowerData.ElapsedTime},{distance},{RowerData.InstantaneousPower},{RowerData.InstantaneousPace},{RowerData.StrokeRate},{RowerData.ResistanceLevel},{heartRate},{energy},{RowerData.AveragePower},{truelyTime}");
tmpdata = new TempRowerCalc() { strokeCount = strokeCount, pace = pace, power = power, rate = rate, heartRate = heartRate, distance = distance, energy = energy };
values.Add(tmpdata);
SendDataToRace(tmpdata);
HandleSaveDirect();
return;
}
}
else
{
2022-06-01 16:10:42 +08:00
TimeText.text = TimeSpan.FromSeconds(++seconds).ToPFString();
2021-10-22 16:21:00 +08:00
}
if (rowerType.type == 1)
2021-10-21 18:04:01 +08:00
{
var remainDistance = rowerType.value - totalDistance;
2022-03-31 18:30:07 +08:00
if (remainDistance <= 0)
2021-10-21 18:04:01 +08:00
{
2022-06-01 16:10:42 +08:00
KMText.text = "0";
2022-04-29 18:32:04 +08:00
records.Add($"{strokeCount},{RowerData.ElapsedTime},{distance},{RowerData.InstantaneousPower},{RowerData.InstantaneousPace},{RowerData.StrokeRate},{RowerData.ResistanceLevel},{heartRate},{energy},{RowerData.AveragePower},{truelyTime}");
tmpdata = new TempRowerCalc() { strokeCount = strokeCount, pace = pace, power = power, rate = rate, heartRate = heartRate, distance = distance, energy = energy };
values.Add(tmpdata);
SendDataToRace(tmpdata);
HandleSaveDirect();
return;
}
2022-06-01 16:10:42 +08:00
KMText.text = remainDistance.ToString();
}
else
{
2022-06-01 16:10:42 +08:00
KMText.text = totalDistance.ToString();
}
2022-03-31 18:30:07 +08:00
2022-04-29 18:32:04 +08:00
records.Add($"{strokeCount},{RowerData.ElapsedTime},{distance},{RowerData.InstantaneousPower},{RowerData.InstantaneousPace},{RowerData.StrokeRate},{RowerData.ResistanceLevel},{heartRate},{energy},{RowerData.AveragePower},{truelyTime}");
tmpdata = new TempRowerCalc() { strokeCount = strokeCount, pace = pace, power = power, rate = rate, heartRate = heartRate, distance = distance, energy = energy };
values.Add(tmpdata);
SendDataToRace(tmpdata);
2022-05-31 16:47:21 +08:00
if (ticks % 5 == 0)
{
SaveRealTimes();//实时保存数据
}
}
//检查本地数据
2022-05-31 18:40:32 +08:00
int historyDistance = 0,historyStrokeCount = 0,historyEnergy = 0;
public int historyTime = 0;
2022-05-31 16:47:21 +08:00
private void CheckLocalData()
{
try
{
var dir = $"{PFConstants.RowerRecordCacheFolder}/{App.CurrentUser.Id}/";
var hasLocalData = Directory.Exists(dir);
if (hasLocalData)
2022-05-31 16:47:21 +08:00
{
var files = Directory.GetFiles(dir);
if (files.Length == 0)
return;
var historyRowerTime = PlayerPrefs.GetString("historyRowerTime");
deviceName = PlayerPrefs.GetString("deviceName");
deviceNetwork = PlayerPrefs.GetString("deviceNetwork");
deviceAddress = PlayerPrefs.GetString("deviceAddress");
deviceSensor = PlayerPrefs.GetString("deviceSensor");
if (!string.IsNullOrEmpty(historyRowerTime))
2022-05-31 16:47:21 +08:00
{
2022-06-08 18:27:16 +08:00
UIManager.ShowConfirm(App.GetLocalString("Warning"), App.GetLocalString("Save the game?"), () =>
2022-05-31 16:47:21 +08:00
{
2022-06-08 18:27:16 +08:00
var str = File.ReadAllText(files[0]);
var list = str.Replace("\r\n", " ").Split(' ');
records.Clear();
foreach (var item in list)
2022-05-31 18:40:32 +08:00
{
2022-06-08 18:27:16 +08:00
if (!string.IsNullOrEmpty(item))
{
2022-06-08 18:27:16 +08:00
var datas = item.Split(',');
records.Add(item);
values.Add(new TempRowerCalc()
{
2022-06-08 18:27:16 +08:00
strokeCount = int.Parse(datas[0]),
pace = ushort.Parse(datas[4]),
power = int.Parse(datas[3]),
rate = uint.Parse(datas[5]),
heartRate = int.Parse(datas[7]),
distance = int.Parse(datas[2]),
energy = int.Parse(datas[8])
});
2022-06-01 09:54:20 +08:00
}
2022-06-08 18:27:16 +08:00
//records.Add($"{strokeCount}0,{RowerData.ElapsedTime},{distance}2,{power}3,{pace}4,{rate}5,{RowerData.ResistanceLevel},{heartRate}7,{energy}8,{RowerData.AveragePower},{truelyTime}");
}
var historyRowerType = PlayerPrefs.GetString("historyRowerType");
if (!string.IsNullOrEmpty(historyRowerType))
{
2022-06-08 18:27:16 +08:00
var typeObject = historyRowerType.Split(',');
rowerType = new RowerType() { type = int.Parse(typeObject[0]), value = float.Parse(typeObject[1]) };
}
createTime = UIManager.Now.GetDateTime();
Save(PlayerPrefs.GetString("historyRowerShadowIds"));
Helper.DelectDir(dir);
UIManager.CloseConfirm();
}, 2,
() =>
{
2022-06-08 18:27:16 +08:00
Helper.DelectDir(dir);
UIManager.CloseConfirm();
if (Rower != null)
{
2022-06-08 18:27:16 +08:00
Rower.Reset();
}
});
}
2022-05-31 16:47:21 +08:00
}
}
catch (Exception e)
{
Debug.LogError(e);
}
}
//5s钟保存
private void SaveRealTimes()
{
try
{
var dir = $"{PFConstants.RowerRecordCacheFolder}/{App.CurrentUser.Id}/";
var path = $"{dir}/{Id}.txt";
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
2022-05-31 16:47:21 +08:00
File.WriteAllText(path, string.Join("\r\n", records));
//File.WriteAllText($"{PFConstants.RowerRecordCacheFolder}/cache.txt", string.Join("\r\n", App.cacheList));
PlayerPrefs.SetString("deviceName", deviceName);
PlayerPrefs.SetString("deviceNetwork", deviceNetwork);
PlayerPrefs.SetString("deviceAddress", deviceAddress);
PlayerPrefs.SetString("deviceSensor", deviceSensor);
2022-06-01 09:54:20 +08:00
PlayerPrefs.SetString("historyRowerType", $"{rowerType.type},{rowerType.value}");
PlayerPrefs.SetString("historyRowerTime", UIManager.Now.GetDateTime().ToString());
PlayerPrefs.SetString("historyRowerShadowIds", string.Join(",", GetComponent<RowerMultiModeScript>().shadowList.Select(x => x.Nid)));
//Debug.Log(Convert.ToDateTime());
2022-05-31 16:47:21 +08:00
}
catch (Exception e)
{
Debug.LogError(e);
}
2021-09-23 18:14:53 +08:00
}
2022-06-01 16:10:42 +08:00
private RowerMultiModeScript rowerMultiModeScript { get; set; }
void SendDataToRace(TempRowerCalc tmpdata)
{
2022-06-01 16:10:42 +08:00
rowerMultiModeScript.HandleTimeTick(new RowerChartModel
{
Pace = tmpdata.pace,
Power = tmpdata.power,
HeartRate = tmpdata.heartRate,
Rate = tmpdata.rate,
Distance = tmpdata.distance,
StrokeCount = tmpdata.strokeCount
});
}
2021-09-23 18:14:53 +08:00
void PaintPullCurve(object sender, EventArgs e)
{
2022-06-13 18:59:02 +08:00
//防止设备断开重连rowData对象发生变化事件重复触发
var ftms = (IRowerCommonData)sender;
2022-06-13 18:59:02 +08:00
if (RowerData != ftms)
return;
2021-10-21 18:04:01 +08:00
//Debug.Log(ftms.PullValue);
2021-09-23 18:14:53 +08:00
PaintPullCurve(ftms.PullValue);
}
bool isPlay = false;
int pointCount = 0;
2021-09-23 18:14:53 +08:00
void PaintPullCurve(ushort y)
{
//Debug.Log($"收到拉力 x={x} , y={y}");
2022-05-11 17:11:48 +08:00
//#if !UNITY_EDITOR
// if (!openTimer)
// {
// if (y > 0 && !isPause)
// {
// StartFunc();
// }
// else
// {
// return;
// }
// }
//#endif
2021-10-25 16:13:04 +08:00
//if (y > 1200) y = 1200;
2021-09-23 18:14:53 +08:00
//拉力条
2022-04-27 14:48:06 +08:00
var rate = ((float)y) * 2 / 120;
if (rate > 1) rate = 1f;
leftImage.fillAmount = rate;
rightImage.fillAmount = rate;
2021-09-23 18:14:53 +08:00
//动画
2021-09-28 20:35:05 +08:00
//left.Find("Rower").GetComponent<Image>().sprite = spriteDict[y / 67];
2021-09-23 18:14:53 +08:00
//曲线
if (y == 0)
{
//if (pullList.Count == 0)
if(pointCount == 0)
2021-09-23 18:14:53 +08:00
{
ClearChart();
isPlay = true;
x = 0;
pointCount++;
2021-09-23 18:14:53 +08:00
pullList.Add(new DoubleVector2(x, y));
SetChartData(x, y);
2021-09-23 18:14:53 +08:00
}
//else if (pullList.Count > 1)
else if(pointCount > 1)
2021-09-23 18:14:53 +08:00
{
x += 0.1;
pointCount++;
2021-09-23 18:14:53 +08:00
pullList.Add(new DoubleVector2(x, y));
SetChartData(x, y);
2022-04-27 20:03:56 +08:00
historyPullList = pullList.Select(x => x).ToList();
2021-09-23 18:14:53 +08:00
pullList.Clear();
pointCount = 0;
//x = 0.1;
2022-06-07 15:54:18 +08:00
//SetChartData(x, y);
pointCount = 1;
2022-06-07 15:54:18 +08:00
//isPlay = true;
//pullList.Add(new DoubleVector2(x, y));
2021-09-23 18:14:53 +08:00
}
2021-10-22 16:21:00 +08:00
else
{
//只有0并且两秒没拉曲线消失
2022-06-07 15:54:18 +08:00
if (stopSeconds == 1)
2021-10-22 16:21:00 +08:00
{
ClearChart();
//SetChartData(new List<DoubleVector2>(), new List<DoubleVector2>());
2021-10-22 16:21:00 +08:00
}
}
2021-09-23 18:14:53 +08:00
}
else
{
2022-06-07 15:54:18 +08:00
if (pullList.Count(x => x.y == 0) == pullList.Count)
{
ClearChart();
2022-06-07 15:54:18 +08:00
pointCount = 0;
//SetChartData(0.1, 0);
2022-06-07 15:54:18 +08:00
}
2021-09-23 18:14:53 +08:00
x += 0.1;
pointCount++;
2021-09-23 18:14:53 +08:00
pullList.Add(new DoubleVector2(x, y));
//if (pullList.Count > 5 && isPlay)
if (pointCount > 5 && isPlay)
{
Debug.Log("开始动画");
isPlay = false;
2022-05-11 17:11:48 +08:00
//left.Find("Rower").GetComponent<RowerAnimation>().StartAnimation();
}
//SetChartData(pullList, historyPullList);
SetChartData(x, y);
2021-09-23 18:14:53 +08:00
}
2021-10-21 18:04:01 +08:00
//Debug.Log($"{x},{y}");
2021-09-23 18:14:53 +08:00
//transform.Find("Mid/GraphChart").GetComponent<RowerGraphChartFeed>().SetData(pullList);
//pullList.Add(new DoubleVector2(x, y));
//if (pullList.Count >= 75)
//{
// pullList.RemoveAt(0);
// pullList = pullList.Select(val => new DoubleVector2(val.x - 0.1, val.y)).ToList();
//}
//else
//{
// x += 0.1f;
//}
}
void ClearChart()
{
if (x > 0)
{
rowerGraphChartFeed.ClearChart();
graphChartFeed.ClearChart();
x = 0;
}
}
void ResetChart() {
rowerGraphChartFeed?.ResetChart();
graphChartFeed?.ResetChart();
}
void SetChartData(double x, double y)
{
if (M1.localPosition.x == 0)
{
rowerGraphChartFeed.SetCurrentPoint(x, y);
rowerGraphChartFeed.SetHistoryData(x, historyPullList);
}
else
{
graphChartFeed.SetCurrentPoint(x, y);
}
}
2022-05-09 13:18:14 +08:00
void SetChartData(List<DoubleVector2> v1, List<DoubleVector2> v2)
{
//graph.DataSource.AddPointToCategoryRealtime("Player 2", item.x, item.y);
2022-06-01 16:10:42 +08:00
if (M1.localPosition.x == 0)
{
2022-06-08 13:05:56 +08:00
rowerGraphChartFeed.SetData(v1, v2);
2022-06-01 16:10:42 +08:00
}
else
{
graphChartFeed.SetData(v1);
}
2022-05-09 13:18:14 +08:00
}
float staticTimer = 1f,shortTimer = 0.25f;
2022-05-31 16:47:21 +08:00
int ticks { get; set; } = 0;
2021-09-23 18:14:53 +08:00
void Update()
{
shortTimer -= Time.deltaTime;
if (shortTimer <= 0)
2021-09-23 18:14:53 +08:00
{
ShortUpdateData();
shortTimer += 0.25f;
}
timer -= Time.deltaTime;
if (timer <= 0)
{
#if UNITY_EDITOR
if (openTimer || true)
#else
if (openTimer)
#endif
2021-09-23 18:14:53 +08:00
{
TimerTicks();
2022-05-31 16:47:21 +08:00
ticks++;
2021-09-23 18:14:53 +08:00
}
2022-06-14 18:37:58 +08:00
var heartRate = HeartRate ?? 0;
BPMText.text = heartRate == 0 ? "---" : heartRate.ToString();
HandleStatic();
2022-04-19 18:09:29 +08:00
timer += 1f ;
}
2022-04-19 18:09:29 +08:00
}
void ShortUpdateData()
{
if (!openTimer) return;
2022-04-19 18:09:29 +08:00
if (RowerData == null) return;
var power = RowerData.InstantaneousPower;
var rate = RowerData.StrokeRate;
var pace = RowerData.InstantaneousPace;
2022-06-02 15:52:10 +08:00
var strokeCount = RowerData.StrokeCount + historyStrokeCount;
var distance = (int)RowerData.TotalDistance + historyDistance;
var energy = RowerData.TotalEnergy + historyEnergy;
2022-04-29 18:32:04 +08:00
var heartRate = HeartRate ?? 0;
if (rowerType.type == 1 && (rowerType.value - totalDistance) <= 5 && !createTime.HasValue)
2022-04-29 18:32:04 +08:00
{
openTimer = false;
2022-06-01 16:10:42 +08:00
KMText.text = "0";
records.Add($"{strokeCount},{RowerData.ElapsedTime},{rowerType.value},{power},{pace},{rate},{RowerData.ResistanceLevel},{heartRate},{energy},{RowerData.AveragePower},{truelyTime}");
var tmpdata = new TempRowerCalc() { strokeCount = strokeCount, pace = pace, power = power, rate = rate, heartRate = heartRate, distance = (int)rowerType.value, energy = energy };
2022-04-29 18:32:04 +08:00
values.Add(tmpdata);
SendDataToRace(tmpdata);
HandleSaveDirect();
return;
}
2022-04-19 18:09:29 +08:00
if (stopSeconds >= 2)
{
return;
}
2022-06-01 16:10:42 +08:00
WText.text = power.ToString();
rmyWText.text = power.ToString();
FiveText.text = TimeSpan.FromSeconds(pace).ToPFString();
MSText.text = rate.ToString();
2022-05-11 17:11:48 +08:00
}
2022-06-06 18:40:31 +08:00
bool isFirstReset = false;
void HandleStatic()
{
2022-06-10 19:31:07 +08:00
var flag = Rower != null && RowerData != null && !(UIManager.Instance.confirm != null && UIManager.Instance.confirm.IsActive());
if (transform.Find("Ready").gameObject.activeInHierarchy)
{
transform.Find("Ready/DeviceStatus").gameObject.SetActive(!flag);
transform.Find("Ready/Img").gameObject.SetActive(flag);
transform.Find("Ready/Text").gameObject.SetActive(flag);
transform.Find("Ready/DeviceStatusConnect").gameObject.SetActive(flag);
2022-06-07 15:54:18 +08:00
if (flag && RowerData.TotalDistance != 0)
2022-06-06 18:40:31 +08:00
{
Rower.Reset();
2022-06-14 18:37:58 +08:00
if(C2RowerData.IsEnabled)
RowerData.Reset();
2022-06-06 18:40:31 +08:00
}
}
if (transform.Find("Stopped").gameObject.activeInHierarchy)
{
transform.Find("Stopped/DeviceStatus").gameObject.SetActive(!flag);
transform.Find("Stopped/DeviceStatusConnect").gameObject.SetActive(flag);
}
2022-03-30 18:25:51 +08:00
if (Rower != null)
{
if (C2RowerData.IsEnabled == true && !openTimer && !isPause && C2RowerData.rowerType!=null && rowerType!= null && !rowerType.EqualTo(C2RowerData.rowerType))
2022-03-30 18:25:51 +08:00
{
rowerType = C2RowerData.rowerType;
HandleSelectType();
}
2022-05-11 17:11:48 +08:00
//if (C2RowerData.IsEnabled)
//{
// Rower.C2GetStatus(new byte[] { 0xc1 });
//}
2022-03-30 18:25:51 +08:00
}
2021-09-23 18:14:53 +08:00
}
}