-
Notifications
You must be signed in to change notification settings - Fork 16
Expand file tree
/
Copy pathMonitorCanvas.cs
More file actions
144 lines (122 loc) · 4.83 KB
/
MonitorCanvas.cs
File metadata and controls
144 lines (122 loc) · 4.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
using BlobHandles;
using OscCore;
using VRC.OSCQuery.Samples.Shared;
#pragma warning disable 4014
namespace VRC.OSCQuery.Examples.OSCQueryExplorerUnity
{
public class MonitorCanvas : MonoBehaviour
{
// Scnene references
public Text HeaderText;
public Text InfoText;
// OSCQuery and OSC members
private OSCQueryService _oscQuery;
private OscServer _receiver;
// Message members
private Dictionary<BlobString, string> _messagesValues = new Dictionary<BlobString, string>();
private bool _messagesDirty;
public int maxMessages = 10;
void Start()
{
StartService();
}
/// <summary>
/// Creates new OSCQuery and OSC services, advertises itself to receive messages
/// </summary>
private void StartService()
{
// Construct unique server name
var w = new Bogus.DataSets.Hacker();
var w2 = new Bogus.DataSets.Lorem();
var serverName = $"{w.IngVerb().UpperCaseFirstChar()}-{w2.Word().UpperCaseFirstChar()}-{w.Abbreviation()}";
// Create OSC Server on available port
var port = Extensions.GetAvailableTcpPort();
var udpPort = Extensions.GetAvailableUdpPort();
_receiver = OscServer.GetOrCreate(udpPort);
// Listen to all incoming messages
_receiver.AddMonitorCallback(OnMessageReceived);
var logger = new UnityMSLogger();
#if UNITY_ANDROID
IDiscovery discovery = new AndroidDiscovery();
#else
IDiscovery discovery = new MeaModDiscovery(logger);
#endif
_oscQuery = new OSCQueryServiceBuilder()
.WithServiceName(serverName)
.WithHostIP(Samples.Shared.Extensions.GetLocalIPAddress())
.WithOscIP(VRC.OSCQuery.Samples.Shared.Extensions.GetLocalIPAddressNonLoopback())
.WithTcpPort(port)
.WithUdpPort(udpPort)
.WithLogger(logger)
.WithDiscovery(discovery)
.StartHttpServer()
.AdvertiseOSC()
.AdvertiseOSCQuery()
.Build();
_oscQuery.RefreshServices();
_oscQuery.OnOscQueryServiceAdded += profile =>
HeaderText.text += $"\nfound service {profile.name} at {profile.port} on {profile.address}";
// Show server name and chosen port
HeaderText.text = $"{serverName} running at tcp:{port} osc: {udpPort}";
_oscQuery.AddEndpoint<string>("/avatar/change", Attributes.AccessValues.WriteOnly);
}
// Process incoming messages, add to message queue
private void OnMessageReceived(BlobString address, OscMessageValues values)
{
Debug.Log($"Received {address}");
string message = $"{address} : ";
values.ForEachElement((i, typeTag) => message += $" {GetStringForValue(values, i, typeTag)}");
if (_messagesValues.ContainsKey(address))
{
_messagesValues[address] = message;
}
else
{
_messagesValues.Add(address, message);
}
_messagesDirty = true;
}
// Gets string representations of some OSC types for display
private string GetStringForValue(OscMessageValues values, int i, TypeTag typeTag)
{
switch (typeTag)
{
case TypeTag.Int32:
return values.ReadIntElement(i).ToString();
case TypeTag.String:
return values.ReadStringElement(i);
case TypeTag.True:
case TypeTag.False:
return values.ReadBooleanElement(i).ToString();
case TypeTag.Float32:
return values.ReadFloatElement(i).ToString();
default:
return "";
}
}
// Check for message updates, which can happen on a background thread.
private void Update()
{
if (_messagesDirty)
{
_messagesDirty = false;
while (_messagesValues.Count > maxMessages)
{
_messagesValues.Remove(_messagesValues.Keys.First());
}
InfoText.text = string.Join(Environment.NewLine, _messagesValues.Values);
}
}
// Dispose of the two items we created in Start
private void OnDestroy()
{
_receiver.Dispose();
_oscQuery.Dispose();
}
}
}