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 FtmsRowerData RowerData { get { 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("銷毀"); } 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; float timer = 1.0f; List pullList = new List(); public Dictionary spriteDict; List records; List values; DateTime startTime,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; protected override void Start() { var rect = transform.GetComponent(); rect.offsetMax = Vector2.zero; rect.offsetMin = Vector2.zero; } protected override void Awake() { rowerType = new RowerType(); 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") }, }; GetComponent().localScale = Vector3.one; GetComponent().localPosition = Vector3.zero; //mainNav.ShowExit(); left = transform.Find("Rower/Modes/Scroll/M1/Left"); bottom = transform.Find("Rower/Bottom"); mid = transform.Find("Rower/Modes/Scroll/M1/Mid"); slider = transform.Find("ResBar/PFUISlider"); 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("81A85D49-ACAA-C764-101A-02555E6AC81A"); //return; if (checkRowing()) return; if (C2RowerData.IsEnabled == true && C2RowerData.rowerType != null) return; UIManager.ShowRowerTaskPanel(type=> { rowerType = type; HandleSelectType(); }); }, false); //var c2 = new NewMainNav.CustomButton(Resources.Load("Images/RowerNew/ICON_continue_44"), () => //{ // HandleStartOrPause(); //}); 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, c3, 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 => { transform.Find("Stopped").gameObject.SetActive(false); openTimer = false; isPause = true; if (C2RowerData.IsEnabled == true) { Utils.showToast(null, "Please press Menu to save.",int.MaxValue, stopFunc: () => C2RowerData.isReadyStatus, endCallback: Init); } else { Init(); } }); Init(); } private void HandleSelectType() { 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 = rowerType.type == 1 ? $"" : $"\nM"; bottom.Find("Expected/Title").GetComponent().text = $"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(); //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 = () => { Save(); Init(); }; if (C2RowerData.IsEnabled == true) { Utils.showToast(null, "Please press Menu to save.",int.MaxValue, stopFunc: () => C2RowerData.isReadyStatus, endCallback: f); } else { f.Invoke(); } } private IRowerCommonData RowerCommonDataInstance => Rower != null ? (C2RowerData.IsEnabled == true ? (IRowerCommonData)Rower.c2RowerData : (IRowerCommonData)Rower.rowerData) : null; private void HandleStartOrPause() { //UIManager.ShowRowerResult(); //return; if (rowerType == null) { Utils.showToast(null, "Please select the course!", isLowest: true); return; } if (btnStart.CompareTag("Start")) { #if !UNITY_EDITOR if (RowerData == null) { Utils.showToast(null, "Please connect the device!", isLowest: true); return; } #endif UIManager.ShowCountDownAnimation(() => { #if !UNITY_EDITOR if (RowerCommonDataInstance != null) { RowerCommonDataInstance.PullChanged -= PaintPullCurve; RowerCommonDataInstance.PullChanged += PaintPullCurve; } #endif StartFunc(); }, ()=> { Debug.Log(222); if (Rower != null && !isPause) { Rower.Reset(); } }); } else { openTimer = false; isPause = true; btnStart.GetComponent().sprite = spriteDict["Start"]; btnStart.tag = "Start"; UIManager.ShowConfirm3("Quit", "Do you want to keep the record?", () => { UIManager.CloseConfirm3(); Save(); Init(); }, ()=> { Init(); }, ()=> { }); } Debug.Log(RowerData); //StartCoroutine(); } private void StartFunc() { if (!isPause) { startTime = UIManager.Now.GetDateTime(); } if (!openTimer) { TimerTicks(); openTimer = true; timer = 1.0f; } transform.Find("Ready").gameObject.SetActive(false); btnStart.GetComponent().sprite = spriteDict["Untagged"]; btnStart.tag = "Untagged"; } private void Save() { createTime = UIManager.Now.GetDateTime(); 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 = Guid.NewGuid().ToString(); model.Weight = App.CurrentUser.Weight; model.Kj = RowerData.TotalEnergy; model.StartTime = startTime; model.CreateTime = createTime; 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 = RowerData.StrokeCount; model.TotalTime = RowerData.ElapsedTime; model.TotalDistance = RowerData.TotalDistance; 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); } var res = ConfigHelper.rowerApi.Add(model, files); if (res.result) { UIManager.ShowRowerWelldone(model.Id); } else { Utils.showToast(null, res.errMsg); } //Disconnect(); } private void Init() { if (RowerData != null) { RowerData.Reset(); } if (Rower != null) { Rower.Reset(); } GetComponent().GetShadowList(rowerType); 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; left.Find("Times/Value").GetComponent().text = "---"; left.Find("Calories/Value").GetComponent().text = "---"; pullList = new List(); mid.Find("GraphChart").GetComponent().SetData(pullList); openTimer = false; if (rowerType.type == 0) { bottom.Find("Time/Value").GetComponent().text = "---"; bottom.Find("KM/Value").GetComponent().text = "---"; } else { if (rowerType.type == 1) { bottom.Find("Time/Value").GetComponent().text = "---"; bottom.Find("KM/Value").GetComponent().text = $"{rowerType.value}"; } else { bottom.Find("Time/Value").GetComponent().text = TimeSpan.FromSeconds(rowerType.value).ToPFString(); bottom.Find("KM/Value").GetComponent().text = "---"; } } mid.Find("W/Value").GetComponent().text = "---"; //bottom.Find("W/AvgValue").GetComponent().text = "---"; bottom.Find("500/Value").GetComponent().text = "---"; //bottom.Find("500/AvgValue").GetComponent().text = "---"; bottom.Find("MS/Value").GetComponent().text = "---"; //bottom.Find("MS/AvgValue").GetComponent().text = "---"; bottom.Find("BPM/Value").GetComponent().text = "---"; bottom.Find("Expected/Value").GetComponent().text = "---"; mid.Find("AvgForce/Value").GetComponent().text = "---"; mid.Find("PeakForce/Value").GetComponent().text = "---"; records = new List(); values = 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; FtmsRowerData.RowerResChanged -= ResChanged; FtmsRowerData.RowerResChanged += ResChanged; } private void ModeChanged(object sender, EventArgs e) { print("增加服务"+RowerData.ResistanceLevel); RowerCommonDataInstance.PullChanged -= PaintPullCurve; RowerCommonDataInstance.PullChanged += PaintPullCurve; slider.GetComponent().interactable = !(bool)sender; transform.Find("ResBar/BtnSub").GetComponent