DCDC/Assets/Scripts/ActionsManager.cs
2026-02-23 00:40:45 +01:00

132 lines
3.8 KiB
C#

using System;
using M2MqttUnity;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using uPLibrary.Networking.M2Mqtt.Messages;
public class ActionsManager : M2MqttUnityClient
{
public const string MqttBroker = "broker.emqx.io";
private const string TriggerWaterActionTopic = "steves_test_server_99/trigger_watering_action";
private ApplicationManager _applicationManager;
public TextMeshProUGUI wateringAmountLabel;
public Slider wateringAmountSlider;
public GameObject submitButton;
public NetworkedSlider networkedSlider;
private bool _isUpdatingFromNetwork = false;
protected override void Awake()
{
_applicationManager = FindFirstObjectByType<ApplicationManager>();
if (_applicationManager == null) Debug.LogError("[DCDC] ApplicationManager component not found.");
}
private void OnValidate()
{
brokerAddress = MqttBroker;
autoConnect = true;
}
protected override void Start()
{
AddUiMessage("Ready.");
base.Start();
}
private void FixedUpdate()
{
if (_applicationManager.IsHost == true)
{
// watering action for host to trigger
if (!submitButton.activeSelf) submitButton.SetActive(true);
}
else
{
// only client can set watering amount
if (!wateringAmountSlider.interactable) wateringAmountSlider.interactable = true;
}
}
public void OnWateringAmountSliderValueChanged()
{
if (wateringAmountLabel != null && wateringAmountSlider != null)
{
wateringAmountLabel.text = wateringAmountSlider.value.ToString("F1");
}
// Propagate the new value to the networked slider so other clients see it
// Guard against feedback loop when the network itself updates the slider UI
if (networkedSlider != null && !_isUpdatingFromNetwork)
{
networkedSlider.SetSliderValue(wateringAmountSlider.value);
}
}
// Call this from NetworkedSlider.ApplySliderEffect to sync UI when a remote value arrives
public void OnNetworkSliderValueReceived(float value)
{
_isUpdatingFromNetwork = true;
if (wateringAmountSlider != null)
wateringAmountSlider.value = value;
if (wateringAmountLabel != null)
wateringAmountLabel.text = value.ToString("F1");
_isUpdatingFromNetwork = false;
}
public void TriggerWatering()
{
if (client == null || !client.IsConnected)
{
AddUiMessage("Cannot trigger watering: MQTT client is not connected.", true);
return;
}
var amount = wateringAmountSlider != null ? wateringAmountSlider.value.ToString("F1") : "0";
client.Publish(TriggerWaterActionTopic, System.Text.Encoding.UTF8.GetBytes(amount),
MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, false);
AddUiMessage("Triggered watering action.");
}
private static void AddUiMessage(string msg, bool isError = false)
{
if (isError) Debug.LogError("MQTT: " + msg);
else Debug.LogWarning("MQTT: " + msg);
}
protected override void OnConnecting()
{
base.OnConnecting();
AddUiMessage("Connecting to broker on " + brokerAddress + ":" + brokerPort);
}
protected override void OnConnected()
{
base.OnConnected();
AddUiMessage("Connected to broker on " + brokerAddress);
}
protected override void OnConnectionFailed(string errorMessage)
{
AddUiMessage("CONNECTION FAILED! " + errorMessage, true);
}
protected override void OnDisconnected()
{
AddUiMessage("Disconnected.");
}
protected override void OnConnectionLost()
{
AddUiMessage("CONNECTION LOST!", true);
}
private void OnDestroy()
{
Disconnect();
}
}