anchor.diff:              x.Release()
   
       member x.Hmd = hmds.[0]
  -
  -    member x.Controllers = devices |> Array.filter (fun d -> d.Type = VrDeviceType.Controller)
  +    member x.AllDevices = getAllDevices() |> Seq.toArray
  +    member x.Controllers = getAllDevices() |> Seq.filter (fun d -> d.Type = VrDeviceType.Controller) |> Seq.toArray
  +    
  +    member x.ConnectedDevices = connectedAll
  +    member x.ConnectedHmds = connectedHmds
  +    member x.ConnectedControllers = connectedControllers
   
       interface IDisposable with
           member x.Dispose() = x.Dispose()
  
positive.code:             failwithf "[OpenVR] %s" (OpenVR.GetStringForHmdError err)
          sys
      
      let devicesPerIndex =
          [|
              for i in 0u .. OpenVR.k_unMaxTrackedDeviceCount-1u do
                  let deviceType = system.GetTrackedDeviceClass i
  
negative.code:                 swUpdatePoses.Start()
                  // update all poses
                  transact (fun () ->
                      for i in 0 .. renderPoses.Length - 1 do
                          let mutable pose = renderPoses.[i]
                          match tryGetDevice (uint32 i) with
                          | Some device -> device.Update(&pose)
                          | None -> ()
                  )
  
                  x.UpdatePoses(renderPoses)
  