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(); 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(); } }