using System;
using System.Collections;
using System.Collections.Generic;
using AppUI.Bluetooth;
using AppUI.Manager.View;
using SmartBowSDK;
using UnityEngine;
using UnityEngine.UI;
using BLEAimhandler = AppUI.Bluetooth.AimHandler;
namespace AppUI.View.NineAxis
{
/// 九轴地磁校准引导(AppUI);调用方式对齐 DemoStarter.StartMagCalibration。
public class MagGuidanceView : MonoBehaviour
{
const float ModuleInitWaitSeconds = 12f;
const float MagProgressGuideSeconds = 20f;
const float MagCalibrateTimeoutSeconds = 120f;
[SerializeField] Button btnMagCalibrate;
[SerializeField] GameObject prefab_MagInterferenceTipView;
[SerializeField] List layouts;
TextAutoLanguage2 _textAutoLanguage2;
BLEAimhandler _aim;
SmartBowDeviceHub _hub;
bool _startResetMag;
bool _calibrateMagDoing;
bool _sensorsReady;
float _calibrateMagStartTime;
[NonSerialized] public int flag_MagCalibarateOperateAndFinish = -1;
public Action action_MagCalibarateOperateAndFinish;
public Func action_OnClickMagCalibrateInterceptor;
void Start()
{
SmartBowDeviceHub.EnsureReady();
_hub = SmartBowDeviceHub.ins;
_aim = _hub?.Aim;
btnMagCalibrate.onClick.AddListener(OnClickResetMag);
_textAutoLanguage2 = btnMagCalibrate.transform.Find("Text").GetComponent();
RefreshButtonLabel();
ShowDeviceLayout(_aim != null && _aim.GetActivePlayerDeviceType() == (int)AimDeviceType.ARTEMIS ? 1 : 0);
StartCoroutine(WaitForSensorsReady());
}
IEnumerator WaitForSensorsReady()
{
float elapsed = 0f;
while (elapsed < ModuleInitWaitSeconds)
{
if (_hub != null && _hub.EnsureNineAxisSensorsStarted())
{
_sensorsReady = true;
yield break;
}
elapsed += Time.unscaledDeltaTime;
yield return null;
}
Debug.LogWarning("[MagGuidanceView] 等待模块初始化/九轴传感开启超时。");
}
void RefreshButtonLabel()
{
if (_textAutoLanguage2 == null || _aim == null)
return;
_textAutoLanguage2.SetTextKey(_aim.IsSdkMagCompleted()
? "Mag_Reinitialize"
: "Mag_Initialization");
}
void ShowDeviceLayout(int index)
{
for (int i = 0; i < layouts.Count; i++)
layouts[i].SetActive(index == i);
}
void Update()
{
if (_aim == null)
return;
if (!_sensorsReady && _hub != null)
_sensorsReady = _hub.EnsureNineAxisSensorsStarted();
if (!_startResetMag)
return;
UpdateMagProgress();
}
void OnClickResetMag()
{
if (action_OnClickMagCalibrateInterceptor != null
&& action_OnClickMagCalibrateInterceptor.Invoke())
return;
if (!IsDeviceConnected())
{
PopupMgr.ins.ShowTipTop(TextAutoLanguage2.GetTextByKey("device-calibrate_n-connect"));
return;
}
if (!_sensorsReady && (_hub == null || !_hub.EnsureNineAxisSensorsStarted()))
{
PopupMgr.ins.ShowTipTop(TextAutoLanguage2.GetTextByKey("device-calibrate_n-connect"));
return;
}
if (_calibrateMagDoing)
{
_calibrateMagDoing = false;
_startResetMag = false;
_textAutoLanguage2.SetTextKey("Mag_Initialization");
return;
}
if (_aim != null && !_aim.IsSdkGyrCompleted())
{
PopupMgr.ins.ShowTipTop(TextAutoLanguage2.GetTextByKey("Gyro_Initialization"));
return;
}
// DemoStarter:每次点击 StartMagCalibration 重置并开始地磁校准
_calibrateMagStartTime = Time.realtimeSinceStartup;
if (_aim == null || !_aim.TryStartMagCalibration())
{
PopupMgr.ins.ShowTipTop(TextAutoLanguage2.GetTextByKey("device-calibrate_n-connect"));
return;
}
_calibrateMagDoing = true;
_startResetMag = true;
flag_MagCalibarateOperateAndFinish = 0;
}
bool IsDeviceConnected()
{
if (_hub == null)
return false;
return _hub.IsConnected(_hub.GetActivePlayer());
}
void CancelResetMag()
{
_calibrateMagDoing = false;
}
void ShowMagInterferenceTip()
{
if (prefab_MagInterferenceTipView == null)
return;
GameObject tip = Instantiate(prefab_MagInterferenceTipView);
JCUnityLib.CanvasUtils.PlusSortOrder(gameObject, tip, 1);
}
void UpdateMagProgress()
{
if (_aim.IsSdkMagCompleted())
{
_textAutoLanguage2.SetTextKey("Mag_Success");
if (_calibrateMagDoing)
CancelResetMag();
if (flag_MagCalibarateOperateAndFinish != 0)
{
_startResetMag = false;
return;
}
flag_MagCalibarateOperateAndFinish = 1;
action_MagCalibarateOperateAndFinish?.Invoke();
_startResetMag = false;
ReturnToDeviceView();
return;
}
if (!_calibrateMagDoing)
{
_textAutoLanguage2.SetTextKey("Mag_Initialization");
_startResetMag = false;
return;
}
float doingTime = Time.realtimeSinceStartup - _calibrateMagStartTime;
if (doingTime >= MagCalibrateTimeoutSeconds)
{
_textAutoLanguage2.SetTextKey("Mag_Fail");
CancelResetMag();
ShowMagInterferenceTip();
PopupMgr.ins.ShowTipTop(TextAutoLanguage2.GetTextByKey("tip_mag-calibrate_please-leave-interfere"));
_startResetMag = false;
return;
}
int progress = Mathf.Min(
99,
Mathf.FloorToInt(doingTime / MagProgressGuideSeconds * 100f));
_textAutoLanguage2.textFormatArgs = new object[] { progress };
_textAutoLanguage2.SetTextKey("Mag_Initializing2");
}
void ReturnToDeviceView()
{
ViewManager.HideView(UIViewType.MagGuidanceView);
ViewManager.ShowView(UIViewType.DeviceView);
}
public void OnClick_Back()
{
AudioMgr.ins.PlayBtn();
ViewManager.HideView(UIViewType.MagGuidanceView);
}
}
}