From d20ec17f2b78487761979eca731e88dc8322adb4 Mon Sep 17 00:00:00 2001 From: VolcanicArts Date: Mon, 14 Nov 2022 18:39:02 +0000 Subject: [PATCH] Flesh out heartrate ChatBox priority and logic --- .../Modules/Heartrate/HeartRateModule.cs | 45 ++++++++++++++++--- .../Modules/Modules/Media/MediaModule.cs | 2 +- .../SpeechToText/SpeechToTextModule.cs | 2 +- 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/VRCOSC.Game/Modules/Modules/Heartrate/HeartRateModule.cs b/VRCOSC.Game/Modules/Modules/Heartrate/HeartRateModule.cs index 97aade6b..d4b55d63 100644 --- a/VRCOSC.Game/Modules/Modules/Heartrate/HeartRateModule.cs +++ b/VRCOSC.Game/Modules/Modules/Heartrate/HeartRateModule.cs @@ -1,18 +1,27 @@ // Copyright (c) VolcanicArts. Licensed under the GPL-3.0 License. // See the LICENSE file in the repository root for full license text. +using System; using System.Linq; namespace VRCOSC.Game.Modules.Modules.Heartrate; public abstract class HeartRateModule : Module { + private const int heartrateTimeout = 10; + public override string Author => "VolcanicArts"; public override string Prefab => "VRCOSC-Heartrate"; public override ModuleType ModuleType => ModuleType.Health; + protected override int DeltaUpdate => 2000; protected override int ChatBoxPriority => 2; private HeartRateProvider? heartRateProvider; + private int lastHeartrate; + private DateTimeOffset lastHeartrateTime; + private bool alreadyCleared; + + protected bool IsReceiving => lastHeartrateTime + TimeSpan.FromSeconds(heartrateTimeout) >= DateTimeOffset.Now; protected abstract HeartRateProvider CreateHeartRateProvider(); @@ -35,6 +44,9 @@ protected override void OnStart() heartRateProvider.OnDisconnected += () => SendParameter(HeartrateParameter.Enabled, false); heartRateProvider.Initialise(); heartRateProvider.Connect(); + + lastHeartrateTime = DateTimeOffset.Now - TimeSpan.FromSeconds(heartrateTimeout); + alreadyCleared = false; } protected override async void OnStop() @@ -45,8 +57,35 @@ protected override async void OnStop() SendParameter(HeartrateParameter.Enabled, false); } + protected override void OnUpdate() + { + if (!IsReceiving) + { + SendParameter(HeartrateParameter.Enabled, false); + } + + if (GetSetting(HeartrateSetting.UseChatBox)) + { + if (!IsReceiving) + { + if (!alreadyCleared) ClearChatBox(); + alreadyCleared = true; + } + else + { + alreadyCleared = false; + + var text = GetSetting(HeartrateSetting.ChatBoxFormat).Replace("%hr%", lastHeartrate.ToString()); + SetChatBoxText(text); + } + } + } + protected virtual void HandleHeartRateUpdate(int heartrate) { + lastHeartrate = heartrate; + lastHeartrateTime = DateTimeOffset.Now; + var normalisedHeartRate = heartrate / 60.0f; var individualValues = toDigitArray(heartrate, 3); @@ -55,12 +94,6 @@ protected virtual void HandleHeartRateUpdate(int heartrate) SendParameter(HeartrateParameter.Units, individualValues[2] / 10f); SendParameter(HeartrateParameter.Tens, individualValues[1] / 10f); SendParameter(HeartrateParameter.Hundreds, individualValues[0] / 10f); - - if (GetSetting(HeartrateSetting.UseChatBox)) - { - var text = GetSetting(HeartrateSetting.ChatBoxFormat).Replace("%hr%", heartrate.ToString()); - SetChatBoxText(text); - } } private static int[] toDigitArray(int num, int totalWidth) diff --git a/VRCOSC.Game/Modules/Modules/Media/MediaModule.cs b/VRCOSC.Game/Modules/Modules/Media/MediaModule.cs index e77349a2..454a8910 100644 --- a/VRCOSC.Game/Modules/Modules/Media/MediaModule.cs +++ b/VRCOSC.Game/Modules/Modules/Media/MediaModule.cs @@ -17,7 +17,7 @@ public sealed class MediaModule : Module public override string Prefab => "VRCOSC-Media"; protected override int DeltaUpdate => 2000; public override ModuleType ModuleType => ModuleType.Integrations; - protected override int ChatBoxPriority => 2; + protected override int ChatBoxPriority => 3; private readonly MediaProvider mediaProvider = new(); private bool shouldClear; diff --git a/VRCOSC.Game/Modules/Modules/SpeechToText/SpeechToTextModule.cs b/VRCOSC.Game/Modules/Modules/SpeechToText/SpeechToTextModule.cs index 39b48ae9..f2d290f0 100644 --- a/VRCOSC.Game/Modules/Modules/SpeechToText/SpeechToTextModule.cs +++ b/VRCOSC.Game/Modules/Modules/SpeechToText/SpeechToTextModule.cs @@ -17,7 +17,7 @@ public sealed class SpeechToTextModule : Module public override string Description => "Speech to text using VOSK's local processing for VRChat's ChatBox"; public override string Author => "VolcanicArts"; public override ModuleType ModuleType => ModuleType.Accessibility; - protected override int ChatBoxPriority => 3; + protected override int ChatBoxPriority => 4; private readonly SpeechRecognitionEngine speechRecognitionEngine = new(); private VoskRecognizer recognizer = null!;