Oculus Quest and RealSense D435i integration in Unity

Required Info

Camera Model
D435i

Firmware Version
<IP_ADDRESS>

Operating System & Version
Android

Platform
Oculus Quest

SDK Version
2.22.0

Language
C#/unity

Unity Version
2019.1.4f1

Graphics API
OpenGLES3

Scripting API Version
.NET 4.x

Segment
VR

Issue Description
Hello everybody,
I'm designing a VR performance, in which the user would interact with a real-time point cloud of the space around them. I am using an Intel RealSense D435i depth camera and an Oculus Quest, and I'm developing in Unity.
My question is:
Is it technically possible for the RealSense camera to communicate with the Quest, through the USB-C port ?
If not, is it because of a hardware limitation, missing Android drivers, limited Android support or something else?
So far, the example Unity project builds without errors and when I connect the Realsense to the Quest I get the familiar sound of the Quest recognizing that something connected to it, but when the actual app runs, it does not show any pointcloud at all, and the depth camera is clearly inactive (no flashing laser, no IR illumination in the room when viewed in Passthrough mode).
Here are some interesting lines from the adb logcat output of the Quest:
Lines 6-8:
Unable to find libAudioPluginOculusSpatializer
Unable to find librealsense
Unable to find realsense

and later on (Lines 23-28):
MarshalDirectiveException: Cannot marshal type 'System.Object'.
    at Intel.RealSense.NativeMethods.rs2_create_frame_queue
    at Intel.RealSense.FrameQueue.set_Capacity
    at Intel.RealSense.NativeMethods.rs2_create_processing_block_fptr
    at Intel.RealSense.FrameQueue..ctor
    at RsProcessingPipe.Awake ()

and finally (Lines 32-41):
MarshalDirectiveException: Cannot marshal type 'System.Object'.
   at Intel.RealSense.NativeMethods.rs2_get_api_version
   at Intel.RealSense.NativeMethods.rs2_get_api_version
   at Intel.RealSense.Pipeline.Create ()
   at Intel.RealSense.Pipeline..ctor ()
   at RsDevice.OnEnable ()
 Rethrow as TypeInitializationException: The type initializer for 'Intel.RealSense.Context' threw an exception.
   at Intel.RealSense.Pipeline.Create ()
   at Intel.RealSense.Pipeline..ctor ()
   at RsDevice.OnEnable () [0x00000]

Keep in mind that I have successfully built the native Android library (librealsense.aar) as described here and placed it in the Plugins folder, alongside Intel.RealSense.dll and realsense2.dll .
This is new ground, so any help would be greatly appreciated!
Thank you!

I don't know about using the Unity wrapper with Quest, but there was a developer who created a custom version of the wrapper to support an HTC Vive point cloud viewer that relied on the SteamVR plugin in Unity.
https://www.youtube.com/watch?v=dotQGfINt3w&feature=youtu.be
The Unity website has some guidance about using Gear VR, an Oculus device that is Android based.  So that might give some useful guidance about what you might be missing.
https://docs.unity3d.com/Manual/VRDevices-Oculus.html

Thanks for your reply @MartyG-RealSense !
From my understanding they just customized some RealSense scripts in order to be able to stream multiple cameras simultaneously to Unity. Indeed it looks like the RealSense is connected directly to the PC,.

I went over all the information that you provided carefully.  As I am not a specialist in using Librealsense with Android though, I will tag into this conversation the guy who works on the Android implementation of the SDK to seek his input.   @matkatz

MarshalDirectiveException: Cannot marshal type 'System.Object' and related errors are most probably caused by building with Unity's IL2CPP scripting backend, which isn't supported by the librealsense wrapper.
Please try switching to the Mono\.NET backend instead.

Thanks for the advice @ogoshen , I wasn't aware that IL2CPP isn't compatible with librealsense.
I will try that and post an update.

@matkatz @ogoshen I built the app again using the Mono scripting backend and started the app with the RS D435i connected to the Quest. The app froze for almost 30 seconds right after the Unity splash screen, and after that it played as before, without any signs that the D435i is active/streaming. At this point, the Logcat output reported (once) the following error under the Unity tag:
ExternalException: rs2_pipeline_start_with_config(pipe:0xcd957360, config:0xcd9575d8)

Rethrow as Exception: No device connected
at Intel.RealSense.ErrorMarshaler.MarshalNativeToManaged (System.IntPtr pNativeData) [0x000a7] in <ba30e24c78874cfe9ca3e2cba0dbd673>:0
at (wrapper managed-to-native) Intel.RealSense.NativeMethods.rs2_pipeline_start_with_config(intptr,intptr,object&)
at Intel.RealSense.Pipeline.Start (Intel.RealSense.Config cfg) [0x0000d] in <ba30e24c78874cfe9ca3e2cba0dbd673>:0
at RsDevice.OnEnable () [0x00017] in <d4a4188e91f246d3bca7964430ee0b34>:0

I then started to filter the logs with other tags, specifically InputDeviceManager and UsbPortManager and I started plugging-unplugging the RS D435i to see what happens. These are the messages I got, as soon as the RealSense was connected to the Quest:
InputDeviceManager
InputDeviceManager: ovrInputDeviceManager::Initialize
InputDeviceManager: ovrInputDeviceManager::SetRemoteConnected - hardwareID = cf5afef8776d4f99, modelID = 4000
InputDeviceManager: ovrInputDeviceManager::CreateDevice - hardwareID = cf5afef8776d4f99, modelID = 4000
InputDeviceManager: ovrInputDeviceManager::AllocDevice - hardwareID = cf5afef8776d4f99, modelID = 4000
InputDeviceManager: ovrInputDeviceManager::SetRemoteConnected - hardwareID = d7b77de328b90488, modelID = 4000
InputDeviceManager: ovrInputDeviceManager::CreateDevice - hardwareID = d7b77de328b90488, modelID = 4000
InputDeviceManager: ovrInputDeviceManager::AllocDevice - hardwareID = d7b77de328b90488, modelID = 4000
InputDeviceManager: ovrInputDeviceManager::Shutdown

UsbPortManager
UsbPortManager: USB port changed: port=UsbPort{id=otg_default, supportedModes=dual}, status=UsbPortStatus{connected=true, currentMode=dfp, currentPowerRole=source, currentDataRole=host, supportedRoleCombinations=[source:host, sink:device]}, canChangeMode=true, canChangePowerRole=false, canChangeDataRole=false

Any thoughts?

I confirmed that this error ExternalException: rs2_pipeline_start_with_config(pipe:0xcd957360, config:0xcd9575d8) Rethrow as Exception: No device connected  appears whether I connect the RS D435i to the Quest or not, and it's the same error that I get on Unity's console if I try to run the app without connecting the RS D435i to my PC.

