diff --git a/Assets/Plugins/Android/unityandroidbluetoothlelib.jar b/Assets/Plugins/Android/unityandroidbluetoothlelib.jar index 21f7f248..8731dae3 100644 Binary files a/Assets/Plugins/Android/unityandroidbluetoothlelib.jar and b/Assets/Plugins/Android/unityandroidbluetoothlelib.jar differ diff --git a/Assets/Plugins/BluetoothDeviceScript.cs b/Assets/Plugins/BluetoothDeviceScript.cs index 14d1b0d6..7685952f 100644 --- a/Assets/Plugins/BluetoothDeviceScript.cs +++ b/Assets/Plugins/BluetoothDeviceScript.cs @@ -24,6 +24,7 @@ public class BluetoothDeviceScript : MonoBehaviour public Action PeripheralReceivedWriteDataAction; public Action ConnectedPeripheralAction; public Action ConnectedDisconnectPeripheralAction { get; set; } + public Action ConnectErrorAction { get; set; } public Action DisconnectedPeripheralAction; public Action DeviceBleStatusDisconnectedAction; public Action DiscoveredServiceAction; @@ -53,10 +54,11 @@ public class BluetoothDeviceScript : MonoBehaviour void Update () { } - + const string connectionError = "ConnectionError"; const string deviceInitializedString = "Initialized"; const string deviceDeInitializedString = "DeInitialized"; const string deviceErrorString = "Error"; + const string deviceConnectErrorString = "ConnectionError"; const string deviceServiceAdded = "ServiceAdded"; const string deviceStartedAdvertising = "StartedAdvertising"; const string deviceStoppedAdvertising = "StoppedAdvertising"; @@ -77,6 +79,7 @@ public class BluetoothDeviceScript : MonoBehaviour public void OnBluetoothMessage (string message) { + Debug.Log(message); if (message != null) { char[] delim = new char[] { '~' }; @@ -242,6 +245,10 @@ public class BluetoothDeviceScript : MonoBehaviour DisconnectedPeripheralAction(parts[1]); } } + else if (message.Length > connectionError.Length && message.Substring(0,connectionError.Length) == connectionError){ + if (ConnectErrorAction != null) + ConnectErrorAction(parts[1], parts[2]); + } else if (message.Length >= deviceDiscoveredService.Length && message.Substring (0, deviceDiscoveredService.Length) == deviceDiscoveredService) { if (parts.Length >= 3 && DiscoveredServiceAction != null) diff --git a/Assets/Plugins/BluetoothHardwareInterface.cs b/Assets/Plugins/BluetoothHardwareInterface.cs index 14b9cf82..93c85514 100644 --- a/Assets/Plugins/BluetoothHardwareInterface.cs +++ b/Assets/Plugins/BluetoothHardwareInterface.cs @@ -604,7 +604,7 @@ public class BluetoothLEHardwareInterface #endif } - public static void ConnectToPeripheral (string name, Action connectAction, Action serviceAction, Action characteristicAction, Action disconnectAction = null) + public static void ConnectToPeripheral (string name, Action connectAction, Action serviceAction, Action characteristicAction, Action disconnectAction = null, Action errorAction = null) { #if !UNITY_EDITOR_OSX || !EXPERIMENTAL_MACOS_EDITOR @@ -618,6 +618,7 @@ public class BluetoothLEHardwareInterface bluetoothDeviceScript.DiscoveredCharacteristicAction = characteristicAction; bluetoothDeviceScript.ConnectedDisconnectPeripheralAction = disconnectAction; bluetoothDeviceScript.DeviceBleStatusDisconnectedAction = disconnectAction; + bluetoothDeviceScript.ConnectErrorAction = errorAction; } #if EXPERIMENTAL_MACOS_EDITOR && (UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX) diff --git a/Assets/Resources/UI/Prefab/Panel/Mobile/RowerDevicePanel.prefab b/Assets/Resources/UI/Prefab/Panel/Mobile/RowerDevicePanel.prefab index 79a9e4df..a3eefb73 100644 --- a/Assets/Resources/UI/Prefab/Panel/Mobile/RowerDevicePanel.prefab +++ b/Assets/Resources/UI/Prefab/Panel/Mobile/RowerDevicePanel.prefab @@ -711,7 +711,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &3643721405153075690 RectTransform: m_ObjectHideFlags: 0 @@ -826,7 +826,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &3643721405012091660 RectTransform: m_ObjectHideFlags: 0 @@ -1436,7 +1436,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &8230995990077916237 RectTransform: m_ObjectHideFlags: 0 @@ -1739,7 +1739,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &2290133527418080840 RectTransform: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/Devices/Ble/BleDevice.cs b/Assets/Scripts/Devices/Ble/BleDevice.cs index cccf4679..7228e351 100644 --- a/Assets/Scripts/Devices/Ble/BleDevice.cs +++ b/Assets/Scripts/Devices/Ble/BleDevice.cs @@ -106,6 +106,7 @@ namespace Assets.Scripts.Devices.Ble if (response.Error != null) { + this.State = DeviceState.Disconnected; if (response.Error.Code == WclBleErrors.WCL_E_BLUETOOTH_LE_DEVICE_NOT_FOUND) { Debug.Log("未找到设备"); diff --git a/Assets/Scripts/Devices/Ble/mobile/BleMobileInterface.cs b/Assets/Scripts/Devices/Ble/mobile/BleMobileInterface.cs index 58d55173..b2c1a994 100644 --- a/Assets/Scripts/Devices/Ble/mobile/BleMobileInterface.cs +++ b/Assets/Scripts/Devices/Ble/mobile/BleMobileInterface.cs @@ -9,6 +9,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Timers; using UnityEngine; namespace Assets.Scripts.Ble @@ -210,30 +211,41 @@ namespace Assets.Scripts.Ble List servicelist = new List(); List characteristilist = new List(); + public void ConnectPeripheral(BlePeripheralInfo info, Action callback) { - if (!this.callbacks.ContainsKey(info)) + var exsit = this.callbacks.Where(c => c.Key.Address == info.Address).Any(); + if (!exsit) { this.callbacks.Add(info, callback); } + else + { + var obj = this.callbacks.Where(c => c.Key.Address == info.Address).FirstOrDefault(); + this.callbacks.Remove(obj.Key); + this.callbacks.Add(info, callback); + } Debug.Log("try connect device" + info.Name + this.callbacks.Count.ToString()); + var self = this; if (this.callbacks.Count == 1) { - BleResponse s = new BleResponse(); - s.IsSuccess = true; - s.Error = null; - var self = this; BluetoothLEHardwareInterface.ConnectToPeripheral(info.Address, (address) => { + BleResponse s = new BleResponse + { + IsSuccess = true, + Error = null + }; callback?.Invoke(self, info, s); this.callbacks.Remove(info); - Debug.Log("连接成功!"+info.Name); + Debug.Log("连接成功!" + info.Name); if (this.callbacks.Any()) { this.ConnectPeripheral(this.callbacks.First().Key, this.callbacks.First().Value); } }, (address, service) => { + Debug.Log("发现服务"); ServicesDiscovered(address, service); }, (address, service, characteristic) => { @@ -242,9 +254,25 @@ namespace Assets.Scripts.Ble { Debug.Log("disconnect device:" + address); PeripheralDisconnected(address, info); - }); + }, + (address, error) => + { + BleResponse s = new BleResponse + { + IsSuccess = false, + Error = new BleHwInterfaceError(error) + }; + callback?.Invoke(self, info, s); + this.callbacks.Remove(info); + if (this.callbacks.Any()) + { + this.ConnectPeripheral(this.callbacks.First().Key, this.callbacks.First().Value); + } + } + ); } } + #region 私有方法 //服务发现 private void ServicesDiscovered(string address, string service) @@ -305,7 +333,7 @@ namespace Assets.Scripts.Ble } var characteristicsDiscoveredCallback = characteristicsDiscoveredCallbacks.Where(c => c.Key.MatchAddress(address)); - if (serviceCallback.Any()) + if (characteristicsDiscoveredCallback.Any()) { characteristicsDiscoveredCallbacks.Remove(characteristicsDiscoveredCallback.First().Key); } diff --git a/Assets/Scripts/UI/Prefab/Device/ConnectDeviceModal.cs b/Assets/Scripts/UI/Prefab/Device/ConnectDeviceModal.cs index 5d8289b0..d1d625d3 100644 --- a/Assets/Scripts/UI/Prefab/Device/ConnectDeviceModal.cs +++ b/Assets/Scripts/UI/Prefab/Device/ConnectDeviceModal.cs @@ -267,7 +267,7 @@ public class ConnectDeviceModal : PFUIPanel } } - noDevice.text = deviceItemObj.DeviceInfo.Name + "-"+ deviceItemObj.DeviceInfo.DeviceNumber; + noDevice.text = deviceItemObj.DeviceInfo.Name; if (deviceItemObj.DeviceInfo.State == DeviceState.Connected) { noDevice.color = Color.white; diff --git a/Assets/Scripts/UI/Prefab/Panel/RowerHomeScript.cs b/Assets/Scripts/UI/Prefab/Panel/RowerHomeScript.cs index 90a6fdc7..fa84e1c6 100644 --- a/Assets/Scripts/UI/Prefab/Panel/RowerHomeScript.cs +++ b/Assets/Scripts/UI/Prefab/Panel/RowerHomeScript.cs @@ -22,7 +22,7 @@ using static RowerTaskPanel; public class RowerHomeScript : PFUIPanel { - private class TempRowerCalc + private class TempRowerCalc { public int power { get; set; } public ushort pace { get; set; } @@ -52,7 +52,7 @@ public class RowerHomeScript : PFUIPanel protected override void OnDestroy() { Debug.Log("銷毀"); - if (RowerData != null) + if (RowerData != null) { RowerData.PullChanged -= PaintPullCurve; RowerData.StartEvent -= StartFunc; @@ -60,11 +60,11 @@ public class RowerHomeScript : PFUIPanel } C2RowerData.EnableChanged -= ModeChanged; } - private IRowerDevice Rower + private IRowerDevice Rower { get { - var device = App.MainDeviceAdapter.GetDevices().FirstOrDefault(d => (d.State == DeviceState.Connected || d.State == DeviceState.Connecting) && d.Sensor == SensorType.Rower); + var device = App.MainDeviceAdapter.GetDevices().FirstOrDefault(d => d.State == DeviceState.Connected && d.Sensor == SensorType.Rower); if (device != null) { return (IRowerDevice)device; @@ -75,9 +75,9 @@ public class RowerHomeScript : PFUIPanel /// /// 心率数据 /// - private int? HeartRate + private int? HeartRate { - get + get { var device = App.MainDeviceAdapter.GetDevices().FirstOrDefault(d => (d.State == DeviceState.Connected || d.State == DeviceState.Connecting) && d.Sensor == SensorType.HeartRate); if (device != null) @@ -88,12 +88,12 @@ public class RowerHomeScript : PFUIPanel } } GameObject btnStart; - Transform left, bottom, mid,rmydata; + Transform left, bottom, mid, rmydata; Image leftImage; Image rightImage; float timer = 1.0f; List pullList, historyPullList; - public Dictionary spriteDict,spriteDict2; + public Dictionary spriteDict, spriteDict2; List records; List values; DateTime startTime; @@ -127,7 +127,7 @@ public class RowerHomeScript : PFUIPanel { Id = Guid.NewGuid().ToString(); rowerType = new RowerType() { type = 1, value = 500 }; - + spriteDict = new Dictionary() { {"Start",Resources.Load("Images/RowerNew/ICON_continue_44") }, @@ -201,19 +201,19 @@ public class RowerHomeScript : PFUIPanel UIManager.AddEvent(transform.Find("ResBar/BtnAdd").gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, b => { - if (RowerData != null) + 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) + if (RowerData != null) { slider.GetComponent().SetValue((RowerData.ResistanceLevel - 1 - 50) / 300f); } - + }); slider.GetComponent().valueHandler = (a) => 50 + a * 300; slider.GetComponent().SetValueChanged(r => @@ -240,12 +240,12 @@ public class RowerHomeScript : PFUIPanel }); UIManager.AddEvent(transform.Find("Stopped/DeviceStatus").gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, b => { - if (checkRowing()) return; + //if (checkRowing()) return; UIManager.ShowRowerDevicePanel(); }); UIManager.AddEvent(transform.Find("Stopped/DeviceStatusConnect").gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, b => { - if (checkRowing()) return; + //if (checkRowing()) return; UIManager.ShowRowerDevicePanel(); }); //手机版tab @@ -260,13 +260,13 @@ public class RowerHomeScript : PFUIPanel //return; if (checkRowing()) return; if (C2RowerData.IsEnabled == true && C2RowerData.rowerType != null) return; - UIManager.ShowRowerTaskPanel(type=> + UIManager.ShowRowerTaskPanel(type => { rowerType = type; HandleSelectType(); - },rowerType); + }, rowerType); }, false); - var c2 = new NewMainNav.CustomButton(Resources.Load("Images/RowerNew/记录"), () => + var c2 = new NewMainNav.CustomButton(Resources.Load("Images/RowerNew/记录"), () => { if (checkRowing()) return; UIManager.ShowResultListPanel(); @@ -289,7 +289,7 @@ public class RowerHomeScript : PFUIPanel { Discard(); }); - if (RowerData != null) + if (RowerData != null) { RowerData.PullChanged -= PaintPullCurve; RowerData.PullChanged += PaintPullCurve; @@ -306,9 +306,9 @@ public class RowerHomeScript : PFUIPanel public void ReRow(RowerResultModel r) { this.reRowData = r; - if (r!= null && r.Type.HasValue) + if (r != null && r.Type.HasValue) { - rowerType = new RowerType { type = r.Type.Value,value = (float)r.TypeValue.Value }; + rowerType = new RowerType { type = r.Type.Value, value = (float)r.TypeValue.Value }; if (Rower != null) { Rower.Reset(); @@ -320,15 +320,15 @@ public class RowerHomeScript : PFUIPanel if (rowerType.type == 0) { dw = $"\nM/ 30Min"; - } - else if (rowerType.type == 2) + } + else if (rowerType.type == 2) { dw = $"\nM"; } bottom.Find("Expected/Title").GetComponent().text = $"{App.GetLocalString("EST")}{dw}"; } } - private void DeleteCacheDir() + private void DeleteCacheDir() { //删除实时记录 try @@ -340,12 +340,12 @@ public class RowerHomeScript : PFUIPanel //Directory.Delete(dir, true); } } - catch (Exception e) + catch (Exception e) { Debug.LogError(e.ToString()); } } - private void Discard() + private void Discard() { openTimer = false; if (Application.internetReachability == NetworkReachability.NotReachable) @@ -392,12 +392,17 @@ public class RowerHomeScript : PFUIPanel //Utils.showToast(null, "请滑动划船机并开始", isLowest: true, type: 1); } + protected override void OnDisable() + { + base.OnDisable(); + //App.MainDeviceAdapter.StopScan(); + } public override void Show() { base.Show(); //var mainNav = this.transform.Find("MainNav").GetComponent(); //mainNav.ShowRowerTab(); - + //App.MainDeviceAdapter.StartScan(); transform.MyDOFade(); //Debug.Log("140,开始扫描"); //App.MainDeviceAdapter.StartScan(); @@ -405,18 +410,18 @@ public class RowerHomeScript : PFUIPanel CheckLocalData(); //transform.Find("Left/Rower").GetComponent().StartAnimation(); } - void Disconnect() + void Disconnect() { - foreach(var d in App.MainDeviceAdapter.GetDevices()) + foreach (var d in App.MainDeviceAdapter.GetDevices()) { - if ((d.State == DeviceState.Connected || d.State == DeviceState.Connecting) && (d.Sensor == SensorType.Rower || d.Sensor == SensorType.HeartRate)) + if ((d.State == DeviceState.Connected || d.State == DeviceState.Connecting) && (d.Sensor == SensorType.Rower || d.Sensor == SensorType.HeartRate)) { d.Disconnect(); } } App.MainDeviceAdapter.StopScan(); } - void HandleDiscardDirect() + void HandleDiscardDirect() { openTimer = false; isPause = true; @@ -425,7 +430,7 @@ public class RowerHomeScript : PFUIPanel btnStart.tag = "Start"; Init(); } - void HandleSaveDirect() + void HandleSaveDirect() { openTimer = false; isPause = true; @@ -440,7 +445,7 @@ public class RowerHomeScript : PFUIPanel { if (Save()) Init(); } - else + else { if (SaveFunc(tempRecordData.model, tempRecordData.files)) Init(); } @@ -450,7 +455,7 @@ public class RowerHomeScript : PFUIPanel { Utils.showToast(null, "Press \"Menu\" to save.", int.MaxValue, stopFunc: () => C2RowerData.isReadyStatus, endCallback: f); } - else + else { f.Invoke(); } @@ -459,15 +464,15 @@ public class RowerHomeScript : PFUIPanel int truelyTime = 0; private void StartFunc(object sender, EventArgs e) { - if (UIManager.Instance.confirm!=null && UIManager.Instance.confirm.IsActive()) + if (UIManager.Instance.confirm != null && UIManager.Instance.confirm.IsActive()) { print("当前有弹窗"); return; } - + if (openTimer) return; Id = Guid.NewGuid().ToString(); - if (transform.parent.parent.Find("ModalPanel/RowerWelldone(Clone)") && transform.parent.parent.Find("ModalPanel/RowerWelldone(Clone)").gameObject.activeInHierarchy) + if (transform.parent.parent.Find("ModalPanel/RowerWelldone(Clone)") && transform.parent.parent.Find("ModalPanel/RowerWelldone(Clone)").gameObject.activeInHierarchy) { return; } @@ -479,7 +484,7 @@ public class RowerHomeScript : PFUIPanel } if (!isPause) { - + } if (!openTimer) { @@ -498,9 +503,9 @@ public class RowerHomeScript : PFUIPanel btnStart.GetComponent().sprite = spriteDict["Untagged"]; btnStart.tag = "Untagged"; } - private bool SaveFunc(RowerRecordModel model, List files) + private bool SaveFunc(RowerRecordModel model, List files) { - if (Application.internetReachability == NetworkReachability.NotReachable) + if (Application.internetReachability == NetworkReachability.NotReachable) { transform.Find("Stopped").gameObject.SetActive(true); Utils.showToast(null, App.GetLocalString("Please check the network status!")); @@ -531,11 +536,11 @@ public class RowerHomeScript : PFUIPanel tempRecordData = null; return true; } - public class TempRecordData + public class TempRecordData { public RowerRecordModel model; public List files; - public TempRecordData(RowerRecordModel model, List files) + public TempRecordData(RowerRecordModel model, List files) { this.model = model; this.files = files; @@ -547,15 +552,21 @@ public class RowerHomeScript : PFUIPanel 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; - if (bleDevice != null) + 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.StartTime = createTime.Value.AddSeconds(-values.Count); + if (string.IsNullOrEmpty(shadowids)) + { + model.StartTime = startTime; + } + else + { + model.StartTime = createTime.Value.AddSeconds(-values.Count); + } model.CreateTime = createTime.Value; Debug.Log(values.Count); if (values.Count > 0) @@ -786,7 +797,7 @@ public class RowerHomeScript : PFUIPanel #if !UNITY_EDITOR if (Rower == null) { - HandleDiscardDirect(); + //HandleDiscardDirect(); return; } if (RowerData == null) return; @@ -1251,7 +1262,7 @@ public class RowerHomeScript : PFUIPanel //graph.DataSource.AddPointToCategoryRealtime("Player 2", item.x, item.y); if (M1.localPosition.x == 0) { - rowerGraphChartFeed.SetData(v1, v2); + rowerGraphChartFeed.SetData(v1, v2); } else { diff --git a/Assets/Scripts/UI/Prefab/Rower/RowerDevicePanel.cs b/Assets/Scripts/UI/Prefab/Rower/RowerDevicePanel.cs index 094aa3d2..4817547c 100644 --- a/Assets/Scripts/UI/Prefab/Rower/RowerDevicePanel.cs +++ b/Assets/Scripts/UI/Prefab/Rower/RowerDevicePanel.cs @@ -10,6 +10,7 @@ public class RowerDevicePanel : PFUIPanel { UIManager.AddEvent(transform.Find("Container/Tools/Back").gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, b => { + App.MainDeviceAdapter.StopScan(); Close(); }); }