powerfun-unity/Assets/Scripts/UI/Prefab/Device/ConnectDeviceModal.cs
2021-04-01 11:09:53 +08:00

150 lines
5.7 KiB
C#

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;
public class ConnectDeviceModal : PFUIPanel
{
private float timer = 1.0f;
private SensorType mSensorType = SensorType.None;
public SensorType SensorType {
get {
return mSensorType;
}
set
{
Debug.Log(value);
mSensorType = value;
Logo.sprite = Resources.Load<Sprite>("Images/Devices/Trainer_3");
}
}
private Image Logo;
private UnityEngine.Object deviceItem;
private VerticalLayoutGroup content;
protected override void Awake()
{
base.Awake();
deviceList = new Dictionary<ushort, DeviceItem>();
var closeBtn = this.transform.Find("CloseBtn");
Logo = this.transform.Find("Logo").GetComponent<Image>();
content = this.transform.Find("Panel").Find("Scroll View").Find("Viewport").Find("Content").GetComponent<VerticalLayoutGroup>();
UIManager.AddEvent(closeBtn.gameObject, EventTriggerType.PointerClick, new UnityEngine.Events.UnityAction<BaseEventData>(e =>
{
//this.gameObject.SetActive(false);
this.Close();
}));
deviceItem = Resources.Load("UI/Prefab/Device/DeviceItem");
}
// Start is called before the first frame update
void Start()
{
SearchDevice();
}
private Dictionary<ushort, DeviceItem> deviceList;
// Update is called once per frame
void Update()
{
timer -= Time.deltaTime;
if(timer <= 0)
{
SearchDevice();
timer = 1.0f;
}
}
private void SearchDevice()
{
if (SensorType != SensorType.None)
{
//Debug.Log(AntConnector.Instance().discoveredDevices.Count(d => d.Sensor == SensorType));
var devices = new List<AbstractAntDevice>();
switch (SensorType)
{
case SensorType.Cadence:
devices = AntConnector.Instance().discoveredDevices.Where(d => d.Sensor == SensorType || (d is ICadenceDevice && d.State == DeviceState.Connected)).OrderBy(d=>d.Priority).ToList();
break;
case SensorType.HeartRate:
devices = AntConnector.Instance().discoveredDevices.Where(d => d.Sensor == SensorType || (d is IHeartRateDevice && d.State == DeviceState.Connected)).OrderBy(d => d.Priority).ToList();
break;
case SensorType.Power:
devices = AntConnector.Instance().discoveredDevices.Where(d => d.Sensor == SensorType || (d is IPowerDevice && d.State == DeviceState.Connected)).OrderBy(d=>d.Priority).ToList();
break;
case SensorType.Speed:
break;
case SensorType.SpeedCadence:
devices = AntConnector.Instance().discoveredDevices.Where(d => d.Sensor == SensorType || (d is ISpeedDevice && d.State == DeviceState.Connected)).OrderBy(d => d.Priority).ToList();
break;
case SensorType.Trainer:
devices = AntConnector.Instance().discoveredDevices.Where(d => d.Sensor == SensorType).ToList();
break;
case SensorType.VirtualPower:
break;
}
foreach (var device in devices)
{
if (deviceList.ContainsKey(device.DeviceNumber))
{
continue;
}
var gameObject = (GameObject)Instantiate(deviceItem);
gameObject.transform.SetParent(content.transform);
var deviceItemObj = gameObject.GetComponent<DeviceItem>();
deviceItemObj.DeviceInfo = device;
UIManager.AddEvent(deviceItemObj.gameObject, EventTriggerType.PointerClick, new UnityEngine.Events.UnityAction<BaseEventData>(e =>
{
//deviceItemObj.Select();
if(deviceItemObj.DeviceInfo.Sensor == SensorType)
{
deviceItemObj.DeviceInfo.Connect();
}
deviceItemObj.Set(true);
foreach (var item in deviceList)
{
if(item.Key != deviceItemObj.DeviceInfo.DeviceNumber)
{
item.Value.Set(false);
if(item.Value.DeviceInfo.Sensor == SensorType)
{
item.Value.DeviceInfo.Disconnect();
}
}
}
Close();
}));
//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.DeviceNumber, deviceItemObj);
}
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);
}
}
}
}