Files
Aether-Engine/Assets/Scripts/Debug/PM5TestUI.cs
2026-02-20 17:53:43 +01:00

84 lines
3.0 KiB
C#

using UnityEngine;
using TMPro;
using UnityEngine.UI;
public class PM5TestUI : MonoBehaviour
{
[Header("UI References")]
[SerializeField] private TMP_Text wattsText;
[SerializeField] private TMP_Text spmText;
[SerializeField] private TMP_Text distanceText;
[SerializeField] private TMP_Text hrText; // NEW
[SerializeField] private TMP_Text caloriesText; // NEW
[SerializeField] private TMP_Text statusText;
[SerializeField] private Image statusIndicator;
[SerializeField] private Button connectButton;
[Header("Logging")]
[SerializeField] private Transform logContent;
[SerializeField] private GameObject logItemPrefab;
private void Start()
{
if (PerformanceMonitorManager.Instance != null)
{
PerformanceMonitorManager.Instance.OnLog += AddLog;
PerformanceMonitorManager.Instance.OnConnectionStateChanged += UpdateStatusUI;
PerformanceMonitorManager.Instance.OnStatsUpdated += UpdateDashboard;
}
connectButton.onClick.AddListener(() => {
PerformanceMonitorManager.Instance.StartScan();
});
UpdateStatusUI(false);
}
private void UpdateDashboard(PerformanceMonitorManager.RowingStats stats)
{
UnityMainThreadDispatcher.Instance().Enqueue(() => {
if (wattsText) wattsText.text = $"{stats.Watts} W";
if (spmText) spmText.text = $"{stats.SPM} s/m";
if (distanceText) distanceText.text = $"{stats.Distance:F0} m";
if (hrText) hrText.text = stats.HeartRate > 0 ? $"{stats.HeartRate} bpm" : "--";
if (caloriesText) caloriesText.text = $"{stats.Calories} cal";
});
}
private void UpdateStatusUI(bool isConnected)
{
UnityMainThreadDispatcher.Instance().Enqueue(() => {
if (statusText)
{
statusText.text = isConnected ? "CONNECTED" : "DISCONNECTED";
statusText.color = isConnected ? Color.green : Color.red;
}
if (statusIndicator)
statusIndicator.color = isConnected ? Color.green : Color.red;
if (connectButton)
connectButton.interactable = !isConnected;
});
}
private void AddLog(string message)
{
UnityMainThreadDispatcher.Instance().Enqueue(() => {
if (logContent == null || logItemPrefab == null) return;
// Optional: Limit log size to prevent lag
if (logContent.childCount > 20)
Destroy(logContent.GetChild(0).gameObject);
GameObject newItem = Instantiate(logItemPrefab, logContent);
TMP_Text txt = newItem.GetComponent<TMP_Text>();
if (txt) txt.text = $"[{System.DateTime.Now:HH:mm:ss}] {message}";
Canvas.ForceUpdateCanvases();
ScrollRect sr = logContent.GetComponentInParent<ScrollRect>();
if (sr) sr.verticalNormalizedPosition = 0f;
});
}
}