Right, so you've past the first hurdle and got everything compiled and running.
The second (and last 🤞) is a result of targeting Android from Unity, it is an undocumented limbo, but I can assure you it'll work.
If you look at the Android examples you'll find that you need to call
RsContext.init before anything else to get the device recognized.
The following script should take care of camera permissions, and call the proper java method:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AndroidPermissions : MonoBehaviour
{
#if UNITY_ANDROID && !UNITY_EDITOR
    void Awake()
    {
        if (!UnityEngine.Android.Permission.HasUserAuthorizedPermission(UnityEngine.Android.Permission.Camera))
        {
            UnityEngine.Android.Permission.RequestUserPermission(UnityEngine.Android.Permission.Camera);

        }

        using (var javaUnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
        using (var currentActivity = javaUnityPlayer.GetStatic<AndroidJavaObject>("currentActivity"))
        using (var rsContext = new AndroidJavaClass("com.intel.realsense.librealsense.RsContext"))
        {
            Debug.Log(rsContext);
            rsContext.CallStatic("init", currentActivity);
        }
    }
#endif
}

Thank you @ogoshen! Getting there!
The second step was indeed successful, but unfortunately it's not the last one.
I attached the script above to a GameObject and rebuilt with the same settings. When I run the app, the D435i starts projecting the IR dot pattern ( hooray !!) but the app itself shows no point-cloud. The logcat now keeps repeating the same error for every frame:
OPENGL NATIVE PLUG-IN ERROR: GL_INVALID_OPERATION: Operation illegal in current state

(Filename: /Users/builduser/buildslave/unity/build/Runtime/GfxDevice/opengles/GfxDeviceGLES.cpp Line: 346)

I understand that this is an infamous error that various people have for various reasons. [1][2]
I'm using Unity 2019.1.4f1 with OpenGLES3 as my Graphics API, and .NET 4.x as my Scripting Runtime Version. These things seemed to relate to this problem for other people, so I'm just mentioning them.

Glad to help.
So this issue doesn't seem related to librealsense and I suggest reporting it to Unity.
Have you tried turning antialiasing off as suggested in this post?
Does this happen only with the point cloud renderer? can you get depth\color texture steaming to work?

I am happy to report that I got it working !!!
The issue with the PointCloudDepthAndColor scene from the Unity samples was that the PointCloudMat material assigned to the PointCloudRenderer component was using by default the Custom/PointCloudGeom shader, which is a geometry shader.
Apparently the Oculus Quest doesn't like geometry shaders, which I confirmed with a different project using geometry shaders. I believe this was the reason for the OPENGL NATIVE PLUG-IN ERROR: GL_INVALID_OPERATION: Operation illegal in current state error.
Switching the shader of this material to the simple Custom/PointCloud shader worked like a charm!
I had the joy of walking through a real-time point cloud of my room!
Also textures (Depth/Color) work perfectly.
Thanks for all your help @ogoshen

@GeorgeAdamon  Congratulations!  I will make a post on Intel Support's forum linking to this discussion so that others can benefit from this knowledge.  :)

@GeorgeAdamon
I could see Realsense's PointCloud from OculusQuest thanks to your post!Thank you!

I just opened a repo, documenting the process, I will upload a sample project in the following days!
https://github.com/GeorgeAdamon/quest-realsense

@GeorgeAdamon  Thanks so much for the effort you have gone to in sharing the experience with other community members in an easy to follow format!

For anyone who comes here from Google when searching "Oculus Quest Geometry Shader", I can say that Geometry shaders will work on the Quest, but only in Multi-Pass stereo.
In single-pass stereo you just get the classic GL_INVALID_OPERATION every frame.

I just wanted to add that I came across a 3D printing blueprint for a 400 Series mounter for Oculus Quest.
https://www.thingiverse.com/thing:3841368

@GeorgeAdamon @MartyG-RealSense Hi Guys
I know this threading is a getting a bit dated but I am trying to get my D435i to run on my Quest (first gen) and am having a heck of a time. Does anyone have information on which JDK/NDK/AndroidSDK/Gradle versions I should have for building the .aar from android studio? Firstly, I dont see a task for assembleRelease inside android/librealsense/Tasks/build. I can seem to run it by typing it via execute gradle task but it fails. This error seems to be a common theme:
AAPT: error: style attribute 'android:attr/dialogCornerRadius' not found.
The source of the error seems to come from my .gradle folder so I've tried many different gradle versions and the build keeps failing. I've also tried running some of the other tasks like buildDependents, buildNeeded, clean, cleanBuildCache, they also all fail.
There was a point in time a couple weeks ago when I was able to build the .aar file but when I put it into my unity project as per instructed, as well as add the permissions script to a game object, I can't get the realsense webcamtexture to show up on a plane object in my scene while running stand-alone on the quest. The Quest asked for permission once and I havent seen the request since, even though I later altered the permission script to request it even if it has already been given. After making tons of adjustments to various NDK/SDK/JDK/Gradle versions and still not getting results, I decided to restart the process in @GeorgeAdamon documentation. However, like I mentioned, I can't produce the .aar file anymore and I have no idea why.
Getting this camera streaming into my unity application is huge milestone for my project. I would really appreciate some help getting this sorted out! I have essentially zero experience with android, all of my knowledge is in Unity 3D/C#. Let me know what information you need for troubleshooting. Thanks!

Hi @Kukewilly  Another RealSense Android user also had problems with a missing assembleRelease task today in https://github.com/IntelRealSense/librealsense/issues/9978
A guide that I wrote about installing the Android wrapper advises in https://github.com/IntelRealSense/librealsense/issues/9753#issuecomment-919903084 about going to the File > Settings menu option and selecting the Experimental category, then unticking the setting 'Do not build Gradle task list during Gradle sync'. and clicking the Apply and OK buttons.  Have you tried this action, please?

Hey @MartyG-RealSense  thanks for the quick response! I do have the option unticked, but still no assembleRelease task is present. I am able to run the task as described in the thread you linked using "Execute Gradle Task".
I wiped everything I could of Realsense and Android Studio off my pc, then redownloaded/installed. I was able to build the AAR file again! :D
I placed the librealsense-release.aar file into the RealSense SDK plug-in folder as per https://github.com/GeorgeAdamon/quest-realsense then placed an android permission object in the scene with the script provided to request permission and initialize rsContext. I then uninstalled the previous .apk from my Quest, built the new .apk in unity and reloaded it into my Quest. When I booted my quest with the realsense connected I got the permission request for both the realsense, and for the app to take photos and video!
However the 3d plane is still not displaying the color feed from the realsense. It displays it when the realsense is connected to my PC. I am starting to wonder if my unity scripts are not referencing the webcamTexture of the camera correctly. I'm using openCV and here is the script responsible for finding the camera device and displaying it on the plane gameObject:
`#if !OPENCV_DONT_USE_WEBCAMTEXTURE_API
#if !(PLATFORM_LUMIN && !UNITY_EDITOR)
using OpenCVForUnity.CoreModule;
using System;
using System.Collections;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Serialization;
namespace OpenCVForUnity.UnityUtils.Helper
{
///
/// WebcamTexture to mat helper.
/// v 1.1.1
///
public class WebCamTextureToMatHelper : MonoBehaviour
{
///
/// Set the name of the camera device to use. (or device index number)
///
[SerializeField, FormerlySerializedAs("requestedDeviceName"), TooltipAttribute("Set the name of the device to use. (or device index number)")]
protected string _requestedDeviceName = null;
    public virtual string requestedDeviceName
    {
        get { return _requestedDeviceName; }
        set
        {
            _requestedDeviceName = value;
            if (hasInitDone)
            {
                Initialize();
            }
        }
    }

    /// <summary>
    /// Set the width of camera.
    /// </summary>
    [SerializeField, FormerlySerializedAs("requestedWidth"), TooltipAttribute("Set the width of camera.")]
    protected int _requestedWidth = 640;

    public virtual int requestedWidth
    {
        get { return _requestedWidth; }
        set
        {
            _requestedWidth = (int)Mathf.Clamp(value, 0f, float.MaxValue);
            if (hasInitDone)
            {
                Initialize();
            }
        }
    }

    /// <summary>
    /// Set the height of camera.
    /// </summary>
    [SerializeField, FormerlySerializedAs("requestedHeight"), TooltipAttribute("Set the height of camera.")]
    protected int _requestedHeight = 480;

    public virtual int requestedHeight
    {
        get { return _requestedHeight; }
        set
        {
            _requestedHeight = (int)Mathf.Clamp(value, 0f, float.MaxValue);
            if (hasInitDone)
            {
                Initialize();
            }
        }
    }

    /// <summary>
    /// Set whether to use the front facing camera.
    /// </summary>
    [SerializeField, FormerlySerializedAs("requestedIsFrontFacing"), TooltipAttribute("Set whether to use the front facing camera.")]
    protected bool _requestedIsFrontFacing = false;

    public virtual bool requestedIsFrontFacing
    {
        get { return _requestedIsFrontFacing; }
        set
        {
            _requestedIsFrontFacing = value;
            if (hasInitDone)
            {
                Initialize(_requestedIsFrontFacing, requestedFPS, rotate90Degree);
            }
        }
    }

    /// <summary>
    /// Set the frame rate of camera.
    /// </summary>
    [SerializeField, FormerlySerializedAs("requestedFPS"), TooltipAttribute("Set the frame rate of camera.")]
    protected float _requestedFPS = 30f;

    public virtual float requestedFPS
    {
        get { return _requestedFPS; }
        set
        {
            _requestedFPS = Mathf.Clamp(value, -1f, float.MaxValue);
            if (hasInitDone)
            {
                bool isPlaying = IsPlaying();
                Stop();
                webCamTexture.requestedFPS = _requestedFPS;
                if (isPlaying)
                    Play();
            }
        }
    }

    /// <summary>
    /// Sets whether to rotate camera frame 90 degrees. (clockwise)
    /// </summary>
    [SerializeField, FormerlySerializedAs("rotate90Degree"), TooltipAttribute("Sets whether to rotate camera frame 90 degrees. (clockwise)")]
    protected bool _rotate90Degree = false;

    public virtual bool rotate90Degree
    {
        get { return _rotate90Degree; }
        set
        {
            _rotate90Degree = value;
            if (hasInitDone)
            {
                Initialize();
            }
        }
    }

    /// <summary>
    /// Determines if flips vertically.
    /// </summary>
    [SerializeField, FormerlySerializedAs("flipVertical"), TooltipAttribute("Determines if flips vertically.")]
    protected bool _flipVertical = false;

    public virtual bool flipVertical
    {
        get { return _flipVertical; }
        set { _flipVertical = value; }
    }

    /// <summary>
    /// Determines if flips horizontal.
    /// </summary>
    [SerializeField, FormerlySerializedAs("flipHorizontal"), TooltipAttribute("Determines if flips horizontal.")]
    protected bool _flipHorizontal = false;

    public virtual bool flipHorizontal
    {
        get { return _flipHorizontal; }
        set { _flipHorizontal = value; }
    }

    /// <summary>
    /// The number of frames before the initialization process times out.
    /// </summary>
    [SerializeField, FormerlySerializedAs("timeoutFrameCount"), TooltipAttribute("The number of frames before the initialization process times out.")]
    protected int _timeoutFrameCount = 300;

    public virtual int timeoutFrameCount
    {
        get { return _timeoutFrameCount; }
        set { _timeoutFrameCount = (int)Mathf.Clamp(value, 0f, float.MaxValue); }
    }

    /// <summary>
    /// UnityEvent that is triggered when this instance is initialized.
    /// </summary>
    public UnityEvent onInitialized;

    /// <summary>
    /// UnityEvent that is triggered when this instance is disposed.
    /// </summary>
    public UnityEvent onDisposed;

    /// <summary>
    /// UnityEvent that is triggered when this instance is error Occurred.
    /// </summary>
    public ErrorUnityEvent onErrorOccurred;

    /// <summary>
    /// The active WebcamTexture.
    /// </summary>
    protected WebCamTexture webCamTexture;

    /// <summary>
    /// The active WebcamDevice.
    /// </summary>
    protected WebCamDevice webCamDevice;

    /// <summary>
    /// The frame mat.
    /// </summary>
    protected Mat frameMat;

    /// <summary>
    /// The rotated frame mat
    /// </summary>
    protected Mat rotatedFrameMat;

    /// <summary>
    /// The buffer colors.
    /// </summary>
    protected Color32[] colors;

    /// <summary>
    /// Indicates whether this instance is waiting for initialization to complete.
    /// </summary>
    protected bool isInitWaiting = false;

    /// <summary>
    /// Indicates whether this instance has been initialized.
    /// </summary>
    protected bool hasInitDone = false;

    /// <summary>
    /// The initialization coroutine.
    /// </summary>
    protected IEnumerator initCoroutine;

    /// <summary>
    /// The orientation of the screen.
    /// </summary>
    protected ScreenOrientation screenOrientation;

    /// <summary>
    /// The width of the screen.
    /// </summary>
    protected int screenWidth;

    /// <summary>
    /// The height of the screen.
    /// </summary>
    protected int screenHeight;

    /// <summary>
    /// Indicates whether this instance avoids the front camera low light issue that occurs in only some Android devices (e.g. Google Pixel, Pixel2).
    /// Sets compulsorily the requestedFPS parameter to 15 (only when using the front camera), to avoid the problem of the WebCamTexture image becoming low light.
    /// https://forum.unity.com/threads/android-webcamtexture-in-low-light-only-some-models.520656/
    /// https://forum.unity.com/threads/released-opencv-for-unity.277080/page-33#post-3445178
    /// </summary>
    public bool avoidAndroidFrontCameraLowLightIssue = false;

    [Serializable]
    public enum ErrorCode : int
    {
        UNKNOWN = 0,
        CAMERA_DEVICE_NOT_EXIST = 1,
        CAMERA_PERMISSION_DENIED = 2,
        TIMEOUT = 3,
    }

    [Serializable]
    public class ErrorUnityEvent : UnityEvent<ErrorCode>
    {

    }

    protected virtual void OnValidate()
    {
        _requestedWidth = (int)Mathf.Clamp(_requestedWidth, 0f, float.MaxValue);
        _requestedHeight = (int)Mathf.Clamp(_requestedHeight, 0f, float.MaxValue);
        _requestedFPS = Mathf.Clamp(_requestedFPS, -1f, float.MaxValue);
        _timeoutFrameCount = (int)Mathf.Clamp(_timeoutFrameCount, 0f, float.MaxValue);
    }

    // Update is called once per frame
    protected virtual void Update()
    {
        if (hasInitDone)
        {
            // Catch the orientation change of the screen and correct the mat image to the correct direction.
            if (screenOrientation != Screen.orientation && (screenWidth != Screen.width || screenHeight != Screen.height))
            {

                if (onDisposed != null)
                    onDisposed.Invoke();

                if (frameMat != null)
                {
                    frameMat.Dispose();
                    frameMat = null;
                }
                if (rotatedFrameMat != null)
                {
                    rotatedFrameMat.Dispose();
                    rotatedFrameMat = null;
                }

                frameMat = new Mat(webCamTexture.height, webCamTexture.width, CvType.CV_8UC4, new Scalar(0, 0, 0, 255));
                screenOrientation = Screen.orientation;
                screenWidth = Screen.width;
                screenHeight = Screen.height;

                bool isRotatedFrame = false;

#if !UNITY_EDITOR && !(UNITY_STANDALONE || UNITY_WEBGL)
if (screenOrientation == ScreenOrientation.Portrait || screenOrientation == ScreenOrientation.PortraitUpsideDown)
{
if (!rotate90Degree)
isRotatedFrame = true;
}
else if (rotate90Degree)
{
isRotatedFrame = true;
}
#else
if (rotate90Degree)
isRotatedFrame = true;
#endif
if (isRotatedFrame)
rotatedFrameMat = new Mat(webCamTexture.width, webCamTexture.height, CvType.CV_8UC4, new Scalar(0, 0, 0, 255));
                if (onInitialized != null)
                    onInitialized.Invoke();
            }
            else
            {
                screenWidth = Screen.width;
                screenHeight = Screen.height;
            }
        }
    }

    protected virtual IEnumerator OnApplicationFocus(bool hasFocus)
    {

#if (UNITY_IOS && UNITY_2018_1_OR_NEWER) || (UNITY_ANDROID && UNITY_2018_3_OR_NEWER)
yield return null;
        if (isUserRequestingPermission && hasFocus)
            isUserRequestingPermission = false;

#endif
yield break;
}
    /// <summary>
    /// Raises the destroy event.
    /// </summary>
    protected virtual void OnDestroy()
    {
        Dispose();
    }

    /// <summary>
    /// Initializes this instance.
    /// </summary>
    public virtual void Initialize()
    {
        if (isInitWaiting)
        {
            CancelInitCoroutine();
            ReleaseResources();
        }

        if (onInitialized == null)
            onInitialized = new UnityEvent();
        if (onDisposed == null)
            onDisposed = new UnityEvent();
        if (onErrorOccurred == null)
            onErrorOccurred = new ErrorUnityEvent();

        initCoroutine = _Initialize();
        StartCoroutine(initCoroutine);
    }

    /// <summary>
    /// Initializes this instance.
    /// </summary>
    /// <param name="requestedWidth">Requested width.</param>
    /// <param name="requestedHeight">Requested height.</param>
    public virtual void Initialize(int requestedWidth, int requestedHeight)
    {
        if (isInitWaiting)
        {
            CancelInitCoroutine();
            ReleaseResources();
        }

        _requestedWidth = requestedWidth;
        _requestedHeight = requestedHeight;
        if (onInitialized == null)
            onInitialized = new UnityEvent();
        if (onDisposed == null)
            onDisposed = new UnityEvent();
        if (onErrorOccurred == null)
            onErrorOccurred = new ErrorUnityEvent();

        initCoroutine = _Initialize();
        StartCoroutine(initCoroutine);
    }

    /// <summary>
    /// Initializes this instance.
    /// </summary>
    /// <param name="requestedIsFrontFacing">If set to <c>true</c> requested to using the front camera.</param>
    /// <param name="requestedFPS">Requested FPS.</param>
    /// <param name="rotate90Degree">If set to <c>true</c> requested to rotate camera frame 90 degrees. (clockwise)</param>
    public virtual void Initialize(bool requestedIsFrontFacing, float requestedFPS = 30f, bool rotate90Degree = false)
    {
        if (isInitWaiting)
        {
            CancelInitCoroutine();
            ReleaseResources();
        }

        _requestedDeviceName = null;
        _requestedIsFrontFacing = requestedIsFrontFacing;
        _requestedFPS = requestedFPS;
        _rotate90Degree = rotate90Degree;
        if (onInitialized == null)
            onInitialized = new UnityEvent();
        if (onDisposed == null)
            onDisposed = new UnityEvent();
        if (onErrorOccurred == null)
            onErrorOccurred = new ErrorUnityEvent();

        initCoroutine = _Initialize();
        StartCoroutine(initCoroutine);
    }

    /// <summary>
    /// Initializes this instance.
    /// </summary>
    /// <param name="deviceName">Device name.</param>
    /// <param name="requestedWidth">Requested width.</param>
    /// <param name="requestedHeight">Requested height.</param>
    /// <param name="requestedIsFrontFacing">If set to <c>true</c> requested to using the front camera.</param>
    /// <param name="requestedFPS">Requested FPS.</param>
    /// <param name="rotate90Degree">If set to <c>true</c> requested to rotate camera frame 90 degrees. (clockwise)</param>
    public virtual void Initialize(string deviceName, int requestedWidth, int requestedHeight, bool requestedIsFrontFacing = false, float requestedFPS = 30f, bool rotate90Degree = false)
    {
        if (isInitWaiting)
        {
            CancelInitCoroutine();
            ReleaseResources();
        }

        _requestedDeviceName = deviceName;
        _requestedWidth = requestedWidth;
        _requestedHeight = requestedHeight;
        _requestedIsFrontFacing = requestedIsFrontFacing;
        _requestedFPS = requestedFPS;
        _rotate90Degree = rotate90Degree;
        if (onInitialized == null)
            onInitialized = new UnityEvent();
        if (onDisposed == null)
            onDisposed = new UnityEvent();
        if (onErrorOccurred == null)
            onErrorOccurred = new ErrorUnityEvent();

        initCoroutine = _Initialize();
        StartCoroutine(initCoroutine);
    }

    /// <summary>
    /// Initializes this instance by coroutine.
    /// </summary>
    protected virtual IEnumerator _Initialize()
    {
        if (hasInitDone)
        {
            ReleaseResources();

            if (onDisposed != null)
                onDisposed.Invoke();
        }

        isInitWaiting = true;

#if (UNITY_IOS || UNITY_ANDROID) && !UNITY_EDITOR
// Checks camera permission state.
IEnumerator coroutine = hasUserAuthorizedCameraPermission();
yield return coroutine;
        if (!(bool)coroutine.Current)
        {
            isInitWaiting = false;
            initCoroutine = null;

            if (onErrorOccurred != null)
                onErrorOccurred.Invoke(ErrorCode.CAMERA_PERMISSION_DENIED);

            yield break;
        }

#endif
        float requestedFPS = this.requestedFPS;

        // Creates the camera
        var devices = WebCamTexture.devices;
        if (!String.IsNullOrEmpty(requestedDeviceName))
        {
            int requestedDeviceIndex = -1;
            if (Int32.TryParse(requestedDeviceName, out requestedDeviceIndex))
            {
                if (requestedDeviceIndex >= 0 && requestedDeviceIndex < devices.Length)
                {
                    webCamDevice = devices[requestedDeviceIndex];

                    if (avoidAndroidFrontCameraLowLightIssue && webCamDevice.isFrontFacing == true)
                        requestedFPS = 15f;

                    if (requestedFPS < 0)
                    {
                        webCamTexture = new WebCamTexture(webCamDevice.name, requestedWidth, requestedHeight);
                    }
                    else
                    {
                        webCamTexture = new WebCamTexture(webCamDevice.name, requestedWidth, requestedHeight, (int)requestedFPS);
                    }
                }
            }
            else
            {
                for (int cameraIndex = 0; cameraIndex < devices.Length; cameraIndex++)
                {
                    if (devices[cameraIndex].name == requestedDeviceName)
                    {
                        webCamDevice = devices[cameraIndex];

                        if (avoidAndroidFrontCameraLowLightIssue && webCamDevice.isFrontFacing == true)
                            requestedFPS = 15f;

                        if (requestedFPS < 0)
                        {
                            webCamTexture = new WebCamTexture(webCamDevice.name, requestedWidth, requestedHeight);
                        }
                        else
                        {
                            webCamTexture = new WebCamTexture(webCamDevice.name, requestedWidth, requestedHeight, (int)requestedFPS);
                        }
                        break;
                    }
                }
            }
            if (webCamTexture == null)
                Debug.Log("Cannot find camera device " + requestedDeviceName + ".");
        }

        if (webCamTexture == null)
        {
            // Checks how many and which cameras are available on the device
            for (int cameraIndex = 0; cameraIndex < devices.Length; cameraIndex++)
            {

#if UNITY_2018_3_OR_NEWER
if (devices[cameraIndex].kind != WebCamKind.ColorAndDepth && devices[cameraIndex].isFrontFacing == requestedIsFrontFacing)
#else
if (devices[cameraIndex].isFrontFacing == requestedIsFrontFacing)
#endif
{
webCamDevice = devices[cameraIndex];
                    if (avoidAndroidFrontCameraLowLightIssue && webCamDevice.isFrontFacing == true)
                        requestedFPS = 15f;

                    if (requestedFPS < 0)
                    {
                        webCamTexture = new WebCamTexture(webCamDevice.name, requestedWidth, requestedHeight);
                    }
                    else
                    {
                        webCamTexture = new WebCamTexture(webCamDevice.name, requestedWidth, requestedHeight, (int)requestedFPS);
                    }
                    break;
                }
            }
        }

        if (webCamTexture == null)
        {
            if (devices.Length > 0)
            {
                webCamDevice = devices[1];

                if (avoidAndroidFrontCameraLowLightIssue && webCamDevice.isFrontFacing == true)
                    requestedFPS = 15f;

                if (requestedFPS < 0)
                {
                    webCamTexture = new WebCamTexture(webCamDevice.name, requestedWidth, requestedHeight);
                }
                else
                {
                    webCamTexture = new WebCamTexture(webCamDevice.name, requestedWidth, requestedHeight, (int)requestedFPS);
                }
            }
            else
            {
                isInitWaiting = false;
                initCoroutine = null;

                if (onErrorOccurred != null)
                    onErrorOccurred.Invoke(ErrorCode.CAMERA_DEVICE_NOT_EXIST);

                yield break;
            }
        }

        // Starts the camera
        webCamTexture.Play();

        int initFrameCount = 0;
        bool isTimeout = false;

        while (true)
        {
            if (initFrameCount > timeoutFrameCount)
            {
                isTimeout = true;
                break;
            }
            else if (webCamTexture.didUpdateThisFrame)
            {
                Debug.Log("WebCamTextureToMatHelper:: " + "devicename:" + webCamTexture.deviceName + " name:" + webCamTexture.name + " width:" + webCamTexture.width + " height:" + webCamTexture.height + " fps:" + webCamTexture.requestedFPS
                + " videoRotationAngle:" + webCamTexture.videoRotationAngle + " videoVerticallyMirrored:" + webCamTexture.videoVerticallyMirrored + " isFrongFacing:" + webCamDevice.isFrontFacing);

                if (colors == null || colors.Length != webCamTexture.width * webCamTexture.height)
                    colors = new Color32[webCamTexture.width * webCamTexture.height];

                frameMat = new Mat(webCamTexture.height, webCamTexture.width, CvType.CV_8UC4);
                screenOrientation = Screen.orientation;
                screenWidth = Screen.width;
                screenHeight = Screen.height;

                bool isRotatedFrame = false;

#if !UNITY_EDITOR && !(UNITY_STANDALONE || UNITY_WEBGL)
if (screenOrientation == ScreenOrientation.Portrait || screenOrientation == ScreenOrientation.PortraitUpsideDown)
{
if (!rotate90Degree)
isRotatedFrame = true;
}
else if (rotate90Degree)
{
isRotatedFrame = true;
}
#else
if (rotate90Degree)
isRotatedFrame = true;
#endif
if (isRotatedFrame)
rotatedFrameMat = new Mat(webCamTexture.width, webCamTexture.height, CvType.CV_8UC4);
                isInitWaiting = false;
                hasInitDone = true;
                initCoroutine = null;

                if (onInitialized != null)
                    onInitialized.Invoke();

                break;
            }
            else
            {
                initFrameCount++;
                yield return null;
            }
        }

        if (isTimeout)
        {
            webCamTexture.Stop();
            webCamTexture = null;
            isInitWaiting = false;
            initCoroutine = null;

            if (onErrorOccurred != null)
                onErrorOccurred.Invoke(ErrorCode.TIMEOUT);
        }
    }

    /// <summary>
    /// Checks camera permission state by coroutine.
    /// </summary>
    protected virtual IEnumerator hasUserAuthorizedCameraPermission()
    {

#if UNITY_IOS && UNITY_2018_1_OR_NEWER
UserAuthorization mode = UserAuthorization.WebCam;
if (!Application.HasUserAuthorization(mode))
{
yield return RequestUserAuthorization(mode);
}
yield return Application.HasUserAuthorization(mode);
#elif UNITY_ANDROID && UNITY_2018_3_OR_NEWER
string permission = UnityEngine.Android.Permission.Camera;
//if (!UnityEngine.Android.Permission.HasUserAuthorizedPermission(permission))
//{
yield return RequestUserPermission(permission);
//}
yield return UnityEngine.Android.Permission.HasUserAuthorizedPermission(permission);
#else
yield return true;
#endif
}
#if (UNITY_IOS && UNITY_2018_1_OR_NEWER) || (UNITY_ANDROID && UNITY_2018_3_OR_NEWER)
protected bool isUserRequestingPermission;
#endif
#if UNITY_IOS && UNITY_2018_1_OR_NEWER
protected virtual IEnumerator RequestUserAuthorization(UserAuthorization mode)
{
isUserRequestingPermission = true;
yield return Application.RequestUserAuthorization(mode);
        float timeElapsed = 0;
        while (isUserRequestingPermission)
        {
            if (timeElapsed > 0.25f)
            {
                isUserRequestingPermission = false;
                yield break;
            }
            timeElapsed += Time.deltaTime;

            yield return null;
        }
        yield break;
    }

#elif UNITY_ANDROID && UNITY_2018_3_OR_NEWER
protected virtual IEnumerator RequestUserPermission(string permission)
{
isUserRequestingPermission = true;
UnityEngine.Android.Permission.RequestUserPermission(permission);
        float timeElapsed = 0;
        while (isUserRequestingPermission)
        {
            if (timeElapsed > 0.25f)
            {
                isUserRequestingPermission = false;
                yield break;
            }
            timeElapsed += Time.deltaTime;

            yield return null;
        }
        yield break;
    }

#endif
    /// <summary>
    /// Indicates whether this instance has been initialized.
    /// </summary>
    /// <returns><c>true</c>, if this instance has been initialized, <c>false</c> otherwise.</returns>
    public virtual bool IsInitialized()
    {
        return hasInitDone;
    }

    /// <summary>
    /// Starts the camera.
    /// </summary>
    public virtual void Play()
    {
        if (hasInitDone)
            webCamTexture.Play();
    }

    /// <summary>
    /// Pauses the active camera.
    /// </summary>
    public virtual void Pause()
    {
        if (hasInitDone)
            webCamTexture.Pause();
    }

    /// <summary>
    /// Stops the active camera.
    /// </summary>
    public virtual void Stop()
    {
        if (hasInitDone)
            webCamTexture.Stop();
    }

    /// <summary>
    /// Indicates whether the active camera is currently playing.
    /// </summary>
    /// <returns><c>true</c>, if the active camera is playing, <c>false</c> otherwise.</returns>
    public virtual bool IsPlaying()
    {
        return hasInitDone ? webCamTexture.isPlaying : false;
    }

    /// <summary>
    /// Indicates whether the active camera device is currently front facng.
    /// </summary>
    /// <returns><c>true</c>, if the active camera device is front facng, <c>false</c> otherwise.</returns>
    public virtual bool IsFrontFacing()
    {
        return hasInitDone ? webCamDevice.isFrontFacing : false;
    }

    /// <summary>
    /// Returns the active camera device name.
    /// </summary>
    /// <returns>The active camera device name.</returns>
    public virtual string GetDeviceName()
    {
        return hasInitDone ? webCamTexture.deviceName : "";
    }

    /// <summary>
    /// Returns the active camera width.
    /// </summary>
    /// <returns>The active camera width.</returns>
    public virtual int GetWidth()
    {
        if (!hasInitDone)
            return -1;
        return (rotatedFrameMat != null) ? frameMat.height() : frameMat.width();
    }

    /// <summary>
    /// Returns the active camera height.
    /// </summary>
    /// <returns>The active camera height.</returns>
    public virtual int GetHeight()
    {
        if (!hasInitDone)
            return -1;
        return (rotatedFrameMat != null) ? frameMat.width() : frameMat.height();
    }

    /// <summary>
    /// Returns the active camera framerate.
    /// </summary>
    /// <returns>The active camera framerate.</returns>
    public virtual float GetFPS()
    {
        return hasInitDone ? webCamTexture.requestedFPS : -1f;
    }

    /// <summary>
    /// Returns the active WebcamTexture.
    /// </summary>
    /// <returns>The active WebcamTexture.</returns>
    public virtual WebCamTexture GetWebCamTexture()
    {
        return hasInitDone ? webCamTexture : null;
    }

    /// <summary>
    /// Returns the active WebcamDevice.
    /// </summary>
    /// <returns>The active WebcamDevice.</returns>
    public virtual WebCamDevice GetWebCamDevice()
    {
        return webCamDevice;
    }

    /// <summary>
    /// Returns the camera to world matrix.
    /// </summary>
    /// <returns>The camera to world matrix.</returns>
    public virtual Matrix4x4 GetCameraToWorldMatrix()
    {
        return Camera.main.cameraToWorldMatrix;
    }

    /// <summary>
    /// Returns the projection matrix matrix.
    /// </summary>
    /// <returns>The projection matrix.</returns>
    public virtual Matrix4x4 GetProjectionMatrix()
    {
        return Camera.main.projectionMatrix;
    }

    /// <summary>
    /// Indicates whether the video buffer of the frame has been updated.
    /// </summary>
    /// <returns><c>true</c>, if the video buffer has been updated <c>false</c> otherwise.</returns>
    public virtual bool DidUpdateThisFrame()
    {
        if (!hasInitDone)
            return false;

        return webCamTexture.didUpdateThisFrame;
    }

    /// <summary>
    /// Gets the mat of the current frame.
    /// The Mat object's type is 'CV_8UC4' (RGBA).
    /// </summary>
    /// <returns>The mat of the current frame.</returns>
    public virtual Mat GetMat()
    {
        if (!hasInitDone || !webCamTexture.isPlaying)
        {
            return (rotatedFrameMat != null) ? rotatedFrameMat : frameMat;
        }

        Utils.webCamTextureToMat(webCamTexture, frameMat, colors, false);

#if !UNITY_EDITOR && !(UNITY_STANDALONE || UNITY_WEBGL)
if (rotatedFrameMat != null)
{
if (screenOrientation == ScreenOrientation.Portrait || screenOrientation == ScreenOrientation.PortraitUpsideDown)
{
// (Orientation is Portrait, rotate90Degree is false)
if (webCamDevice.isFrontFacing)
{
FlipMat(frameMat, !flipHorizontal, !flipVertical);
}
else
{
FlipMat(frameMat, flipHorizontal, flipVertical);
}
}
else
{
// (Orientation is Landscape, rotate90Degrees=true)
FlipMat(frameMat, flipVertical, flipHorizontal);
}
Core.rotate(frameMat, rotatedFrameMat, Core.ROTATE_90_CLOCKWISE);
return rotatedFrameMat;
}
else
{
if (screenOrientation == ScreenOrientation.Portrait || screenOrientation == ScreenOrientation.PortraitUpsideDown)
{
// (Orientation is Portrait, rotate90Degree is ture)
if (webCamDevice.isFrontFacing)
{
FlipMat(frameMat, flipHorizontal, flipVertical);
}
else
{
FlipMat(frameMat, !flipHorizontal, !flipVertical);
}
}
else
{
// (Orientation is Landscape, rotate90Degree is false)
FlipMat(frameMat, flipVertical, flipHorizontal);
}
return frameMat;
}
#else
FlipMat(frameMat, flipVertical, flipHorizontal);
if (rotatedFrameMat != null)
{
Core.rotate(frameMat, rotatedFrameMat, Core.ROTATE_90_CLOCKWISE);
return rotatedFrameMat;
}
else
{
return frameMat;
}
#endif
}
    /// <summary>
    /// Flips the mat.
    /// </summary>
    /// <param name="mat">Mat.</param>
    protected virtual void FlipMat(Mat mat, bool flipVertical, bool flipHorizontal)
    {
        //Since the order of pixels of WebCamTexture and Mat is opposite, the initial value of flipCode is set to 0 (flipVertical).
        int flipCode = 0;

        if (webCamDevice.isFrontFacing)
        {
            if (webCamTexture.videoRotationAngle == 0)
            {
                flipCode = -1;
            }
            else if (webCamTexture.videoRotationAngle == 90)
            {
                flipCode = -1;
            }
            if (webCamTexture.videoRotationAngle == 180)
            {
                flipCode = int.MinValue;
            }
            else if (webCamTexture.videoRotationAngle == 270)
            {
                flipCode = int.MinValue;
            }
        }
        else
        {
            if (webCamTexture.videoRotationAngle == 180)
            {
                flipCode = 1;
            }
            else if (webCamTexture.videoRotationAngle == 270)
            {
                flipCode = 1;
            }
        }

        if (flipVertical)
        {
            if (flipCode == int.MinValue)
            {
                flipCode = 0;
            }
            else if (flipCode == 0)
            {
                flipCode = int.MinValue;
            }
            else if (flipCode == 1)
            {
                flipCode = -1;
            }
            else if (flipCode == -1)
            {
                flipCode = 1;
            }
        }

        if (flipHorizontal)
        {
            if (flipCode == int.MinValue)
            {
                flipCode = 1;
            }
            else if (flipCode == 0)
            {
                flipCode = -1;
            }
            else if (flipCode == 1)
            {
                flipCode = int.MinValue;
            }
            else if (flipCode == -1)
            {
                flipCode = 0;
            }
        }

        if (flipCode > int.MinValue)
        {
            Core.flip(mat, mat, flipCode);
        }
    }

    /// <summary>
    /// Gets the buffer colors.
    /// </summary>
    /// <returns>The buffer colors.</returns>
    public virtual Color32[] GetBufferColors()
    {
        return colors;
    }

    /// <summary>
    /// Cancel Init Coroutine.
    /// </summary>
    protected virtual void CancelInitCoroutine()
    {
        if (initCoroutine != null)
        {
            StopCoroutine(initCoroutine);
            ((IDisposable)initCoroutine).Dispose();
            initCoroutine = null;
        }
    }

    /// <summary>
    /// To release the resources.
    /// </summary>
    protected virtual void ReleaseResources()
    {
        isInitWaiting = false;
        hasInitDone = false;

        if (webCamTexture != null)
        {
            webCamTexture.Stop();
            WebCamTexture.Destroy(webCamTexture);
            webCamTexture = null;
        }
        if (frameMat != null)
        {
            frameMat.Dispose();
            frameMat = null;
        }
        if (rotatedFrameMat != null)
        {
            rotatedFrameMat.Dispose();
            rotatedFrameMat = null;
        }
    }

    /// <summary>
    /// Releases all resource used by the <see cref="WebCamTextureToMatHelper"/> object.
    /// </summary>
    /// <remarks>Call <see cref="Dispose"/> when you are finished using the <see cref="WebCamTextureToMatHelper"/>. The
    /// <see cref="Dispose"/> method leaves the <see cref="WebCamTextureToMatHelper"/> in an unusable state. After
    /// calling <see cref="Dispose"/>, you must release all references to the <see cref="WebCamTextureToMatHelper"/> so
    /// the garbage collector can reclaim the memory that the <see cref="WebCamTextureToMatHelper"/> was occupying.</remarks>
    public virtual void Dispose()
    {
        if (colors != null)
            colors = null;

        if (isInitWaiting)
        {
            CancelInitCoroutine();
            ReleaseResources();
        }
        else if (hasInitDone)
        {
            ReleaseResources();

            if (onDisposed != null)
                onDisposed.Invoke();
        }
    }
}

}
#endif
#endif`
Perhaps this isn't in your wheelhouse anymore but any help is appreciated. Thanks!
Luke

Here is how OpenCV for Unity locates the device and assigns the webcam texture. See anything that the realsense/android wont jive with?
`            // Creates the camera
var devices = WebCamTexture.devices;
if (!String.IsNullOrEmpty(requestedDeviceName))
{
int requestedDeviceIndex = -1;
if (Int32.TryParse(requestedDeviceName, out requestedDeviceIndex))
{
if (requestedDeviceIndex >= 0 && requestedDeviceIndex < devices.Length)
{
webCamDevice = devices[requestedDeviceIndex];
                    if (avoidAndroidFrontCameraLowLightIssue && webCamDevice.isFrontFacing == true)
                        requestedFPS = 15f;

                    if (requestedFPS < 0)
                    {
                        webCamTexture = new WebCamTexture(webCamDevice.name, requestedWidth, requestedHeight);
                    }
                    else
                    {
                        webCamTexture = new WebCamTexture(webCamDevice.name, requestedWidth, requestedHeight, (int)requestedFPS);
                    }
                }
            }
            else
            {
                for (int cameraIndex = 0; cameraIndex < devices.Length; cameraIndex++)
                {
                    if (devices[cameraIndex].name == requestedDeviceName)
                    {
                        webCamDevice = devices[cameraIndex];

                        if (avoidAndroidFrontCameraLowLightIssue && webCamDevice.isFrontFacing == true)
                            requestedFPS = 15f;

                        if (requestedFPS < 0)
                        {
                            webCamTexture = new WebCamTexture(webCamDevice.name, requestedWidth, requestedHeight);
                        }
                        else
                        {
                            webCamTexture = new WebCamTexture(webCamDevice.name, requestedWidth, requestedHeight, (int)requestedFPS);
                        }
                        break;
                    }
                }
            }
            if (webCamTexture == null)
                Debug.Log("Cannot find camera device " + requestedDeviceName + ".");
        }

        if (webCamTexture == null)
        {
            // Checks how many and which cameras are available on the device
            for (int cameraIndex = 0; cameraIndex < devices.Length; cameraIndex++)
            {

#if UNITY_2018_3_OR_NEWER
if (devices[cameraIndex].kind != WebCamKind.ColorAndDepth && devices[cameraIndex].isFrontFacing == requestedIsFrontFacing)
#else
if (devices[cameraIndex].isFrontFacing == requestedIsFrontFacing)
#endif
{
webCamDevice = devices[cameraIndex];
                    if (avoidAndroidFrontCameraLowLightIssue && webCamDevice.isFrontFacing == true)
                        requestedFPS = 15f;

                    if (requestedFPS < 0)
                    {
                        webCamTexture = new WebCamTexture(webCamDevice.name, requestedWidth, requestedHeight);
                    }
                    else
                    {
                        webCamTexture = new WebCamTexture(webCamDevice.name, requestedWidth, requestedHeight, (int)requestedFPS);
                    }
                    break;
                }
            }
        }

        if (webCamTexture == null)
        {
            if (devices.Length > 0)
            {
                webCamDevice = devices[1];

                if (avoidAndroidFrontCameraLowLightIssue && webCamDevice.isFrontFacing == true)
                    requestedFPS = 15f;

                if (requestedFPS < 0)
                {
                    webCamTexture = new WebCamTexture(webCamDevice.name, requestedWidth, requestedHeight);
                }
                else
                {
                    webCamTexture = new WebCamTexture(webCamDevice.name, requestedWidth, requestedHeight, (int)requestedFPS);
                }
            }
            else
            {
                isInitWaiting = false;
                initCoroutine = null;

                if (onErrorOccurred != null)
                    onErrorOccurred.Invoke(ErrorCode.CAMERA_DEVICE_NOT_EXIST);

                yield break;
            }
        }`

Hi @Kukewilly  In example code in Unity's WebCamTexture documentation in the link below, they state the instruction WebCamTexture in front of the custom WebCamTexture name.
https://docs.unity3d.com/ScriptReference/WebCamTexture-deviceName.html

So I wonder whether you need to add WebCamTexture onto the start of the relevant lines.  for example:
WebCamTexture webCamTexture = new WebCamTexture(webCamDevice.name, requestedWidth, requestedHeight);

@MartyG-RealSense Thanks for the reply. Higher up in the same script webCamTexture is declared as a WebCamTexture and it runs great from my PC. Sry I didn't paste it all because it came in messy.
I'm reading a lot about external USB cameras on Android being more complex than calling the native camera on a device. I'm hoping to hear from @GeorgeAdamon on how he actually accessed the camera feed in Unity with C# because it appears I've reproduced everything in his instructions correctly up until step 4. But I'm under the impression that step doesnt apply to me because all I need is the webcamTexture from the realsense so I can use it for openCV. I'm not actually trying to run any of the realsense scenes or view pointcloud/depth.
I also came across this asset (https://assetstore.unity.com/packages/tools/integration/usb-camera-for-unity-android-151744#description)  which claims to be able to solve my problem but his test .apk doesnt launch on my quest. Emailed him and waiting to hear back.
If you can think of anything else worth trying let me know :)
Thanks

I researched the CornerRadius error and found suggestions about resolving it in the link below.
https://stackoverflow.com/questions/49280632/error9-5-error-resource-androidattr-dialogcornerradius-not-found

I got wireless debugging set up with logcat and these are realsense related messages I'm getting when I plug in the realsense and accept permissions:
11-23 13:54:09.158: D/UsbHostManager(1038): Added device UsbDevice[mName=/dev/bus/usb/001/002,mVendorId=32902,mProductId=2874,mClass=239,mSubclass=2,mProtocol=1,mManufacturerName=Intel(R) RealSense(TM) Depth Camera 435i,mProductName=Intel(R) RealSense(TM) Depth Camera 435i,mVersion=50.1215,mSerialNumberReader=com.android.server.usb.UsbSerialReader@9c3723e,mConfigurations=[
11-23 13:54:09.158: D/UsbHostManager(1038): UsbInterface[mId=0,mAlternateSetting=0,mName=Intel(R) RealSense(TM) Depth Camera 435i Depth,mClass=14,mSubclass=1,mProtocol=0,mEndpoints=[
11-23 13:54:09.158: D/UsbHostManager(1038): UsbInterface[mId=1,mAlternateSetting=0,mName=Intel(R) RealSense(TM) Depth Camera 435i Depth,mClass=14,mSubclass=2,mProtocol=0,mEndpoints=[
11-23 13:54:09.158: D/UsbHostManager(1038): UsbInterface[mId=2,mAlternateSetting=0,mName=Intel(R) RealSense(TM) Depth Camera 435i Y,mClass=14,mSubclass=2,mProtocol=0,mEndpoints=[
11-23 13:54:09.158: D/UsbHostManager(1038): UsbInterface[mId=3,mAlternateSetting=0,mName=Intel(R) RealSense(TM) Depth Camera 435i RGB,mClass=14,mSubclass=1,mProtocol=0,mEndpoints=[]
11-23 13:54:09.158: D/UsbHostManager(1038): UsbInterface[mId=4,mAlternateSetting=0,mName=Intel(R) RealSense(TM) Depth Camera 435i RGB,mClass=14,mSubclass=2,mProtocol=0,mEndpoints=[
11-23 13:54:09.158: D/UsbHostManager(1038): UsbInterface[mId=5,mAlternateSetting=0,mName=Intel(R) RealSense(TM) HID,mClass=3,mSubclass=0,mProtocol=0,mEndpoints=[
11-23 13:54:09.193: I/librs UsbUtilities(10882): device: UsbDevice[mName=/dev/bus/usb/001/002,mVendorId=32902,mProductId=2874,mClass=239,mSubclass=2,mProtocol=1,mManufacturerName=Intel(R) RealSense(TM) Depth Camera 435i,mProductName=Intel(R) RealSense(TM) Depth Camera 435i,mVersion=50.1215,mSerialNumberReader=android.hardware.usb.IUsbSerialReader$Stub$Proxy@f1fcf4d,mConfigurations=[
11-23 13:54:09.193: I/librs UsbUtilities(10882): UsbInterface[mId=0,mAlternateSetting=0,mName=Intel(R) RealSense(TM) Depth Camera 435i Depth,mClass=14,mSubclass=1,mProtocol=0,mEndpoints=[
11-23 13:54:09.193: I/librs UsbUtilities(10882): UsbInterface[mId=1,mAlternateSetting=0,mName=Intel(R) RealSense(TM) Depth Camera 435i Depth,mClass=14,mSubclass=2,mProtocol=0,mEndpoints=[
11-23 13:54:09.193: I/librs UsbUtilities(10882): UsbInterface[mId=2,mAlternateSetting=0,mName=Intel(R) RealSense(TM) Depth Camera 435i Y,mClass=14,mSubclass=2,mProtocol=0,mEndpoints=[
11-23 13:54:09.193: I/librs UsbUtilities(10882): UsbInterface[mId=3,mAlternateSetting=0,mName=Intel(R) RealSense(TM) Depth Camera 435i RGB,mClass=14,mSubclass=1,mProtocol=0,mEndpoints=[]
11-23 13:54:09.193: I/librs UsbUtilities(10882): UsbInterface[mId=4,mAlternateSetting=0,mName=Intel(R) RealSense(TM) Depth Camera 435i RGB,mClass=14,mSubclass=2,mProtocol=0,mEndpoints=[
11-23 13:54:09.193: I/librs UsbUtilities(10882): UsbInterface[mId=5,mAlternateSetting=0,mName=Intel(R) RealSense(TM) HID,mClass=3,mSubclass=0,mProtocol=0,mEndpoints=[
11-23 13:54:09.208: I/librs MessagesHandler(10882): handleMessage: realsense device attached
11-23 13:54:09.213: E/UsbManager(10882): 	at com.intel.realsense.librealsense.DeviceWatcher.addDevice(DeviceWatcher.java:115)
11-23 13:54:09.213: E/UsbManager(10882): 	at com.intel.realsense.librealsense.DeviceWatcher.invalidateDevices(DeviceWatcher.java:78)
11-23 13:54:09.213: E/UsbManager(10882): 	at com.intel.realsense.librealsense.DeviceWatcher.access$000(DeviceWatcher.java:16)
11-23 13:54:09.213: E/UsbManager(10882): 	at com.intel.realsense.librealsense.DeviceWatcher$1.onDeviceAttach(DeviceWatcher.java:44)
11-23 13:54:09.213: E/UsbManager(10882): 	at com.intel.realsense.librealsense.Enumerator.notifyOnAttach(Enumerator.java:102)
11-23 13:54:09.213: E/UsbManager(10882): 	at com.intel.realsense.librealsense.Enumerator.access$200(Enumerator.java:18)
11-23 13:54:09.213: E/UsbManager(10882): 	at com.intel.realsense.librealsense.Enumerator$MessagesHandler.handleMessage(Enumerator.java:144)
11-23 13:54:11.169: I/ActivityTaskManager(1038): START u0 {act=android.hardware.usb.action.USB_DEVICE_ATTACHED flg=0x10000000 cmp=com.DefaultCompany.MetaplexTest/com.intel.realsense.librealsense.DeviceWatcherActivity (has extras)} from uid 10074
11-23 13:54:11.505: I/librs MessagesHandler(10882): handleMessage: realsense device attached
These are my Debug.Log mesages from unity but in logcat:
11-23 13:59:40.318: I/Unity(13133): Cannot find camera device Intel(R) RealSense(TM) Depth Camera 435i RGB.
11-23 13:59:40.329: I/Unity(13133): OnWebCamTextureToMatHelperErrorOccurred CAMERA_DEVICE_NOT_EXIST
Seems unable to find the device by name, also tried changing the device number manually to index 3 because it looked like the RGB camera mId is 3 but it didn't work either. Are you able to make anything of this?

@Kukewilly   I thoroughly researched use of OpenCV For Unity but did not find many helpful leads except for an old RealSense Unity wrapper project created by a RealSense user in the link below that made use of OpenCV For Unity.
https://github.com/ajingu/RealSense/blob/a4a45d5e13750340b539028e28c47af13cf983e7/Assets/RealSenseSDK2.0/Scripts/Original/ArucoPointCloud.cs
In the Using import instructions at the top of this script, it imports:
using Intel.RealSense;
using OpenCVForUnity;

@MartyG-RealSense I know it's pretty sparse out there in terms of examples. I really appreciate your help either way. I imported both of those at the tops of my permission script and the script that determines the webcam device I'm using, the webcamdevice list is still showing up as empty in Unity on logcat.
The RealSense and it's scenes work great when the camera is plugged into my pc. But I confirmed with Debug.Log(devices.length) that the device list is empty when running the realsense from the Oculus usb. So for some reason, although android is able to see the realsense and it's components when I plug it in (as per the debug messages above from logcat), the Realsense is not being added to the webcamTexture.device list in Unity.
I've read something about customizing a manifest, unfortunately I don't have the experience to know what that means or what to do with it but I will keep researching.

@Kukewilly  Unity's official documentation about the Android manifest is here:
https://docs.unity3d.com/Manual/android-manifest.html
The RealSense Android wrapper's xml manifest is here:
https://github.com/IntelRealSense/librealsense/blob/master/wrappers/android/tools/camera/src/main/AndroidManifest.xml

I don't know if I'm in the right place, but I have a problem.
I need to stream a good quality image from two webcams to the oculus quest pro. For the cameras I developed an application in python that allows me to join these images one after the other.
For the VR part in unity, place a plane and assign for now these images that you take as material to that plane, now assign this plane as a child to the XR Origin - Main Camera.
Now the problem is that I don't know how close or how far it has to be to be able to generate the 3D effect.
I can not assign only a single image for one eye and another for another eye. Does anyone know if this is possible?

This is absolutely not the right place for it haha.
But I'll tell you anyway - the easiest way would be to create a shader that uses single pass stereo rendering to show one texture to when being viewed from the right eye camera, and another texture when being viewed from the left eye camera. It's been a few years since I've needed to mess around with stereo shaders so I can't remember the specifics, but there's a Unity-provided build-in variable called something like STEREO_EYE_INDEX. Some Googleling or AI-dialogue should get you there :)

Thanks to everyone for sharing! Although the Realsense camera can successfully connect with Quest via Mono with ARMv7, there is a conflict with Quest's MR development. Because the passthrough mode is only supported by IL2CPP with ARM64. Does anyone know how to solve this problem?


[gyb] added feature to gyb.py to search for an process a new template…

… tag, when encountered in AST it is processed in line
Added new tag <{TEMPLATE_FILE_NAME} for processing embedded templates in gyb templates. Created a new class to represent a template, and when they are encountered in the AST they are processed in place in a new ParseContext

@swift-ci Please smoke test

Why is adding this a good idea?  We already have ${expand(...)} which serves the same purpose without adding new syntactic elements, properly interacts with line-directive and the build system, and is more flexible.  See here for an example.

@flyin1600 accordingly, closing this PR.  If you disagree, feel free to reopen it.

no problem, it seems like this is, in fact, duplicating existing functionality


Add Publix refresh handler (and bin)

Hello from Publix country!
https://github.com/GUI/covid-vaccine-spotter/issues/31
What else is needed to complete Publix pharmacy working here?
I can't confirm it's working, mostly because I can't get my database set up. Migrations fail because I don't have the postgis extension. On MacOS, I'm running postgres 12 for work. Since the latest is 13, brew install postgis succeeds, but installs the version of postgis for pg 13, which doesn't work with pg 12.

Hi, if you look at my pr and either merge it in or just take parts of it, you should be able to get a working database to test against: https://github.com/GUI/covid-vaccine-spotter/pull/64

Thank you! Publix would be great to add. @bblack, do you have any sense of how accurate these county level listings are? I had started to look at Publix a while back, but haven’t had a chance to revisit it. If we could rely on these simple county level text files, that would obviously be super quick and easy to update from. I thought when I was originally poking around at this though, it seemed like these lists might lag real appointment availability once you go further into the appointment booking process (eg, this text file would say there were appointments available in a county, but then nothing actually was). But I can’t quite remember if this was the case, or I’m might be mixing this up with another provider. In any case, I think this could still be useful, but just curious if you had any experience or knowledge with how accurate this info might be.

it seemed like these lists might lag real appointment availability once you go further into the appointment booking process

Actually, I hadn't realized there was any further information on their website, because if you select Georgia, or South Carolina, then you merely see the county-level data (which are all versions of "no availability") and a message like:

All available COVID-19 vaccine appointments have been claimed.

But now I've clicked around Florida a bit, and it looks pretty accurate. The biggest problem is that you can't get any data finer than percent-per-county without specifying a single store and completing recaptcha. Once you do that, there are a few possible outcomes:

a request is made, the response of which tells the page to say "No appointments available" for that store
a request is made (e.g. GET https://rx.publix.com/en/f/s/store/appt/1173?eid=181 for store 1173), the response of which is presumably a list of time slots (although I couldn't find any stores that returned more than a single available time slot)
a request is made (e.g. POST https://rx.publix.com/en/f/s/appt/autoreserve?eid=181), which apparently selects and claims a time slot (the page says for 20 minutes)

If we could make that GET request, then we'd have the time slots available for a given store. I've pared it down to:
curl 'https://rx.publix.com/en/f/s/store/appt/<store_number>?eid=181' \
  -H '__RequestVerificationToken: <...>' \
  -H 'Cookie: __RequestVerificationToken=<...>; akavpau_VP_RX_db52e60931a8=<...>;' \
  --compressed

Presumably the __RequestVerificationToken header and cookie come from the recaptcha; I'm not sure what the other cookie is but it seems necessary.

If we could get the list of Publix stores, along with what county and state each one is in, then we could at least determine which stores have no availability due to the entire county having no availability.

Pulling from the press releases: https://corporate.publix.com/about-publix/newsroom/news-releases
Most recent PDFs FL GA SC
I was able to use onlineocr.net to pull info from the pdf into excel files and got rid of the extraneous and empty cells
001_FL_COVID19_Vaccines_02-25-21-3pm.xlsx
002_SC_COVID19_Vaccines_03-15-21.xlsx
003_GA_COVID19_Vaccines_03-15-21.xlsx

Sorry for not circling back to this one sooner! I implemented Publix checking last week (https://github.com/GUI/covid-vaccine-spotter/commit/a5d91ddc0e162c41d3b9f8f7014df71b62161548). Publix appears to have changed their site, so the county-level text files are no longer being maintained, so it requires checking all the individual stores using the rx.publix.com endpoints. So apologies for the delay meaning things shifted, but the tips on the endpoints were useful, so thank you for getting all of this rolling, @bblack!


Issue #6: Added Search component with debouncing

@vverma022 -  Do you need help with this ticket or are you stuck somewhere ?
Let's try to complete this PR and make the search feature live soon.
A lot of interesting features can be build on top of it later.

@vverma022 - Do you need help with this ticket or are you stuck somewhere ?
Let's try to complete this PR and make the search feature live soon. A lot of interesting features can be build on top of it later.
Yes, the backend part. I apologise for the errors

Closing this PR for now. I'll work on the backend portion and re-open this issue.


Execute an action when finding status changes

Is your feature request related to a problem? Please describe
I'd like the ability to automatically update configuration/suppression files for security scanning tools based on the status of a finding. For example, if a finding is closed as "false positive" in DD I'd like the ability to update the configuration file for the tool accordingly
Describe the solution you'd like
As a developer I'd like to build a way for DD to trigger and action (e.g. script execution) following a change in a finding's status.
Describe alternatives you've considered
I've considered a running a cron job to monitor database changes but feels messy - also the action trigger should be 'pushed' rather than 'pulled'
Additional context
@aaronweaver @devGregA This feature requires some work. Before considering a PR, do you see it as a valid use case for DD's community? Would be good to have this merged into master eventually.

@clazba I think that's a really interesting use case and would be useful for some users. I wonder though if we added webhooks for events with a webhook endpoint that an external service / endpoint could decide how to supress the findings in the various scanners. That feature would be very useful (webhooks) to the community at large and address your specific use case. We could also consider add a microservice repo in the DD org for useful integrations such as this.

@aaronweaver I think it's a super idea and a more robust way to provide 3rd party integration. Is this something the DD core dev team has already started looking into? Else happy to discuss it with some colleagues to see how much work this would be for us to implement.

@clazba Feel free to work on it, I can convert this to an issue and assign you as the owner. At the moment we are wrapping up the Python3 and Django 2.2 migration.


add docs about using nvm to readme and contributing.md

Bug/issue #, if applicable: None
Summary
This PR adds a blurb to the README and CONTRIBUTING.md files about using nvm to handle installing Node and npm. Since Swift-DocC-Render has an .nvmrc file, this provides a quick way to ensure that you have the right versions of Node/npm before working on the project itself.
Dependencies
None
Checklist
Make sure you check off the following items. If they cannot be completed, provide a reason.

[ n/a ] Added tests
[x] Ran npm test, and it succeeded
[x] Updated documentation if necessary

@swift-ci Please test


How can I use server actions with botkit middleware?

The tutorial at https://console.bluemix.net/docs/tutorials/slack-chatbot-database-watson.html uses server actions to directly access data in Db2 from Watson Assistant. How is it possible to reuse the serverless code with botkit and botkit middleware?

It's fairly easy by utilizing the "before" method. See here for the code: https://github.com/data-henrik/botkit-watson-serveraction


mons: adding missing info to start operator

somehow log to ask user to press enter to
start the operator and continue starting
mon quorum was missing, adding now. It was
mentioned in the doc but missing the command.

 I guess it looked hung?

yess


CircleCI tests are failing because of isort changes

🐞 Problem
After version 5.0.0, isort has dropped the --recursive or -rc flag, which breaks our CircleCI's config.yml, as we still use this flag. Same for tox.ini.
🎯 Goal

Fix the testing process.
💡 Possible solutions

Remove -rc and/or --recursive flags from config.yml and tox.ini, as suggested by @shreyasbapat.
📋  Steps to solve the problem

Comment below about what you've started working on.
Add, commit, push your changes
Submit a pull request.
Add this in the comments:

Addresses #<put issue number here> if you are partially fixing the issue.
Fixes #<put issue number here> if you are completely fixing the issue.

Ask for a review in comments section of pull request
Celebrate your contribution to this project 🎉

@shreyasbapat I have made the required changes in #521.


Search single character must use () to enclose it.

Search single character must use () to enclose it.
Just like i want to search "a" character. If i input "a" it will not search. I must input "(a)" it will search "a". It only happen in single character. If i input two or more character it will search normally.

Actually i don't know the bracket() means here. Is it possiable to search one character without () ?
Thank you.

on default it search 3 character. i do that because if you search 1 character on big project it can crash because too many result.
btw i still prefer search by / on current buffer

Thank you. l understand the reason.
I use this plugin to search one character because l want add something to begaining of all lines. So l must search "^" in regular expression.
Whatever , this plugin is very useful.


Migrate functions doesn't handle exceptions

[X] I have searched the issues of this repository and believe that this is not a duplicate.

Describe the bug 🐛
Verifications are always needed on the project, with this on the file MigrateCommand.cs when the program calls the functions and after them the project is just printing success so a verification for exceptions on this functions is requested.

To Reproduce 😯

Go to andromeda/Andromeda.ConsoleApp/Commands/MigrateCommand.cs
Scroll down to lines 31 and 39
See that functions MigrateDataLake() and MigrateFacebook() doesn't handle exceptions

Expected behavior 🤔

We expect that database functions are prepared to handle exceptions.
Your environment

OS: Ubuntu 18.04

Closing because the project context changed too much since then


exchange core showing java.lang.OutOfMemoryError:Java Heap Space

Hi @mzheravin
I am running exchange-core and there is huge number of offers lets say 467314 . And continuously users are placing orders and trading them. But my tomcat server throwing  java.lang.OutOfMemoryError:Java Heap Space error after running certain time. If I restart the server then it will be ok but again it will throw that error.
Any suggestion how exchange-core can handle this bulk offers in production.
Thanks

Hi @mzheravin  any suggestion about my issue.

Hello,
i guess a heap analysis must begin with your favorite profiler, how much finalizer instance do you have ? etc etc


fix:eureka InstanceInfo.InstanceStatus should be OUT_OF_SERVICE when unregister

What is the purpose of the change
fix, eureka InstanceInfo.InstanceStatus should be OUT_OF_SERVICE when unregister
Brief changelog
change InstanceInfo.InstanceStatus from UP to OUT_OF_SERVICE when unregister

It's weird that the CI fails.


No dependency graph relationships reported in CycloneDX output

What happened:
I am scanning against a Python repo using Poetry (poetry.lock). Using cyclonedx-json output (also tried other output including json) and I do not get the dependency graph.
What you expected to happen:
I want the CycloneDX dependencies section to be filled
How to reproduce it (as minimally and precisely as possible):
syft packages dir:. -o cyclonedx-json
Anything else we need to know?:
Environment:

Output of syft version: 0.56
OS (e.g: cat /etc/os-release or similar): macos

Hmmm I see that it's not implemented https://github.com/anchore/syft/blob/main/syft/pkg/cataloger/python/parse_poetry_lock.go#L18-L31 :(

Indeed, this could be a nice enhancement -- PRs are welcome! :)


Tables list doesn't update after file upload

Was this functionality working on master, but then on my branch with my changes it stopped working?

Yes. Only caught it just yesterday
-O

On Jun 30, 2016, at 10:35, Michael Kulbacki<EMAIL_ADDRESS>wrote:
Was this functionality working on master, but then on my branch with my changes it stopped working?
—
You are receiving this because you were assigned.
Reply to this email directly, view it on GitHub, or mute the thread.

Ill compare it to master and see if I changed something

Browser caching issues wouldn't allow me to see the updated table, issue is fixed


Feature req: Activity feed

A CM said it would be nice to have some representation of what she did over the course of the evening -- her point of reference was a facebook activity feed. This seems to stem from a concern that the call list being cleared would run the risk of people falling through the cracks. For all the things we hate about the spreadsheet it does make history accessible.
Should keep in mind as an eventually thing.
Stems from #614

Love this idea! @lwaldsc what do you think? What data would be relevant in the feed? Should it clear out every 24 hours or once a week?

Thoughts we have to run through:

Where does this live? On the dash? Under another link at the top?
If a separate page, is this connected to an individual CM data center (#632) ? (This may be a pipe dream at this case, but I think would be nice for CMs.)
Is this just one CM or across CMs on a single line?
How often to clear: after 24 hours, 72 hours, or a week? My gut is to clear more often then less often but there is something valuable in keeping activity data more than one day for CM shift handoff.
[Un/related: We have an issue now with CMs putting a lot of unnecessary patient data in handoff emails, so anything that cuts down on that is great.]
Phone Number, LMP, Last Call Date, Last Call Time, Last Call Result, Last Case Manager to record a call, Last Note in a popdown, + to add to call list

Thoughts @NerdyGirl537 and @vtmeghan ?

I think 48 hours could be a good time frame which would make change over a little more seamless.  It should be line specific but not specific to the CM or it won't be helpful in handoff.

Colin and I chatted this out tonight and feel it would be best as just an action log housed in scrolling box at the bottom of the dashboard. Would be a text list of recent calls and pledges within a 48-72 hour period over a given line, sorted by date. Thoughts?
##[Date]
*Lisa W. called C.F. (D0-6660) at 10:03 pm. (+)
*Lisa W. left a voicemail for K.T. (D1-2345) at 9:45 pm. (+)
*Lisa W. pledged J.H. (D9-8765) at 9:15 pm. (+)
*Lisa W. called J.R. (D2-4680) at 8:58 pm. (+)
*Lisa W. left a voicemail for C.F. (D0-6660) at 8:50 pm. (+)
*[CM] [action "called"/"called but did not reach"/'left a voicemail for"/"pledged"] [PT initials] [DCAF id] at [time]. [Add to call list button]
##[Date]
*[CM] [action "called"/"called but did not reach"/'left a voicemail for"/"pledged"] [PT initials] [DCAF id] at [time]. [Add to call list button]
*[CM] [action "called"/"called but did not reach"/'left a voicemail for"/"pledged"] [PT initials] [DCAF id] at [time]. [Add to call list button]
*[CM] [action "called"/"called but did not reach"/'left a voicemail for"/"pledged"] [PT initials] [DCAF id] at [time]. [Add to call list button]

Love it. Just to add some easy specs:
h1. [DC] Call Line Activity Log
h3. [Date]
bulleted body list
'Add' as an underlined blue link
Easy peasy!

We haven't really explored event messaging that much, but I thnk we can do it fairly painlessly from a backend perspective. Here's a proposed backend implementation of it:

We track certain CM-relevant events (logging a call, sending a pledge)
Those go into a mongo collection, events, backed by its own model with no relations
In the event the appropriate controller action gets hit (patient create, call create, patient update with a pledge sent), an event gets logged in the mongo collection
to keep the events table from spiraling, we clear out everything more than 72 hours old every night as part of the nightly_cleanup rake task

Frontend wise, we stick this in a partial at the bottom of the dashboard, and give it a scrollbar so it doesn't take up a ton of space.

I started laying down some groundwork for this. There's still a lot more to be done: PR 1136

Tagging @vtmeghan @alisonnjones @deesriv cuz we talked about it tonight


chore: move extensive network logs from info to debug level

Moving gossip/syncing logs from INFO to DEBUG and DEBUG to TRACE to avoid extensive logging on INFO level.
Added additional configuration that is off by default where these networking debug logs can easily be turned on.

I am not sure why we need add the output files in default_config.hpp, devnet_config.hpp and testnet_config.hpp? In devnet and testnet, that's not use the devnet_config.hpp or testnet_config.hpp for log channels deploying nodes. That use https://github.com/Taraxa-project/taraxa-testnet/blob/development/tests/taraxa-node/devnet.values.yaml

I created PR in taraxa-testnet to use this configuration instead of overriding log channels: https://github.com/Taraxa-project/taraxa-testnet/pull/86

prnet cleaned-up successfully


feat: implement hook for stalled goroutines

When a goroutine does not return within the specified time (StalledThreshold) the hook OnGoroutineStalled() is triggered. This is a warning only, the goroutine is still required to run to completion.

Welcome to Codecov :tada:
Once merged to your default branch, Codecov will compare your coverage reports and display the results in this comment.
Thanks for integrating Codecov - We've got you covered :open_umbrella:


Nil panic when detecting local git metadata on windows

`debug: initializing workspace
debug: running Infracost in project: d:
debug: running Infracost cmd cmd /C "set INFRACOST_CLI_PLATFORM=vscode && infracost breakdown --path "d:" --format json --log-level info"
error: Infracost cmd error trace Error: Command failed: cmd /C "set INFRACOST_CLI_PLATFORM=vscode && infracost breakdown --path "d:" --format json --log-level info"
Error: An unexpected error occurred
runtime error: invalid memory address or nil pointer dereference`
dont show the cost in vscode

Hi @hiran-filho thanks for opening this issue. I've tracked down the error and it seems to be an error coming from within a library we use to detect local git metadata. It seems it's struggling to properly handle an error when it can't find the local .git directory in the workspace.
I've added this to our grooming agenda to discuss with the team, so we can prioritise accordingly. The panic seems to have been resolved in go-git (the lib we use) in this commit: https://github.com/go-git/go-git/commit/935af59cf64fbe49eb8baba9fe80e6b236daf593, but for some reason we don't seem to have these lines the infracost go module we've downloaded. Even though this is the latest release, hopefully it's just a simple go mod update/cache clean. I'm adding the stacktrace below and problem code for any engineers who do pick this up.
  :24                                             Stack()
   :68                                             Run.func1()
   :838                                            panic()
   :283                                            dotGitToOSFilesystems()
   :241                                            PlainOpenWithOptions()
   :309                                            (*metadataFetcher).getLocalGitMetadata()
   :153                                            (*metadataFetcher).Get()
   :93                                             runMain()
   :43                                             breakdownCmd.func1()
   :856                                            (*Command).execute()
   :974                                            (*Command).ExecuteC()
   :902                                            (*Command).Execute()
   :86                                             Run()
   :34                                             main()

Hi @hiran-filho, I've merged a fix for this issue into master, and it will go out with the next release. I'll ping you here when it's available. Thanks.

thank @hugorut , I will wait anxiously

thank @hugorut,  I will wait anxiously

Hi @hiran-filho the fix for this issue has been published in the 0.10.11 release. Thanks for bringing it to our attention.


Filter Request Queue by applicant name

As an analyst
I want to filter requests by applicant name
so that I can view previous requests by the same person

Assumptions & Scope
What are the assumptions for this story?
Only see requests made in new system for now
What is in and not in scope?
Integration with AXIS to see historical requests
Acceptance Criteria
Scenario 1: Filter by applicant name - happy path

GIVEN an analyst is on the request queue
https://jacklyn808742.invisionapp.com/console/share/XU2L77IGEA/631997879
And the intake analyst enters a known applicant name (last name, first name, last name and first name) in the search field
WHEN the intake analyst clicks 'Apply'
THEN only the requests made by applicants with those names will appear,
AND the requests will be sorted alphabetically by applicant name with Unopen at top (by date submitted from newest to oldest), in the middle by Open (days left, less to more), and at the bottom Closed (by date closed, newest to oldest).

Scenario 1: Filter by applicant name - sad path

GIVEN an analyst is on the request queue
https://jacklyn808742.invisionapp.com/console/share/XU2L77IGEA/631997879
And the intake analyst enters an unknown applicant name in the search field
WHEN the intake analyst clicks 'Apply'
THEN the analyst will see a message that the applicant was not found

Scenario 3: xxxxxx
...
Dependencies? What is the impact of this dependency? (If so, link dependency in the ticket, make it visible in a team´s backlog)
Validation Rules? (If yes, list here)
Design
@xxx - please link the Design here
Definition of Ready

[ ] Is there a well articulated User Story?
[ ] Is there Acceptance Criteria that covers all scenarios (happy/sad paths)?
[ ] If there is a user interface, is there a design?
[ ] Does the user story need user research/validation?
[ ] Does this User Story needs stakeholder approval?
[ ] Design / Solution accepted by Product Owner
[ ] Is this user story small enough to be completed in a Sprint? Should it be split?
[ ] Are the dependencies known/ understood? (technical, business, regulatory/policy)
[ ] Has the story been estimated?

Definition of Done

[ ] Passes developer unit tests
[ ] Passes peer code review
[ ] If there's a user interface, passes UX assurance
[ ] Passes QA of Acceptance Criteria with verification in Dev and Test
[ ] Confirm Test cases built and succeeding
[ ] No regression test failures
[ ] Test coverage acceptable by Product Owner
[ ] Ticket ready to be merged to master or story branch
[ ] Developer to list Config changes/ Update documents and designs
[ ] Can be demoed in Sprint Review
[ ] Tagged as part of a Release
[ ] Feature flagged if required
[ ] Change Management activities done?

@mpilchar, @JHarrietha-AOT, I think this story needs more UX research with staff before we do refinement. Need to know if they need searches on full names, or also last names, and first names.


Update auto-labeler

Removed dotnet-api-docs entries
Added ml-api-docs for now (@JRAlexander can we redirect the ML.NET API feedback somewhere else?)
Added an entry for the design guidelines topics

Sounds good @JRAlexander. Let's chat tomorrow or Wed!


Limit number of concurrent status pulls

Currently we make as many http calls as nodes we have.
This means we may create thousands connections to remote
agents. We should limit and control this number.
This PR introduces minimal change to add rate limiting
for that process. Number of concurrent connections will
be limited just to fit in pull interval window.
See: https://jira.d2iq.com/browse/COPS-5915

This means we may create thousands connections to remote
agents.

How many connections are we creating per agent node?

We create one connection per agent for status pull at single time. It's not a problem for dcos-diagnostics but it's a problem for networking services adminrouter and bouncer


Message key value is displayed. Sometimes?

Describe the bug
Message key value is displayed. Sometimes?
To Reproduce
Steps to reproduce the behavior:

Continue to refresh the screen Until the problem is reproduced

Expected behavior
You should show the message to the user
Desktop (please complete the following information):

OS: MacOS
Browser chrome
Version 79.0.3945.79

Additional context
https://drive.google.com/file/d/1egBaf9I_raJhG7ri9NvluEfSCks343mC/view?usp=sharing
Be patient and watch the video. The video time is one minute!

@eltriny Could you check this issue?

This problem has been forgotten


Add more maintainers / turn into an org?

Looking at the pull request list theres a lot of un-touched PRs that are sitting idle waiting with multiple requests from the authors with no replies from maintainers. I'm sure there are a lot of people wanting to help out in ensuring everything runs smoothly.
There are many good reasons for the current maintainers to be busy, perhaps encouraging more people to help run the project would be useful? I know I've been turned off contributing because of this, and I'd really like Alcatraz to succeed.
This worked out really well on Moya once we converted it to a Moya org, it's progressed a lot without our direct hand in the implementation.

I'm sure there are a lot of people wanting to help out in ensuring everything runs smoothly.

✋

I know I've been turned off contributing because of this, and I'd really like Alcatraz to succeed.

This. Some features are sorely needed (stand-alone app and binary distribution come to mind). I've been contemplating just running my own fork for some time now because the PR don't get feedback, but I'd much prefer avoiding fragmentation and help building an universal great solution for the community :) .

:+1:

I wouldn't be against this at all, it's up to @supermarin though IMO

@guillaume-algis I owe you an email. for a longer time now, and I'm sorry it hasn't happened sooner.

@orta I'm down for making an organization, and we already tried claiming https://github.com/alcatraz a year ago.
If you guys are willing to email Github and ask for the same thing, maybe they'd be open for reconsidering.
The main reason why most of the features didn't go in is that either code was not following our guidelines, or the features were half baked.
We always tried to keep it minimal and deal with as least maintenance as possible.
Let's revisit this within a week - I haven't had time for any OSS in awhile, but am getting back on track.

The problem is things like this:

@guillaume-algis I owe you an email. for a longer time now, and I'm sorry it hasn't happened sooner.

Which is exactly the kind of treatment I got for https://github.com/supermarin/Alcatraz/pull/154 - which was enough for me to stop contributing entirely. No offering of help along the way, just eventually "no, but thanks for the hours." "we'll cherry pick what we like".

The main reason why most of the features didn't go in is that either code was not following our guidelines, or the features were half baked.

Doesn't explain why so many are just left abandoned and un-merged.

We always tried to keep it minimal and deal with as least maintenance as possible.

Low maintenance means no changes, which is fine, make this obvious on the README that Alcatraz is a done project. That's not a problem either.
In general though the maintainers attitudes has really held Alcatraz back, I've made annual "look into forking Alcatraz" notes in my calendar ( the last one I decided to skip because it looked like https://github.com/supermarin/Alcatraz/issues/201 might have been a mark of change ) but this time it really does feel like it's probably best to do a merb style fork with the aim of eventually bringing it back into alcatraz in year or so. I don't have time to run a full fork, as I have another Mac app to build but I would definitely contribute to someone elses.

Let's try to keep this on track:
I think it's probably a good idea to add more maintainers, it's clear that we haven't been able to put in the time that Alcatraz needs, I know I haven't.
If @supermarin and @kattrali feel the same way let's see if we can find the right people to help out.

In the meantime GitHub agreed to transfer the ownership of "alcatraz". I already forwarded @supermarin an email from GitHub staff.

:tada: thanks @sebastianludwig

:+1: for an alcatraz org! Spread the work among many maintainers to take some load off you guys.

+1

@orta I'm happy to continue the conversation in a different tone than this.
Alcatraz has been a team work and writing stuff like above hits
everyone that has put their free time in it, not just me.
Every PR was reviewed by other team members,
and would have been merged if others were comfortable with the contribution.
The organization is created, and we'll transfer the repo(s) this week.
Just moving Alcatraz to an organization will not solve this problems,
and we'll post about the next steps soon.

Awesome :+1: - I'm excited to see what you come up with.
I'm not trying to single you out @supermarin - and I'm totally grateful for the time you three have already put in, I'd like it to be possible for others to be able to also put the time in too.


Dark mode for wallet

Looking forward to this. Here's some inspiration.

Color specification:

Background on all pages - #000000 (rgb 0 0 0)

All text boxes - rgb 20 20 20

Color for colorful button's text and icons - rgb 28 28 30

Gradient at the top of screen - should have opacity 85% from current colors

Titles H2 + transaction comment text + dates on transaction screen + comments (besides send and receive screen) - should be rgb 142 142 147

Shadow under alert should be - rgba 0 0 0, 0.4

Alert box color - rgb 28 28 30
Separator's color - rgb 72 72 74

Action sheet background - rgb 44 44 46

Screen examples here: https://app.zeplin.io/project/5c73dc8aa74b4b4085a86a91/dashboard?seid=5dbc2700e1948c239ca23fd8

@Denis-Asipenko QA will not check it - approved


[Enhancement]:  Add Link to Whitepaper

Requirements
Add a link to https://www.crocswap.com/whitepaper
Figma
No response
Assumptions
No response

NOTE: we want to host the pdf on ambient.finance not add an external link to crocswap.com


Piano tiles game extension

Piano Tiles Game Browser Extension is an engaging and fast-paced tool that brings the addictive fun of Piano Tiles directly to your web browser. Ideal for quick gaming sessions or sharpening your reflexes, this extension offers a seamless and customizable gaming experience.
Features:
Classic Gameplay: Enjoy the thrill of tapping the black tiles while avoiding the white ones, just like in the classic Piano Tiles game.
Responsive Design: The game adapts to all screen sizes, providing a smooth experience on desktops, tablets, and smartphones.
Offline Mode: Play the game without needing an internet connection, so you can enjoy it anywhere, anytime.

The game would look something like this.

@tanyagupta01 are you still working on this? Else I will closing this

@Sulagna-Dutta-Roy  can i continue the work?

I will assign then you can start working on the issues.


Add support to discover OctoPrint installations in the network

Would be nice to discover an OctoPrint installation when adding new printers. If can try to discover first in the Local Network and if nothing was found then maybe try to discover it in the public API of the router?

OctoPrint already comes with this http://docs.octoprint.org/en/master/bundledplugins/discovery.html so this will make it easier to find instances and their config


Admin Plans page throws an error

As a super admin and org admin I get the error below when I try to navigate to the Plans page in the Admin menu

interesting. It loads for me. which org are you associated with?

now just getting the error as a Super Admin. affiliated w/UCSD...


StringJsonMessageConverter doesn't work with List<Message>

StringJsonMessageConverter works well with Message<PO> as method parameter when using @KafkaListener, but doesn't work with List<Message<PO>> in batch listener mode. Already set factory.setMessageConverter(new BatchMessagingMessageConverter(jsonMessageConverter));.
It seems that the listener does not using StringJsonMessageConverter to convert each record when the message parameter isMessageList.

Confirmed.
Do you really need the complete message?
This works...
@KafkaListener(...)
public void listen1(List<Foo> foos, @Header(KafkaHeaders.RECEIVED_TOPIC) List<String> topics,
		@Header(KafkaHeaders.RECEIVED_PARTITION_ID) List<Integer> partitions) {
    ...
}


When reusing a volume face the normals vector may be switched.

There are still cases when the normal vectors of a surface may be pointing in the wrong direction.
An example of this is when meshing uf6_cyl_shell.step. This happens for both meshers - in this case the call to change the vector directions is ineffectual.

This will cause an error in the transport algorithm. In the image the pink normal vectors are associated with a shell surrounding a cylinder. The inner cylinder has correct normals whereas the the shell does not.

For the case of the stl2-backend (scheduled to superceed stl) touching surfaces with correctly set sense-tags so this will be irrelevant.

The afore comment is not entirely correct. The normals should always be set correctly.

cannot reproduce anymore


fix(db): add missing primary keys

⚠ Pre Checklist

Please complete ALL items in this checklist, and remove before submitting

[x] I have read through the Contributing Documentation.
[x] I have added relevant tests.
[x] I have added relevant documentation.
[x] I will add labels to the PR, such as pr-type/bug-fix, pr-type/feature-development, etc.

Summary
What does this PR do?
Add missing primary keys.
Does this close any open issues?
Closes #6451
Screenshots
Include any relevant screenshots here.
_devlake_locking_stub
Before

After

_tool_teambition_connections
Before

After

_tool_bitbucket_pipeline_steps
Before

After

Other Information
Any other information that is important to this PR.
Because this bug https://github.com/go-gorm/gorm/issues/5437,  old tables should be dropped first.

Did you test it on a brand new Innodb instance?

Did you test it on a brand new Innodb instance?

I have test it on my standalone innodb based MySQL. I have no innodb cluster, so this PR just fix #6451  theretically.


Ysort not working on instances

Just as the title says. If you try to use ysort on anything that is instanced it does not work. Nodes that aren't work fine. Not sure if this is a bug or a legitimate issue with ysorting an instance. I didn't see any documentation about you not being able to do this. If anything this needs to be added to the docs.

In my experience of using YSort, it has usually worked fine.
Would you mind sharing the Godot version and OS you are using, as well as either a list of steps which lead to reproducing the problem, or a minimal project exhibiting that problem?
The template is designed to both help users explain the bugs they hit and contributors to understand why those bugs occur. So, removing the template for bug reports helps no one.

Closing per @bojidar-bg's comment. If you want this issue to be reopened, please edit the first post to follow the issue template and upload a minimal reproduction project to ease troubleshooting.