Skip to content

Commit

Permalink
Flesh out heartrate ChatBox priority and logic
Browse files Browse the repository at this point in the history
  • Loading branch information
VolcanicArts committed Nov 14, 2022
1 parent eb056b2 commit d20ec17
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 8 deletions.
45 changes: 39 additions & 6 deletions VRCOSC.Game/Modules/Modules/Heartrate/HeartRateModule.cs
Original file line number Diff line number Diff line change
@@ -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();

Expand All @@ -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()
Expand All @@ -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<bool>(HeartrateSetting.UseChatBox))
{
if (!IsReceiving)
{
if (!alreadyCleared) ClearChatBox();
alreadyCleared = true;
}
else
{
alreadyCleared = false;

var text = GetSetting<string>(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);

Expand All @@ -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<bool>(HeartrateSetting.UseChatBox))
{
var text = GetSetting<string>(HeartrateSetting.ChatBoxFormat).Replace("%hr%", heartrate.ToString());
SetChatBoxText(text);
}
}

private static int[] toDigitArray(int num, int totalWidth)
Expand Down
2 changes: 1 addition & 1 deletion VRCOSC.Game/Modules/Modules/Media/MediaModule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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!;
Expand Down

0 comments on commit d20ec17

Please sign in to comment.