fix some typos, change devicedata to userdata, change devicefieldlistener to use enum
parent
e555a996f8
commit
d8656a78d4
|
|
@ -34,7 +34,7 @@ namespace VELConnect
|
||||||
public string id;
|
public string id;
|
||||||
public string username;
|
public string username;
|
||||||
public string created;
|
public string created;
|
||||||
public string updted;
|
public string updated;
|
||||||
}
|
}
|
||||||
|
|
||||||
public class Device
|
public class Device
|
||||||
|
|
@ -42,7 +42,6 @@ namespace VELConnect
|
||||||
[CanBeNull] public readonly string id;
|
[CanBeNull] public readonly string id;
|
||||||
[CanBeNull] public string created = null;
|
[CanBeNull] public string created = null;
|
||||||
[CanBeNull] public string updated = null;
|
[CanBeNull] public string updated = null;
|
||||||
[CanBeNull] public string device_id;
|
|
||||||
[CanBeNull] public string os_info;
|
[CanBeNull] public string os_info;
|
||||||
[CanBeNull] public string friendly_name;
|
[CanBeNull] public string friendly_name;
|
||||||
[CanBeNull] public string modified_by;
|
[CanBeNull] public string modified_by;
|
||||||
|
|
@ -50,8 +49,10 @@ namespace VELConnect
|
||||||
[CanBeNull] public string current_room;
|
[CanBeNull] public string current_room;
|
||||||
[CanBeNull] public string pairing_code;
|
[CanBeNull] public string pairing_code;
|
||||||
[CanBeNull] public string last_online;
|
[CanBeNull] public string last_online;
|
||||||
|
[CanBeNull] public string owner;
|
||||||
|
[CanBeNull] public string[] past_owners;
|
||||||
[CanBeNull] public DeviceExpand expand;
|
[CanBeNull] public DeviceExpand expand;
|
||||||
public DataBlock deviceData => expand?.data;
|
public DataBlock userData => expand?.data;
|
||||||
|
|
||||||
public class DeviceExpand
|
public class DeviceExpand
|
||||||
{
|
{
|
||||||
|
|
@ -65,7 +66,7 @@ namespace VELConnect
|
||||||
public string TryGetData(string key)
|
public string TryGetData(string key)
|
||||||
{
|
{
|
||||||
string val = null;
|
string val = null;
|
||||||
return deviceData.data?.TryGetValue(key, out val) == true ? val : null;
|
return userData.data?.TryGetValue(key, out val) == true ? val : null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -107,28 +108,33 @@ namespace VELConnect
|
||||||
|
|
||||||
public enum DeviceField
|
public enum DeviceField
|
||||||
{
|
{
|
||||||
device_id,
|
id,
|
||||||
os_info,
|
os_info,
|
||||||
friendly_name,
|
friendly_name,
|
||||||
modified_by,
|
modified_by,
|
||||||
current_app,
|
current_app,
|
||||||
current_room,
|
current_room,
|
||||||
pairing_code,
|
pairing_code,
|
||||||
last_online
|
last_online,
|
||||||
|
data,
|
||||||
|
owner,
|
||||||
|
past_owners
|
||||||
}
|
}
|
||||||
|
|
||||||
public State lastState;
|
private State lastState;
|
||||||
public State state;
|
private State state;
|
||||||
|
|
||||||
|
[CanBeNull] public static State CurrentState => instance == null ? null : instance.state;
|
||||||
|
|
||||||
public static Action<State> OnInitialState;
|
public static Action<State> OnInitialState;
|
||||||
public static Action<string, string> OnDeviceFieldChanged;
|
public static Action<DeviceField, string> OnDeviceFieldChanged;
|
||||||
public static Action<string, object> OnDeviceDataChanged;
|
public static Action<string, object> OnUserDataChanged;
|
||||||
public static Action<string, object> OnRoomDataChanged;
|
public static Action<string, object> OnRoomDataChanged;
|
||||||
|
|
||||||
private static readonly Dictionary<string, List<CallbackListener>> deviceFieldCallbacks =
|
private static readonly Dictionary<DeviceField, List<CallbackListener>> deviceFieldCallbacks =
|
||||||
new Dictionary<string, List<CallbackListener>>();
|
new Dictionary<DeviceField, List<CallbackListener>>();
|
||||||
|
|
||||||
private static readonly Dictionary<string, List<CallbackListener>> deviceDataCallbacks =
|
private static readonly Dictionary<string, List<CallbackListener>> userDataCallbacks =
|
||||||
new Dictionary<string, List<CallbackListener>>();
|
new Dictionary<string, List<CallbackListener>>();
|
||||||
|
|
||||||
private static readonly Dictionary<string, List<CallbackListener>> roomDataCallbacks =
|
private static readonly Dictionary<string, List<CallbackListener>> roomDataCallbacks =
|
||||||
|
|
@ -274,11 +280,13 @@ namespace VELConnect
|
||||||
string oldValue = lastState != null
|
string oldValue = lastState != null
|
||||||
? fieldInfo.GetValue(lastState.device) as string
|
? fieldInfo.GetValue(lastState.device) as string
|
||||||
: null;
|
: null;
|
||||||
if (newValue != oldValue)
|
|
||||||
|
DeviceField fieldName;
|
||||||
|
if (Enum.TryParse(fieldInfo.Name, out fieldName) && newValue != oldValue)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (!isInitialState) OnDeviceFieldChanged?.Invoke(fieldInfo.Name, newValue);
|
if (!isInitialState) OnDeviceFieldChanged?.Invoke(fieldName, newValue);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
|
@ -286,13 +294,13 @@ namespace VELConnect
|
||||||
}
|
}
|
||||||
|
|
||||||
// send specific listeners data
|
// send specific listeners data
|
||||||
if (deviceFieldCallbacks.ContainsKey(fieldInfo.Name))
|
if (deviceFieldCallbacks.ContainsKey(fieldName))
|
||||||
{
|
{
|
||||||
// clear the list of old listeners
|
// clear the list of old listeners
|
||||||
deviceFieldCallbacks[fieldInfo.Name].RemoveAll(e => e.keepAliveObject == null);
|
deviceFieldCallbacks[fieldName].RemoveAll(e => e.keepAliveObject == null);
|
||||||
|
|
||||||
// send the callbacks
|
// send the callbacks
|
||||||
deviceFieldCallbacks[fieldInfo.Name].ForEach(e =>
|
foreach (CallbackListener e in deviceFieldCallbacks[fieldName])
|
||||||
{
|
{
|
||||||
if (!isInitialState || e.sendInitialState)
|
if (!isInitialState || e.sendInitialState)
|
||||||
{
|
{
|
||||||
|
|
@ -305,22 +313,22 @@ namespace VELConnect
|
||||||
Debug.LogError(ex);
|
Debug.LogError(ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state.device.deviceData.data != null)
|
if (state.device.userData.data != null)
|
||||||
{
|
{
|
||||||
foreach (KeyValuePair<string, string> elem in state.device.deviceData.data)
|
foreach (KeyValuePair<string, string> elem in state.device.userData.data)
|
||||||
{
|
{
|
||||||
string oldValue = null;
|
string oldValue = null;
|
||||||
lastState?.device?.deviceData?.data?.TryGetValue(elem.Key, out oldValue);
|
lastState?.device?.userData?.data?.TryGetValue(elem.Key, out oldValue);
|
||||||
if (elem.Value != oldValue)
|
if (elem.Value != oldValue)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (!isInitialState) OnDeviceDataChanged?.Invoke(elem.Key, elem.Value);
|
if (!isInitialState) OnUserDataChanged?.Invoke(elem.Key, elem.Value);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|
@ -328,13 +336,13 @@ namespace VELConnect
|
||||||
}
|
}
|
||||||
|
|
||||||
// send specific listeners data
|
// send specific listeners data
|
||||||
if (deviceDataCallbacks.ContainsKey(elem.Key))
|
if (userDataCallbacks.ContainsKey(elem.Key))
|
||||||
{
|
{
|
||||||
// clear the list of old listeners
|
// clear the list of old listeners
|
||||||
deviceDataCallbacks[elem.Key].RemoveAll(e => e.keepAliveObject == null);
|
userDataCallbacks[elem.Key].RemoveAll(e => e.keepAliveObject == null);
|
||||||
|
|
||||||
// send the callbacks
|
// send the callbacks
|
||||||
deviceDataCallbacks[elem.Key].ForEach(e =>
|
foreach (CallbackListener e in userDataCallbacks[elem.Key])
|
||||||
{
|
{
|
||||||
if (!isInitialState || e.sendInitialState)
|
if (!isInitialState || e.sendInitialState)
|
||||||
{
|
{
|
||||||
|
|
@ -347,7 +355,7 @@ namespace VELConnect
|
||||||
Debug.LogError(ex);
|
Debug.LogError(ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -355,9 +363,10 @@ namespace VELConnect
|
||||||
// on the initial state, also activate callbacks for null values
|
// on the initial state, also activate callbacks for null values
|
||||||
if (isInitialState)
|
if (isInitialState)
|
||||||
{
|
{
|
||||||
foreach ((string deviceDataKey, List<CallbackListener> callbackList) in deviceDataCallbacks)
|
foreach ((string userDataKey, List<CallbackListener> callbackList) in
|
||||||
|
userDataCallbacks)
|
||||||
{
|
{
|
||||||
if (!state.device.deviceData.data.ContainsKey(deviceDataKey))
|
if (!state.device.userData.data.ContainsKey(userDataKey))
|
||||||
{
|
{
|
||||||
// send the callbacks
|
// send the callbacks
|
||||||
callbackList.ForEach(e =>
|
callbackList.ForEach(e =>
|
||||||
|
|
@ -470,7 +479,8 @@ namespace VELConnect
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Adds a change listener callback to a particular field name within the Device main fields.
|
/// Adds a change listener callback to a particular field name within the Device main fields.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static void AddDeviceFieldListener(string key, MonoBehaviour keepAliveObject, Action<string> callback,
|
public static void AddDeviceFieldListener(DeviceField key, MonoBehaviour keepAliveObject,
|
||||||
|
Action<string> callback,
|
||||||
bool sendInitialState = false)
|
bool sendInitialState = false)
|
||||||
{
|
{
|
||||||
if (!deviceFieldCallbacks.ContainsKey(key))
|
if (!deviceFieldCallbacks.ContainsKey(key))
|
||||||
|
|
@ -489,7 +499,7 @@ namespace VELConnect
|
||||||
{
|
{
|
||||||
if (instance != null && instance.lastState?.device != null)
|
if (instance != null && instance.lastState?.device != null)
|
||||||
{
|
{
|
||||||
if (instance.lastState.device.GetType().GetField(key)
|
if (instance.lastState.device.GetType().GetField(key.ToString())
|
||||||
?.GetValue(instance.lastState.device) is string val)
|
?.GetValue(instance.lastState.device) is string val)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|
@ -506,18 +516,18 @@ namespace VELConnect
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Adds a change listener callback to a particular field name within the Device data JSON.
|
/// Adds a change listener callback to a particular field name within the User data JSON.
|
||||||
/// If the initial state doesn't contain this key, this sends back null
|
/// If the initial state doesn't contain this key, this sends back null
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static void AddDeviceDataListener(string key, MonoBehaviour keepAliveObject, Action<string> callback,
|
public static void AddUserDataListener(string key, MonoBehaviour keepAliveObject, Action<string> callback,
|
||||||
bool sendInitialState = false)
|
bool sendInitialState = false)
|
||||||
{
|
{
|
||||||
if (!deviceDataCallbacks.ContainsKey(key))
|
if (!userDataCallbacks.ContainsKey(key))
|
||||||
{
|
{
|
||||||
deviceDataCallbacks[key] = new List<CallbackListener>();
|
userDataCallbacks[key] = new List<CallbackListener>();
|
||||||
}
|
}
|
||||||
|
|
||||||
deviceDataCallbacks[key].Add(new CallbackListener()
|
userDataCallbacks[key].Add(new CallbackListener()
|
||||||
{
|
{
|
||||||
keepAliveObject = keepAliveObject,
|
keepAliveObject = keepAliveObject,
|
||||||
callback = callback,
|
callback = callback,
|
||||||
|
|
@ -527,7 +537,7 @@ namespace VELConnect
|
||||||
// if we have already received data, and we should send right away
|
// if we have already received data, and we should send right away
|
||||||
if (sendInitialState && instance.state != null)
|
if (sendInitialState && instance.state != null)
|
||||||
{
|
{
|
||||||
string val = GetDeviceData(key);
|
string val = GetUserData(key);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
callback(val);
|
callback(val);
|
||||||
|
|
@ -573,7 +583,7 @@ namespace VELConnect
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string GetDeviceData(string key, string defaultValue = null)
|
public static string GetUserData(string key, string defaultValue = null)
|
||||||
{
|
{
|
||||||
return instance != null ? instance.lastState?.device?.TryGetData(key) : defaultValue;
|
return instance != null ? instance.lastState?.device?.TryGetData(key) : defaultValue;
|
||||||
}
|
}
|
||||||
|
|
@ -629,23 +639,23 @@ namespace VELConnect
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets the 'data' object of the Device table
|
/// Sets the 'data' object of the Device table
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static void SetDeviceData(Dictionary<string, string> data)
|
public static void SetUserData(Dictionary<string, string> data)
|
||||||
{
|
{
|
||||||
if (instance.state?.device != null)
|
if (instance.state?.device != null)
|
||||||
{
|
{
|
||||||
foreach (string key in data.Keys.ToList())
|
foreach (string key in data.Keys.ToList())
|
||||||
{
|
{
|
||||||
// if the value is unchanged from the current state, remove it so we don't double-update
|
// if the value is unchanged from the current state, remove it so we don't double-update
|
||||||
if (instance.state.device.deviceData.data.TryGetValue(key, out string val) && val == data[key])
|
if (instance.state.device.userData.data.TryGetValue(key, out string val) && val == data[key])
|
||||||
{
|
{
|
||||||
data.Remove(key);
|
data.Remove(key);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// update our local state, so we don't get change events on our own updates
|
// update our local state, so we don't get change events on our own updates
|
||||||
if (instance.lastState?.device?.deviceData?.data != null)
|
if (instance.lastState?.device?.userData?.data != null)
|
||||||
{
|
{
|
||||||
instance.lastState.device.deviceData.data[key] = data[key];
|
instance.lastState.device.userData.data[key] = data[key];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -657,7 +667,7 @@ namespace VELConnect
|
||||||
}
|
}
|
||||||
|
|
||||||
// if we have no data, just set the whole thing
|
// if we have no data, just set the whole thing
|
||||||
if (instance.lastState?.device?.deviceData != null) instance.lastState.device.deviceData.data ??= data;
|
if (instance.lastState?.device?.userData != null) instance.lastState.device.userData.data ??= data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "edu.uga.engr.vel.vel-connect",
|
"name": "edu.uga.engr.vel.vel-connect",
|
||||||
"displayName": "VEL-Connect",
|
"displayName": "VEL-Connect",
|
||||||
"version": "2.0.3",
|
"version": "2.1.0",
|
||||||
"unity": "2019.1",
|
"unity": "2019.1",
|
||||||
"description": "Web-based configuration for VR applications",
|
"description": "Web-based configuration for VR applications",
|
||||||
"keywords": [],
|
"keywords": [],
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue