132 lines
3.8 KiB
C#
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();
|
|
}
|
|
} |