Files
adriadri6972 d3d9c5f833 upload project
2025-07-31 15:21:08 +02:00

272 lines
12 KiB
C#

using AOT;
using System;
using System.Runtime.InteropServices;
using UnityEngine;
namespace Unity.XR.XREAL
{
public enum XREALActionType
{
ACTION_TYPE_UNKNOWN = 0,
ACTION_TYPE_CLICK = 1,
ACTION_TYPE_DOUBLE_CLICK = 2,
ACTION_TYPE_LONG_PRESS = 3,
ACTION_TYPE_OPEN_SCREEN = 4,
ACTION_TYPE_CLOSE_SCREEN = 5,
ACTION_TYPE_INCREASE_BRIGHTNESS = 6,
ACTION_TYPE_DECREASE_BRIGHTNESS = 7,
ACTION_TYPE_INCREASE_VOLUME = 8,
ACTION_TYPE_DECREASE_VOLUME = 9,
ACTION_TYPE_SWITCH_TO_MONO = 10,
ACTION_TYPE_SWITCH_TO_STEORO = 11,
ACTION_TYPE_NEXT_EC_LEVEL = 12,
ACTION_TYPE_SWITCH_TO_DP_VOICE = 13,
ACTION_TYPE_SWITCH_TO_UVC_VOICE = 14,
ACTION_TYPE_RESERVED0 = 15,
ACTION_TYPE_RESERVED1 = 16,
ACTION_TYPE_RESERVED2 = 17,
ACTION_TYPE_RESERVED3 = 18,
ACTION_TYPE_RESERVED4 = 19,
ACTION_TYPE_SWITCH_SLEEP_TIME_LEVEL = 30,
ACTION_TYPE_SWITCH_DISPLAY_COLOR_CALIBRATION = 31,
ACTION_TYPE_STARTUP_STATE = 32,
ACTION_TYPE_TRIGGER_SWITCH_SPACE_MODE = 33,
ACTION_TYPE_TRIGGER_RECENTER = 34,
ACTION_TYPE_TRIGGER_OSD_MAIN_MENU = 35,
ACTION_TYPE_TRIGGER_TAKE_PHOTO = 36,
ACTION_TYPE_TRIGGER_TAKE_VIDEO = 37,
ACTION_TYPE_RESERVED5 = 1000,
ACTION_TYPE_SCREEN_STATUS_NOTIFY = 1010,
ACTION_TYPE_DISCONNECT = 2000,
ACTION_TYPE_FORCE_QUIT = 2001,
ACTION_TYPE_EVENT = 2002,
ACTION_TYPE_SYSTEM_DISPLAY_CHANGE = 2003,
ACTION_TYPE_AUDIO_ALGORITHM_CHANGE = 2020,
ACTION_TYPE_DISPLAY_STATE = 2021,
ACTION_TYPE_DP_WORKING_STATE = 2022,
ACTION_TYPE_KEY_STATE = 2023,
ACTION_TYPE_PROXIMITY_WEARING_STATE = 2024,
ACTION_TYPE_RGB_CAMERA_PLUGIN_STATE = 2025,
ACTION_TYPE_TEMPERATURE_DATA = 2026,
ACTION_TYPE_POWER_SAVE_STATE = 2027,
ACTION_TYPE_TEMPERATURE_STATE = 2028,
}
public struct GlassesEventData
{
public XREALActionType actionType;
public uint para;
public uint para2;
public float para3;
}
internal delegate void XREALLogCallback(LogType logType, string message);
/// <summary>
/// Delegate for handling errors from the XREAL plugin.
/// </summary>
/// <param name="errorCode">The error code indicating the type of error.</param>
/// <param name="message">Optional error message providing additional context or details.</param>
public delegate void XREALErrorCallback(XREALErrorCode errorCode, string message);
/// <summary>
/// Delegate for handling generic glasses events.
/// </summary>
/// <param name="data">The data associated with the glasses event.</param>
public delegate void XREALGlassesEventCallback(GlassesEventData data);
/// <summary>
/// Delegate for handling key click events on XREAL glasses.
/// </summary>
/// <param name="actionType">The type of click action.</param>
/// <param name="keyType">The type of key that was clicked.</param>
public delegate void XREALGlassesKeyClickCallback(XREALClickType actionType, XREALKeyType keyType);
/// <summary>
/// Delegate for handling key state changes on XREAL glasses.
/// </summary>
/// <param name="keyType">The type of key whose state has changed.</param>
/// <param name="state">The new state of the key.</param>
public delegate void XREALGlassesKeyStateCallback(XREALKeyType keyType, XREALKeyState state);
/// <summary>
/// Delegate for handling glasses disconnection events.
/// </summary>
/// <param name="reason">The reason for the disconnection.</param>
public delegate void XREALGlassesDisconnectCallback(XREALGlassesDisconnectReason reason);
/// <summary>
/// Delegate for handling volume change events on XREAL glasses.
/// </summary>
/// <param name="volume">The new volume level.</param>
public delegate void XREALGlassesVolumeCallback(uint volume);
/// <summary>
/// Delegate for handling RGB camera plug/unplug state changes.
/// </summary>
/// <param name="state">The current state of the RGB camera.</param>
public delegate void XREALGlassesRGBCameraPlugStateCallback(XREALRGBCameraPlugState state);
/// <summary>
/// Delegate for handling changes in the electro chromic level of XREAL glasses.
/// </summary>
/// <param name="level">The current electrochromic level.</param>
public delegate void XREALGlassesECLevelCallback(uint level);
/// <summary>
/// Delegate for handling changes in the wearing state of XREAL glasses.
/// </summary>
/// <param name="state">The current wearing status.</param>
public delegate void XREALGlassesWearingStateCallback(XREALWearingStatus state);
/// <summary>
/// Delegate for handling changes in the brightness level of XREAL glasses.
/// </summary>
/// <param name="brightness">The current brightness level.</param>
public delegate void XREALGlassesBrightnessCallback(uint brightness);
/// <summary>
/// Delegate for handling changes in the temperature level of XREAL glasses.
/// </summary>
/// <param name="level">The current temperature level.</param>
public delegate void XREALGlassesTemperatureLevelCallback(XREALTemperatureLevel level);
/// <summary>
/// Handles callbacks from the native XREAL plugin and forwards them to events.
/// </summary>
public static class XREALCallbackHandler
{
internal static event XREALGlassesEventCallback OnGlassesEventEnterprise;
public static event XREALErrorCallback OnXREALError;
public static event XREALGlassesKeyClickCallback OnXREALGlassesKeyClick;
public static event XREALGlassesKeyStateCallback OnXREALGlassesKeyState;
public static event XREALGlassesDisconnectCallback OnXREALGlassesDisconnect;
public static event XREALGlassesVolumeCallback OnXREALGlassesVolume;
public static event XREALGlassesRGBCameraPlugStateCallback OnXREALGlassesRGBCameraPlugState;
public static event XREALGlassesECLevelCallback OnXREALGlassesECLevel;
public static event XREALGlassesWearingStateCallback OnXREALGlassesWearingState;
public static event XREALGlassesBrightnessCallback OnXREALGlassesBrightness;
public static event XREALGlassesTemperatureLevelCallback OnXREALGlassesTemperatureLevel;
#if (UNITY_ANDROID && !UNITY_EDITOR) || UNITY_STANDALONE
[RuntimeInitializeOnLoadMethod]
#endif
internal static void OnLoad()
{
Debug.Log("[XREALCallbackHandler] OnLoad");
XREALPlugin.SetGlassesEventCallback(OnGlassesEventCallback);
XREALPlugin.SetNativeErrorCallback(OnNativeErrorCallback);
}
[MonoPInvokeCallback(typeof(XREALGlassesEventCallback))]
private static void OnGlassesEventCallback(GlassesEventData data)
{
if (XREALMainThreadDispather.Singleton != null)
{
XREALMainThreadDispather.Singleton.QueueOnMainThread(() =>
{
try
{
OnGlassesEventHandler(data);
}
catch (Exception e)
{
Debug.LogException(e);
}
});
}
}
[MonoPInvokeCallback(typeof(XREALErrorCallback))]
private static void OnNativeErrorCallback(XREALErrorCode errorCode, string message)
{
Debug.Log($"[XREALCallbackHandler] OnNativeErrorCallback: err={errorCode}, msg={message}");
if (XREALMainThreadDispather.Singleton != null)
{
XREALMainThreadDispather.Singleton.QueueOnMainThread(() =>
{
InvokeXREALError(errorCode, message);
});
}
}
/// <summary>
/// Invokes the XREAL error callback event.
/// </summary>
/// <param name="errorCode">The error code received from the native plugin.</param>
/// <param name="message">Optional error message to provide additional details.</param>
public static void InvokeXREALError(XREALErrorCode errorCode, string message = null)
{
OnXREALError?.Invoke(errorCode, message);
}
private static void OnGlassesEventHandler(GlassesEventData data)
{
switch (data.actionType)
{
case XREALActionType.ACTION_TYPE_CLICK:
OnXREALGlassesKeyClick?.Invoke(XREALClickType.CLICK, (XREALKeyType)data.para);
break;
case XREALActionType.ACTION_TYPE_DOUBLE_CLICK:
OnXREALGlassesKeyClick?.Invoke(XREALClickType.DOUBLE_CLICK, (XREALKeyType)data.para);
break;
case XREALActionType.ACTION_TYPE_LONG_PRESS:
OnXREALGlassesKeyClick?.Invoke(XREALClickType.LONG_PRESS, (XREALKeyType)data.para);
break;
case XREALActionType.ACTION_TYPE_INCREASE_BRIGHTNESS:
case XREALActionType.ACTION_TYPE_DECREASE_BRIGHTNESS:
OnXREALGlassesBrightness?.Invoke(data.para);
break;
case XREALActionType.ACTION_TYPE_INCREASE_VOLUME:
case XREALActionType.ACTION_TYPE_DECREASE_VOLUME:
OnXREALGlassesVolume?.Invoke(data.para);
break;
case XREALActionType.ACTION_TYPE_NEXT_EC_LEVEL:
OnXREALGlassesECLevel?.Invoke(data.para);
break;
case XREALActionType.ACTION_TYPE_DISCONNECT:
OnXREALGlassesDisconnect?.Invoke(XREALGlassesDisconnectReason.GLASSES_DEVICE_DISCONNECT);
#if UNITY_ANDROID
XREALPlugin.QuitApplication();
#endif
break;
case XREALActionType.ACTION_TYPE_FORCE_QUIT:
OnXREALGlassesDisconnect?.Invoke(XREALGlassesDisconnectReason.NOTIFY_TO_QUIT_APP);
#if UNITY_ANDROID
XREALPlugin.QuitApplication();
#endif
break;
case XREALActionType.ACTION_TYPE_KEY_STATE:
OnXREALGlassesKeyState?.Invoke((XREALKeyType)data.para, (XREALKeyState)data.para2);
break;
case XREALActionType.ACTION_TYPE_PROXIMITY_WEARING_STATE:
XREALWearingStatus wearingState = (XREALWearingStatus)data.para;
if (wearingState == XREALWearingStatus.PUT_ON || wearingState == XREALWearingStatus.TAKE_OFF)
OnXREALGlassesWearingState?.Invoke(wearingState);
break;
case XREALActionType.ACTION_TYPE_RGB_CAMERA_PLUGIN_STATE:
OnXREALGlassesRGBCameraPlugState?.Invoke((XREALRGBCameraPlugState)data.para);
break;
case XREALActionType.ACTION_TYPE_TEMPERATURE_STATE:
OnXREALGlassesTemperatureLevel?.Invoke((XREALTemperatureLevel)data.para);
break;
default:
OnGlassesEventEnterprise?.Invoke(data);
break;
}
}
}
public static partial class XREALPlugin
{
[DllImport(LibName)]
internal static extern void SetGlassesEventCallback(XREALGlassesEventCallback callback);
[DllImport(LibName)]
internal static extern void SetNativeLogCallback(XREALLogCallback callback);
[DllImport(LibName)]
internal static extern void SetNativeErrorCallback(XREALErrorCallback callback);
}
}