/************************************************************************************************** * Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved. * * Your use of this SDK or tool is subject to the Oculus SDK License Agreement, available at * https://developer.oculus.com/licenses/oculussdk/ * * Unless required by applicable law or agreed to in writing, the Utilities SDK distributed * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF * ANY KIND, either express or implied. See the License for the specific language governing * permissions and limitations under the License. **************************************************************************************************/ using System; using UnityEngine; using UnityEngine.UI; namespace Oculus.Voice.Demo.BuiltInDemo { /// /// Represents a countdown timer. /// public class TimerController : MonoBehaviour { private float _time = 0; // [sec] current time of the countdown timer. private bool _timerExist = false; private bool _timerRunning = false; [Tooltip("The UI text element to show app messages.")] public Text logText; [Tooltip("The timer ring sound.")] public AudioClip buzzSound; // Update is called once per frame void Update() { if (_timerExist && _timerRunning) { _time -= Time.deltaTime; if (_time < 0) { // Raise a ring. OnElapsedTime(); } } } private void Log(string msg) { Debug.Log(msg); logText.text = msg; } /// /// Buzzes and resets the timer. /// private void OnElapsedTime() { _time = 0; _timerRunning = false; _timerExist = false; Log("Buzz!"); AudioSource.PlayClipAtPoint(buzzSound, Vector3.zero); } /// /// Deletes the timer. It corresponds to the wit intent "wit$delete_timer" /// public void DeleteTimer() { if (!_timerExist) { Log("Error: There is no timer to delete."); return; } _timerExist = false; _time = 0; _timerRunning = false; Log("Timer deleted."); } /// /// Creates a timer. It corresponds to the wit intent "wit$create_timer" /// /// countdown in minutes. public void CreateTimer(string[] entityValues) { if (_timerExist) { Log("A timer already exist."); return; } if (ParseTime(entityValues, out _time)) { _timerExist = true; _timerRunning = true; Log($"Countdown Timer is set for {entityValues[0]} {entityValues[1]}(s)."); } else { Log("Error in CreateTimer(): Could not parse wit reply."); } } /// /// Displays current timer value. It corresponds to "wit$get_timer". /// public void GetTimerIntent() { // Show the remaining time of the countdown timer. var msg = GetFormattedTimeFromSeconds(); Log(msg); } /// /// Pauses the timer. It corresponds to the wit intent "wit$pause_timer" /// public void PauseTimer() { _timerRunning = false; Log("Timer paused."); } /// /// It corresponds to the wit intent "wit$resume_timer" /// public void ResumeTimer() { _timerRunning = true; Log("Timer resumed."); } /// /// Subtracts time from the timer. It corresponds to the wit intent "wit$subtract_time_timer". /// /// public void SubtractTimeTimer(string[] entityValues) { if (!_timerExist) { Log("Error: No Timer is created."); return; } if (ParseTime(entityValues, out var time)) { var msg = $"{entityValues[0]} {entityValues[1]}(s) were subtracted from the timer."; _time -= time; if (_time < 0) { _time = 0; Log(msg); return; } Log(msg); } else { Log("Error in Subtract_time_timer(): Could not parse the wit reply."); } } /// /// Adds time to the timer. It corresponds to the wit intent "wit$add_time_timer". /// /// public void AddTimeToTimer(string[] entityValues) { if (!_timerExist) { Log("Error: No Timer is created."); return; } if (ParseTime(entityValues, out var time)) { _time += time; var msg = $"{entityValues[0]} {entityValues[1]}(s) were added to the timer."; Log(msg); } else { Log("Error in AddTimeToTimer(): Could not parse with reply."); } } /// /// Returns the remaining time (in sec) of the countdown timer. /// /// public float GetRemainingTime() { return _time; } /// /// Returns time in the format of min:sec. /// /// public string GetFormattedTimeFromSeconds() { return TimeSpan.FromSeconds(_time).ToString(); } /// /// Parses entity values to get a resulting time value in seconds /// /// The entity value results from a Response Handler /// The parsed time /// The parsed time in seconds or the current value of _time /// private bool ParseTime(string[] entityValues, out float time) { time = _time; if (entityValues.Length > 0 && float.TryParse(entityValues[0], out time)) { if (entityValues.Length < 2) { throw new ArgumentException("Entities being parsed must include time value and unit."); } // If entity was not included in the result it will be empty, but the array will still be size 2 if (!string.IsNullOrEmpty(entityValues[1])) { switch (entityValues[1]) { case "minute": time *= 60; break; case "hour": time *= 60 * 60; break; } } return true; } return false; } } }