powerfun-unity/Assets/Scripts/UI/Prefab/Device/ConnectDeviceModal.cs

343 lines
13 KiB
C#
Raw Normal View History

2021-04-01 09:33:19 +08:00
using Assets.Scripts.Devices.Ant;
using System.Collections;
using System.Collections.Generic;
using System;
using System.Linq;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using Assets.Scripts.Devices.Ant.Interfaces;
2021-04-14 15:02:33 +08:00
using Assets.Scripts.UI.Control;
2021-04-27 18:26:30 +08:00
using Assets.Scripts;
using Assets.Scripts.UI.Prefab.Device;
2021-05-19 14:38:48 +08:00
using Assets.Scripts.Devices;
2021-04-01 09:33:19 +08:00
public class ConnectDeviceModal : PFUIPanel
{
2022-05-31 19:43:50 +08:00
private float timer = 0f;
2021-04-01 09:33:19 +08:00
private SensorType mSensorType = SensorType.None;
public SensorType SensorType {
get {
return mSensorType;
}
set
{
mSensorType = value;
2021-04-27 18:26:30 +08:00
var deviceInfoStr = Utils.deviceDict[value.ToString()];
if (deviceInfoStr != null)
{
var deviceInfo = deviceInfoStr.Split('|');
if (deviceInfo.Length == 2)
{
2022-04-02 18:15:09 +08:00
Title.text = App.GetLocalString(deviceInfo[0]);
2021-04-27 18:26:30 +08:00
Logo.sprite = Resources.Load<Sprite>(deviceInfo[1]);
}
}
2021-04-01 09:33:19 +08:00
}
}
private Image Logo;
private UnityEngine.Object deviceItem;
private VerticalLayoutGroup content;
2021-04-15 17:09:35 +08:00
private PfUIButton connectBtn;
private Text connectBtnText;
private Dictionary<string, DeviceItem> deviceList;
2021-04-27 18:26:30 +08:00
private Text noDevice,Title;
2021-04-23 09:22:12 +08:00
private RectTransform searchIconRect;
2022-06-13 18:59:02 +08:00
private GameObject deviceNotFound;
2021-04-01 09:33:19 +08:00
protected override void Awake()
{
base.Awake();
deviceList = new Dictionary<string, DeviceItem>();
var container = this.transform.Find("GameObject");
2022-06-13 18:59:02 +08:00
deviceNotFound = container.Find("Panel/Error").gameObject;
var closeBtn = container.Find("CloseBtn");
Logo = container.Find("Logo").GetComponent<Image>();
2021-04-27 18:26:30 +08:00
Title = container.Find("Title").GetComponent<Text>();
2021-04-14 15:02:33 +08:00
var panel = container.Find("Panel");
content = panel.Find("Scroll View").Find("Viewport").Find("Content").GetComponent<VerticalLayoutGroup>();
2021-04-23 09:22:12 +08:00
noDevice = container.Find("NoDevice").GetComponent<Text>();
2022-05-31 19:43:50 +08:00
noDevice.text = App.GetLocalString("NO DEVICE");
2021-04-23 09:22:12 +08:00
searchIconRect = container.Find("SearchIcon").GetComponent<RectTransform>();
_x = searchIconRect.localPosition.x;
_y = searchIconRect.localPosition.y;
base.SetRounded(panel.GetComponent<Image>().transform, 20f);
2021-04-14 15:02:33 +08:00
2021-04-01 09:33:19 +08:00
UIManager.AddEvent(closeBtn.gameObject, EventTriggerType.PointerClick, new UnityEngine.Events.UnityAction<BaseEventData>(e =>
{
this.Close();
//DestroyImmediate(this.gameObject);
2021-04-01 09:33:19 +08:00
}));
#if UNITY_IOS || UNITY_ANDROID
deviceItem = Resources.Load("UI/Prefab/Device/Mobile/DeviceItem");
#else
2021-04-01 09:33:19 +08:00
deviceItem = Resources.Load("UI/Prefab/Device/DeviceItem");
#endif
2021-04-01 09:33:19 +08:00
2021-04-15 17:09:35 +08:00
connectBtn = container.Find("ConnectBtn").GetComponent<PfUIButton>();
connectBtnText = connectBtn.transform.Find("Text").GetComponent<Text>();
2021-04-14 15:02:33 +08:00
UIManager.AddEvent(connectBtn.gameObject, EventTriggerType.PointerClick, new UnityEngine.Events.UnityAction<BaseEventData>(e =>
{
2021-11-23 14:25:36 +08:00
if (!connectBtnText.text.Equals(App.GetLocalString("DISCONNECT")))
2021-04-14 15:02:33 +08:00
{
foreach (var item in deviceList)
2021-04-14 15:02:33 +08:00
{
if (item.Value.GetStatus() == false)
{
if (SensorType == SensorType.SpeedCadence)
{
if (item.Value.DeviceInfo.Sensor == SensorType.SpeedCadence || item.Value.DeviceInfo.Sensor == SensorType.Cadence)
{
2021-09-15 14:17:11 +08:00
Debug.Log("断开设备" + item.Value.DeviceInfo.Name);
item.Value.DeviceInfo.Disconnect();
DeviceCache.Remove(item.Value.DeviceInfo);
}
}
else if (item.Value.DeviceInfo.Sensor == SensorType)
{
item.Value.DeviceInfo.Disconnect();
DeviceCache.Remove(item.Value.DeviceInfo);
}
}
}
var dd = deviceList.Select(d => d.Value).Where(d => d.GetStatus()).FirstOrDefault();
if (dd != null)
{
2022-06-09 14:51:03 +08:00
var modal = this.gameObject;
dd.DeviceInfo.Connect((error)=> {
Utils.showToast(modal, error);
});
DeviceCache.Add(dd.DeviceInfo);
2021-04-14 15:02:33 +08:00
}
}
else
2021-04-14 15:02:33 +08:00
{
foreach (var item in deviceList)
{
Debug.Log("116" + item.Value.DeviceInfo.Name+ item.Value.GetStatus().ToString());
if (item.Value.GetStatus())
{
if (item.Value.DeviceInfo.Sensor == SensorType)
{
item.Value.DeviceInfo.Disconnect();
Debug.Log("121" + item.Value.DeviceInfo.Name + "断开");
DeviceCache.Remove(item.Value.DeviceInfo);
}
}
}
2021-04-14 15:02:33 +08:00
}
this.Close();
}));
2021-04-01 09:33:19 +08:00
}
// Start is called before the first frame update
2021-04-14 15:02:33 +08:00
protected override void Start()
2021-04-01 09:33:19 +08:00
{
SearchDevice();
}
2021-04-14 15:02:33 +08:00
2021-04-01 09:33:19 +08:00
// Update is called once per frame
void Update()
{
timer -= Time.deltaTime;
if(timer <= 0)
{
SearchDevice();
2022-05-31 19:43:50 +08:00
timer += 1.0f;
2021-04-01 09:33:19 +08:00
}
2021-04-23 09:22:12 +08:00
Move();
2021-04-01 09:33:19 +08:00
}
private void SearchDevice()
{
if (SensorType != SensorType.None)
{
//Debug.Log(AntConnector.Instance().discoveredDevices.Count(d => d.Sensor == SensorType));
2021-05-19 14:38:48 +08:00
var devices = new List<AbstractDevice>();
//var a = AntConnector.Instance().discoveredDevices;
2021-04-01 09:33:19 +08:00
switch (SensorType)
{
case SensorType.SpeedCadence:
2021-04-01 09:33:19 +08:00
case SensorType.Cadence:
2021-08-31 09:09:49 +08:00
devices = App.MainDeviceAdapter.GetDevices().Where(d => (d.Sensor == SensorType.Cadence || d.Sensor == SensorType.SpeedCadence) || (d is ICadenceDevice && d.State == DeviceState.Connected)).OrderBy(d=>d.Priority).ToList();
2021-04-01 09:33:19 +08:00
break;
case SensorType.HeartRate:
2021-05-19 14:38:48 +08:00
devices = App.MainDeviceAdapter.GetDevices().Where(d => d.Sensor == SensorType || (d is IHeartRateDevice && d.State == DeviceState.Connected)).OrderBy(d => d.Priority).ToList();
2021-04-01 09:33:19 +08:00
break;
case SensorType.Power:
2021-05-19 14:38:48 +08:00
devices = App.MainDeviceAdapter.GetDevices().Where(d => d.Sensor == SensorType || (d is IPowerDevice && d.State == DeviceState.Connected)).OrderBy(d=>d.Priority).ToList();
2021-04-01 09:33:19 +08:00
break;
case SensorType.Speed:
2021-05-19 14:38:48 +08:00
devices = App.MainDeviceAdapter.GetDevices().Where(d => d.Sensor == SensorType || (d is ISpeedDevice && d.State == DeviceState.Connected)).OrderBy(d => d.Priority).ToList();
2021-04-01 09:33:19 +08:00
break;
case SensorType.Trainer:
2021-09-23 18:14:53 +08:00
devices = App.MainDeviceAdapter.GetDevices().Where(d => d.Sensor == SensorType && d is ITrainerDevice).ToList();
break;
case SensorType.Rower:
devices = App.MainDeviceAdapter.GetDevices().Where(d => d.Sensor == SensorType && d is IRowerDevice).ToList();
2021-04-01 09:33:19 +08:00
break;
case SensorType.VirtualPower:
break;
}
foreach (var device in devices)
{
if (deviceList.ContainsKey(device.Id))
2021-04-01 09:33:19 +08:00
{
continue;
2021-04-14 15:02:33 +08:00
}
2021-04-01 09:33:19 +08:00
var gameObject = (GameObject)Instantiate(deviceItem);
gameObject.transform.SetParent(content.transform);
gameObject.transform.localScale = new Vector3(1, 1, 1);
2021-04-01 09:33:19 +08:00
var deviceItemObj = gameObject.GetComponent<DeviceItem>();
deviceItemObj.DeviceInfo = device;
2021-04-01 09:33:19 +08:00
UIManager.AddEvent(deviceItemObj.gameObject, EventTriggerType.PointerClick, new UnityEngine.Events.UnityAction<BaseEventData>(e =>
{
deviceItemObj.Set(true);
}));
2021-04-14 15:02:33 +08:00
2021-04-01 09:33:19 +08:00
//UIManager.AddEvent(deviceItemObj.gameObject, EventTriggerType.Deselect, new UnityEngine.Events.UnityAction<BaseEventData>(e =>
//{
// //Debug.Log("de select");
// if(deviceItemObj.DeviceInfo.Sensor == SensorType)
// {
// deviceItemObj.DeviceInfo.Disconnect();
// }
//}));
deviceList.Add(device.Id, deviceItemObj);
2021-04-01 09:33:19 +08:00
}
2022-06-09 14:51:03 +08:00
//删除扫描不到的设备
var needRemove = deviceList.Where(q => !devices.Select(n => n.Id).Contains(q.Key)).ToList();
if (needRemove.Count > 0)
{
var currentlist = FindObjectsOfType<DeviceItem>();
foreach (var item in needRemove)
{
deviceList.Remove(item.Key);
var current = currentlist.Where(e => e.Id == item.Key).FirstOrDefault();
if (current != null)
{
current.gameObject.Destroy(true);
}
}
}
2021-04-01 09:33:19 +08:00
if(deviceList.All(d=>d.Value.GetStatus() == false))
2021-04-01 09:33:19 +08:00
{
2021-04-14 15:02:33 +08:00
var firstDevice = deviceList.Select(d => d.Value).Where(d => d.DeviceInfo.State == DeviceState.Connected).OrderByDescending(d => d.DeviceInfo.Priority).FirstOrDefault();
if (firstDevice != null)
{
firstDevice.Set(true);
}
else
{
var defaultDevice = deviceList.FirstOrDefault();
if (defaultDevice.Value != null)
{
defaultDevice.Value.Set(true);
}
}
//DeviceItem firstDevice;
//var devicesTemp = deviceList.Select(d => d.Value).Where(d => d.DeviceInfo.State == DeviceState.Connected);
//if(SensorType == SensorType.Cadence || SensorType == SensorType.SpeedCadence)
//{
// firstDevice = devicesTemp.FirstOrDefault(d=>d)
//}
2021-04-01 09:33:19 +08:00
}
//如果没有可连接的设备按钮只读
connectBtn.mButton.enabled = deviceList.Count > 0;
connectBtn.mButton.interactable = deviceList.Count > 0;
2022-06-13 18:59:02 +08:00
deviceNotFound.SetActive(deviceList.Count <= 0);
2021-04-01 09:33:19 +08:00
}
}
//选中需要连接的设备
public void SelectDevice(DeviceItem deviceItemObj)
{
var trainer = SensorType == SensorType.Trainer && deviceItemObj.DeviceInfo.State == DeviceState.Connected;
var nontrainer = deviceItemObj.DeviceInfo.Sensor != SensorType.Trainer && SensorType != SensorType.Trainer && deviceItemObj.DeviceInfo.State == DeviceState.Connected;
if (trainer || nontrainer)
{
connectBtnText.text = App.GetLocalString("DISCONNECT");
connectBtnText.GetComponent<PFUIText>().key = "DISCONNECT";
}
else
{
connectBtnText.text = App.GetLocalString("CONNECT");
connectBtnText.GetComponent<PFUIText>().key = "CONNECT";
}
foreach (var item in deviceList)
{
if (item.Key != deviceItemObj.DeviceInfo.Id)
{
item.Value.Set(false);
}
}
2022-05-31 19:43:50 +08:00
2022-06-08 13:05:56 +08:00
noDevice.text = deviceItemObj.DeviceInfo.Name;
2022-05-31 19:43:50 +08:00
if (deviceItemObj.DeviceInfo.State == DeviceState.Connected)
{
noDevice.color = Color.white;
}
else
{
noDevice.color = Utils.HexToColor("5C5C6E");
}
}
2021-04-14 15:02:33 +08:00
public override void Show()
{
base.Show();
}
2021-04-14 15:02:33 +08:00
public override void Close()
{
base.Close();
//DestroyImmediate(this.gameObject);
Destroy(this.gameObject);
2021-04-14 15:02:33 +08:00
}
2021-04-23 09:22:12 +08:00
float time = 0;
float _x = 0;
float _y = 0;
/// <summary>
/// 做search动画
/// </summary>
2021-04-23 09:22:12 +08:00
void Move()
{
var hudu = (2 * Mathf.PI / 360) * 1 * time;
var x = _x + Mathf.Sin(hudu) * 8f;
var y = _y + Mathf.Cos(hudu) * 8f;
var rect = searchIconRect.localPosition;
//rect.x = x;
//rect.y = y;
rect.x = x;
rect.y = y;
searchIconRect.localPosition = rect;
time += 1.8f;
//Debug.Log(x + ", " + y);
//yield return null;
}
2021-04-01 09:33:19 +08:00
}