using Assets.Scenes.Ride.Scripts; using Assets.Scripts; using Assets.Scripts.Apis.Models; using Assets.Scripts.Ble.Service; using Assets.Scripts.Devices; 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; using ChartAndGraph; using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; using UnityEngine; using UnityEngine.UI; using static RowerTaskPanel; public class RowerHomeScript : PFUIPanel { private class TempRowerCalc { 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; } } /// /// 划船机数据 /// private IRowerCommonData RowerData { get { return Rower != null ? (C2RowerData.IsEnabled == true ? (IRowerCommonData)(Rower.c2RowerData) : (IRowerCommonData)(Rower.rowerData)) : null; //var device = App.MainDeviceAdapter.GetDevices().FirstOrDefault(d => (d.State == DeviceState.Connected) && d.Sensor == SensorType.Rower); //if (device != null) //{ // return ((IRowerDevice)device).rowerData; //} //return null; } } protected override void OnDestroy() { Debug.Log("銷毀"); if (RowerData != null) { RowerData.PullChanged -= PaintPullCurve; RowerData.StartEvent -= StartFunc; RowerData.RowerResChanged -= ResChanged; } C2RowerData.EnableChanged -= ModeChanged; } private IRowerDevice Rower { get { var device = App.MainDeviceAdapter.GetDevices().FirstOrDefault(d => (d.State == DeviceState.Connected || d.State == DeviceState.Connecting) && d.Sensor == SensorType.Rower); if (device != null) { return (IRowerDevice)device; } return null; } } /// /// 心率数据 /// private int? HeartRate { get { 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; Transform left, bottom, mid,rmydata; float timer = 1.0f; List pullList, historyPullList; public Dictionary spriteDict,spriteDict2; List records; List values; DateTime startTime; DateTime? createTime; double Kj = 0; int seconds = 0; bool isPause = false; public RowerType rowerType = null; /// /// 计算停止的秒数,如果超过5秒,除了累加值都变成--,这些值记录为0,提示用户如果超过90秒,将直接保存数据 /// 如果5-90秒有拉力,则继续滑行 /// 如果超过90秒都没有拉力,则直接保存 /// int stopSeconds = 0; uint totalDistance = 0; Transform slider; RowerGraphChartFeed rowerGraphChartFeed { get; set; } RowerGraphChartFeed graphChartFeed { get; set; } protected override void Start() { var rect = transform.GetComponent(); rect.offsetMax = Vector2.zero; rect.offsetMin = Vector2.zero; rowerGraphChartFeed = mid.Find("GraphChart").GetComponent(); graphChartFeed = transform.Find("Rower/Modes/Scroll/M2/MyData/GraphChart").GetComponent(); } Transform M1 { get; set; } protected override void Awake() { Id = Guid.NewGuid().ToString(); rowerType = new RowerType() { type = 1, value = 500 }; spriteDict = new Dictionary() { {"Start",Resources.Load("Images/RowerNew/ICON_continue_44") }, {"Untagged",Resources.Load("Images/RowerNew/ICON_pause_44")}, {0,Resources.Load("Images/Rower/序列帧/划船机0001") }, {1,Resources.Load("Images/Rower/序列帧/划船机0002") }, {2,Resources.Load("Images/Rower/序列帧/划船机0003") }, {3,Resources.Load("Images/Rower/序列帧/划船机0004") }, {4,Resources.Load("Images/Rower/序列帧/划船机0005") }, {5,Resources.Load("Images/Rower/序列帧/划船机0006") }, {6,Resources.Load("Images/Rower/序列帧/划船机0007") }, {7,Resources.Load("Images/Rower/序列帧/划船机0008") }, {8,Resources.Load("Images/Rower/序列帧/划船机0009") }, {9,Resources.Load("Images/Rower/序列帧/划船机0010") }, {10,Resources.Load("Images/Rower/序列帧/划船机0011") }, {11,Resources.Load("Images/Rower/序列帧/划船机0012") }, {12,Resources.Load("Images/Rower/序列帧/划船机0013") }, {13,Resources.Load("Images/Rower/序列帧/划船机0014") }, {14,Resources.Load("Images/Rower/序列帧/划船机0015") }, }; spriteDict2 = new Dictionary() { {0,Resources.Load("Images/RowerNew/序列帧/划船机0001") }, {1,Resources.Load("Images/RowerNew/序列帧/划船机0002") }, {2,Resources.Load("Images/RowerNew/序列帧/划船机0003") }, {3,Resources.Load("Images/RowerNew/序列帧/划船机0004") }, {4,Resources.Load("Images/RowerNew/序列帧/划船机0005") }, {5,Resources.Load("Images/RowerNew/序列帧/划船机0006") }, {6,Resources.Load("Images/RowerNew/序列帧/划船机0007") }, {7,Resources.Load("Images/RowerNew/序列帧/划船机0008") }, {8,Resources.Load("Images/RowerNew/序列帧/划船机0009") }, {9,Resources.Load("Images/RowerNew/序列帧/划船机0010") }, {10,Resources.Load("Images/RowerNew/序列帧/划船机0011") }, {11,Resources.Load("Images/RowerNew/序列帧/划船机0012") }, {12,Resources.Load("Images/RowerNew/序列帧/划船机0013") }, {13,Resources.Load("Images/RowerNew/序列帧/划船机0014") }, {14,Resources.Load("Images/RowerNew/序列帧/划船机0015") }, }; rowerMultiModeScript = GetComponent(); GetComponent().localScale = Vector3.one; GetComponent().localPosition = Vector3.zero; records = new List(); values = new List(); pullList = new List(); historyPullList = new List(); //mainNav.ShowExit(); M1 = transform.Find("Rower/Modes/Scroll/M1"); left = transform.Find("Rower/Modes/Scroll/M1/Left"); bottom = transform.Find("Rower/Bottom"); KMText = bottom.Find("KM/Value").GetComponent(); TimeText = bottom.Find("Time/Value").GetComponent(); BPMText = bottom.Find("BPM/Value").GetComponent(); mid = transform.Find("Rower/Modes/Scroll/M1/Mid"); rmydata = transform.Find("Rower/Modes/Scroll/M2/MyData"); slider = transform.Find("ResBar/PFUISlider"); WText = mid.Find("W/Value").GetComponent(); rmyWText = rmydata.Find("W/Value").GetComponent(); FiveText = bottom.Find("500/Value").GetComponent(); MSText = bottom.Find("MS/Value").GetComponent(); ExpectedText = bottom.Find("Expected/Value").GetComponent(); TimesText = left.Find("Times/Value").GetComponent(); Caloriestext = left.Find("Calories/Value").GetComponent(); rmyCaloriestext = rmydata.Find("Calories/Value").GetComponent(); AvgForceText = mid.Find("AvgForce/Value").GetComponent(); rmyAvgForceText = rmydata.Find("AvgForce/Value").GetComponent(); PeakForceText = mid.Find("PeakForce/Value").GetComponent(); rmyPeakForceText = rmydata.Find("PeakForce/Value").GetComponent(); UIManager.AddEvent(transform.Find("ResBar/BtnAdd").gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, b => { if (RowerData != null) { slider.GetComponent().SetValue((RowerData.ResistanceLevel + 1 - 50) / 300f); } }); UIManager.AddEvent(transform.Find("ResBar/BtnSub").gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, b => { if (RowerData != null) { slider.GetComponent().SetValue((RowerData.ResistanceLevel - 1 - 50) / 300f); } }); slider.GetComponent().valueHandler = (a) => 50 + a * 300; slider.GetComponent().SetValueChanged(r => { var v = (ushort)Math.Round((r * 300)); print("设置阻力" + v); if (Rower != null) { Rower.SetResistanceLevel(v); //RowerData. } }); //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(); }); //手机版tab #if UNITY_ANDROID || UNITY_IOS var nav = transform.Find("MainNav-mobile").GetComponent(); var c1 = new NewMainNav.CustomButton(Resources.Load("Images/RowerNew/ICON_create_44"), () => { //UIManager.ShowRowerWelldone("33171855-66FC-4121-935C-0F4DA98E5BB2", Init); //return; //UIManager.ShowRowerWelldone("C0F81E83-120B-4A2C-AD0E-8BC1B8EB3E74", Init); //return; if (checkRowing()) return; if (C2RowerData.IsEnabled == true && C2RowerData.rowerType != null) return; UIManager.ShowRowerTaskPanel(type=> { rowerType = type; HandleSelectType(); },rowerType); }, false); var c2 = new NewMainNav.CustomButton(Resources.Load("Images/RowerNew/记录"), () => { UIManager.ShowResultListPanel(); }, false); btnStart = transform.Find("MainNav-mobile/Custom2").gameObject; //var c3 = new NewMainNav.CustomButton(Resources.Load("Images/RowerNew/ICON_mode_44"), () => //{ // ReturnHome(); //}, false); //隐藏骑行 nav.SetButtonActive(new List { 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 => { Discard(); }); if (RowerData != null) { RowerData.PullChanged -= PaintPullCurve; RowerData.PullChanged += PaintPullCurve; RowerData.StartEvent -= StartFunc; RowerData.StartEvent += StartFunc; } rowerType = new RowerType { type = 1, value = 500 }; HandleSelectType(); Init(); } RowerResultModel reRowData = null; public void ReRow(RowerResultModel r) { this.reRowData = r; if (r!= null && r.Type.HasValue) { 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 = $"EST\n/ {dw}"; var dw = ""; if (rowerType.type == 0) { dw = $"\nM/ 30Min"; } else if (rowerType.type == 2) { dw = $"\nM"; } bottom.Find("Expected/Title").GetComponent().text = $"{App.GetLocalString("EST")}{dw}"; } } private void Discard() { if (Application.internetReachability == NetworkReachability.NotReachable) { transform.Find("Stopped").gameObject.SetActive(true); Utils.showToast(null, App.GetLocalString("Please check the network status!")); return; } transform.Find("Stopped").gameObject.SetActive(false); openTimer = false; isPause = true; if (C2RowerData.IsEnabled == true) { Utils.showToast(null, "Press \"Menu\" to save.", int.MaxValue, stopFunc: () => C2RowerData.isReadyStatus, endCallback: Init); } else { Init(); } } private void HandleSelectType() { if (Rower != null) { Rower.Reset(); } 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 = $"EST\n/ {dw}"; var dw = ""; if (rowerType.type == 0) { dw = $"\nM/ 30Min"; } else if (rowerType.type == 2) { dw = $"\nM"; } bottom.Find("Expected/Title").GetComponent().text = $"{App.GetLocalString("EST")}{dw}"; Init(); //Utils.showToast(null, "请滑动划船机并开始", isLowest: true, type: 1); } public override void Show() { base.Show(); //var mainNav = this.transform.Find("MainNav").GetComponent(); //mainNav.ShowRowerTab(); transform.MyDOFade(); //Debug.Log("140,开始扫描"); //App.MainDeviceAdapter.StartScan(); Init(); CheckLocalData(); //transform.Find("Left/Rower").GetComponent().StartAnimation(); } void Disconnect() { foreach(var d in App.MainDeviceAdapter.GetDevices()) { if ((d.State == DeviceState.Connected || d.State == DeviceState.Connecting) && (d.Sensor == SensorType.Rower || d.Sensor == SensorType.HeartRate)) { d.Disconnect(); } } App.MainDeviceAdapter.StopScan(); } void HandleDiscardDirect() { openTimer = false; isPause = true; Debug.Log(RowerData); btnStart.GetComponent().sprite = spriteDict["Start"]; btnStart.tag = "Start"; Init(); } void HandleSaveDirect() { openTimer = false; isPause = true; btnStart.GetComponent().sprite = spriteDict["Start"]; btnStart.tag = "Start"; transform.Find("Stopped").gameObject.SetActive(false); //Utils.showToast() Action f = () => { reRowData = null; if (tempRecordData == null) { if (Save()) Init(); } else { if (SaveFunc(tempRecordData.model, tempRecordData.files)) Init(); } }; createTime = UIManager.Now.GetDateTime(); if (C2RowerData.IsEnabled == true) { Utils.showToast(null, "Press \"Menu\" to save.", int.MaxValue, stopFunc: () => C2RowerData.isReadyStatus, endCallback: f); } else { f.Invoke(); } } private string Id { get; set; } int truelyTime = 0; private void StartFunc(object sender, EventArgs e) { if (openTimer) return; Id = Guid.NewGuid().ToString(); if (transform.parent.parent.Find("ModalPanel/RowerWelldone(Clone)") && transform.parent.parent.Find("ModalPanel/RowerWelldone(Clone)").gameObject.activeInHierarchy) { return; } //设定一个标准 如果满足条件不让他开始 if (C2RowerData.IsEnabled && RowerData != null && RowerData.ElapsedTime >= 5) { Utils.showToast(null, "Press \"Menu\" to save.", stopFunc: () => RowerData.ElapsedTime < 5); return; } if (!isPause) { } if (!openTimer) { startTime = UIManager.Now.GetDateTime(); createTime = null; truelyTime = historyTime; //TimerTicks(); openTimer = true; timer = 1.0f; } transform.Find("Ready").gameObject.SetActive(false); //if (UIManager.Instance.RowerWelldone) //{ // UIManager.Instance.RowerWelldone.CloseModal(); //} btnStart.GetComponent().sprite = spriteDict["Untagged"]; btnStart.tag = "Untagged"; } private bool SaveFunc(RowerRecordModel model, List files) { if (Application.internetReachability == NetworkReachability.NotReachable) { transform.Find("Stopped").gameObject.SetActive(true); Utils.showToast(null, App.GetLocalString("Please check the network status!")); tempRecordData = new TempRecordData(model, files); return false; } var res = ConfigHelper.rowerApi.Add(model, files); if (res.result) { UIManager.ShowRowerWelldone(model.Id, Init); try { if (File.Exists(files[0])) { File.Delete(files[0]); } } catch (Exception ex) { Debug.LogError(ex); } } else { Utils.showToast(null, res.errMsg); } tempRecordData = null; return true; } public class TempRecordData { public RowerRecordModel model; public List files; public TempRecordData(RowerRecordModel model, List files) { this.model = model; this.files = files; } } TempRecordData tempRecordData; private bool Save() { var bleDevice = App.MainDeviceAdapter.GetDevices().FirstOrDefault(d => (d.State == DeviceState.Connected || d.State == DeviceState.Connecting) && d.Sensor == SensorType.Rower) as BleDevice; RowerRecordModel model = new RowerRecordModel(); model.Ticks = records.Count; if (bleDevice != null) { model.ManufacturerName = bleDevice.Name + " " + bleDevice.Network + " " + bleDevice.Sensor; model.DeviceNumber = $"{ bleDevice.Address },{ bleDevice.Sensor }"; } model.Id = Id;//Guid.NewGuid().ToString(); model.Weight = App.CurrentUser.Weight; model.Kj = RowerData.TotalEnergy; model.StartTime = startTime; model.CreateTime = createTime.Value; Debug.Log(values.Count); if (values.Count > 0) { model.MaxPower = values.Max(x => x.power); 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); } 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); model.StrokeCount = (ushort)values.Max(x=>x.strokeCount); model.TotalDistance = (ushort)values.Max(x => x.distance); } model.TotalTime = RowerData.ElapsedTime; model.Type = rowerType.type == 0 ? (int?)null : rowerType.type; model.TypeValue = rowerType.value == 0 ? (float?)null : rowerType.value; model.ShadowIds = string.Join(",",GetComponent().shadowList.Select(x=>x.Nid)); var path = PFConstants.RowerRecordFolder + "/" + model.Id; Helper.CreateDirectoryIfNotExsit(path); var files = new List(); 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"); //} stream.Flush(); stream.Close(); files.Add(fname); } } catch (Exception ex) { Helper.DelectDir(path); Debug.Log(ex.Message); } return SaveFunc(model, files); //Disconnect(); } private void Init() { print("初始化"); if (RowerData != null) { RowerData.Reset(); } if (Rower != null) { Rower.Reset(); } GetComponent().GetShadowList(rowerType, reRowData); btnStart.tag = "Start"; btnStart.GetComponent().sprite = spriteDict["Start"]; left.Find("Rower").GetComponent().sprite = spriteDict[0]; left.Find("LeftImage/Value").GetComponent().fillAmount = 0; left.Find("RightImage/Value").GetComponent().fillAmount = 0; TimesText.text = "---"; Caloriestext.text = "---"; rmyCaloriestext.text = "---"; pullList.Clear(); historyPullList.Clear(); //SetChartData(pullList, historyPullList); //mid.Find("GraphChart").GetComponent().SetData(pullList); openTimer = false; if (rowerType.type == 0) { TimeText.text = "---"; KMText.text = "---"; } else { if (rowerType.type == 1) { TimeText.text = "---"; KMText.text = $"{rowerType.value}"; } else { TimeText.text = TimeSpan.FromSeconds(rowerType.value).ToPFString(); KMText.text = "---"; } } WText.text = "---"; rmyWText.text = "---"; FiveText.text = "---"; MSText.text = "---"; //bottom.Find("MS/AvgValue").GetComponent().text = "---"; bottom.Find("BPM/Value").GetComponent().text = "---"; ExpectedText.text = "---"; bottom.Find("Expected/Title").GetComponent().text = bottom.Find("Expected/Title").GetComponent().text.Replace("EST",App.GetLocalString("EST")); AvgForceText.text = "---"; rmyAvgForceText.text = "---"; PeakForceText.text = "---"; rmyPeakForceText.text = "---"; records.Clear();// = new List(); values.Clear(); //= new List(); Kj = 0; x = 0; seconds = 0; totalDistance = 0; stopSeconds = 0; isPause = false; #if !UNITY_EDITOR transform.Find("Ready").gameObject.SetActive(true); #endif C2RowerData.EnableChanged -= ModeChanged; C2RowerData.EnableChanged += ModeChanged; if (RowerData != null) { RowerData.RowerResChanged -= ResChanged; RowerData.RowerResChanged += ResChanged; } //FtmsRowerData.RowerResChanged -= ResChanged; //FtmsRowerData.RowerResChanged += ResChanged; //标志线复位 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); historyStrokeCount = 0; historyDistance = 0; historyTime = 0; historyEnergy = 0; Resources.UnloadUnusedAssets(); GC.Collect(); } private void ModeChanged(object sender, EventArgs e) { if (RowerData != null) { RowerData.PullChanged -= PaintPullCurve; RowerData.PullChanged += PaintPullCurve; RowerData.StartEvent -= StartFunc; RowerData.StartEvent += StartFunc; RowerData.RowerResChanged -= ResChanged; RowerData.RowerResChanged += ResChanged; } slider.GetComponent().interactable = !(bool)sender; transform.Find("ResBar/BtnSub").GetComponent