Friday, May 27, 2016

Switching Audio to Rift when Launching ED

This technique is a workaround for programs launched directly from Windows. Programs launched from within Oculus Home switch audio automatically. Unfortunately I do not have a solution for SteamVR games. If you find a way I'd be interested to know.

1. Download and install AudioSwitch
2. Run AudioSwitch from the commandline to display audio devices
cd "C:\Program Files (x86)\AudioSwitch"
audioswitch /l
3. Take note of your device numbers
C:\Program Files (x86)\AudioSwitch>Audioswitch.exe /l
C:\Program Files (x86)\AudioSwitch>
 Devices available:
  0  Headphones (Rift Audio)
  1  Realtek Digital Output(Optical) (Realtek High Definition Audio)
  2  Realtek Digital Output (Realtek High Definition Audio)
 <3> Speakers (6- Bose USB Audio)
  4  Headset Earphone (2- ASTRO Wireless Transmitter )
In my case the Rift is device 0 while my speakers are device 3.

4. Create a .BAT file on your desktop and enter the following lines.
@echo off
cd "C:\Program Files (x86)\AudioSwitch\"
echo Switching Audio to Rift
Audioswitch.exe /s 0
echo Starting ED Launcher
"C:\Program Files (x86)\Frontier\EDLaunch\EDLaunch.exe"
Audioswitch.exe /s 3
5. Double-click on the BAT file to Run
The batch file should open a cmd window. Your default audio device becomes the Rift. Then the Elite Dangerous Launcher starts. When the Elite Dangerous Launcher is closed, the script switches default audio back to speakers before closing.

Update: If you want to launch programs like VoiceAttack, Captail's Log and such before the ED Launcher use following syntax:
start "" "Program Executable"
My current launcher looks like this
@echo off
cd "C:\Program Files (x86)\AudioSwitch\"
echo Switching Audio to Rift
Audioswitch.exe /s 0
start "" "C:\Program Files (x86)\VoiceAttack\VoiceAttack.exe"
echo Starting ED Launcher
"C:\Program Files (x86)\Frontier\EDLaunch\EDLaunch.exe"
Audioswitch.exe /s 3

Monday, May 9, 2016

Mounting a Leap Motion on Oculus CV1

So we have a short term problem. The CV1 has a curved face while the Leap Motion is flat. Also the new VR Mount, as of this writing, is still some weeks away. Turns out you don't need a special mount or even a 3d printed one if you have a supply store nearby.

Mounting Putty (e.g. Velcro White Tack Putty, Blu Tack, FunTak etc.)
Painter's tape
USB 3.0 extension cable
Velcro ties

Most of the above you can find in Home Depot if you're in the States. The painter's tape is to mark where the leap motion should go. It has to be painter's tape because I want this to be cleanly removable. The same reason for using mounting putty/tack instead of Sugru. The Velcro ties is for fastening the Leap Motion's cable together with the CV1's. The USB 3.0 extension cable is optional though recommended to reach the nearest spare USB 3.0 port on the PC.


It's best to use a cheaper webcam that leaks some IR lights. I tried to use my phone's camera but its IR filter was so good I couldn't see the Rift's lights.

Finding the lights
Open the Windows Camera App (Windows 10, 8) or any equivalent application that will let you live view your camera. Start up Oculus Home then point your Rift so the camera can see it. You should see the lights on the front of the Rift. We want to mount the Leap Motion in a way that covers the fewest lights.

Cut a piece of painters tape in the size of the Leap Motion.

Using the webcam as a guide, mount the painter's tape on the Rift avoiding the lights. Give the lights as much room as you can.

Some Cameras may have stronger IR filtering.

Roll a piece of tack and mount to the back of the Leap Motion toward one end. Repeat for the other end. Leave the center unoccupied. The two ends will accomodate the curve of the Rift.

Reinforce the mount by adding additional tack to the top and bottom of the Leap Motion.

Route the Leap's main cable to the opposite side of the Rift.

Use Velcro ties to fasten the Leap USB cable to the Rift cable. Make it as tight as possible so the Leap doesn't get yanked from the face.

Extend the Leap USB cable as necessary. I used a 6 foot cable.

Depending on the angle to the camera some lights may be obscured but it doesn't appear to affect tracking.

Have fun!

Friday, January 1, 2016

Use the HORI Ace-Edge controller with Elite Dangerous

I usually fly with a Saitek X55 and I had a backup Thrustmaster T-Flight but neither was available. There were Xbox 360 controllers lying around but I remembered having an Ace Combat 6 HORI Ace-Edge stick from the Xbox 360 Game. So why not try to make it work with Elite Dangerous?

  1. Install the Xbox 360 controller drivers
  2. Test the ACE Edge
  3. Get USB the VID/PID
  4. Add VID/PID to DeviceMappings.xml
  5. Create a new Custom Control Profile

Install the Xbox 360 controller drivers
Download the Xbox 360 controller drivers from Microsoft then install. A reboot may be necessary.

Test the ACE Edge
Run joy.cpl -> Properties -> Test. Move the stick and press all the buttons to test that you are getting inputs. The Throttle two knobs on the throttle are dummies. The button above LB is also false. M1/M2/M3 mode switches are not recognized by joy.cpl. Same with the Xbox button on the Stick body.

X Axis/Y Axis - Joystick pitch/roll 
Z Axis - Throttle forward back + paddle left and right! 
Throttle is Xbox right trigger 
Paddle is Xbox left trigger 
Y Rotation - R-stick (up/down) 
X Rotation - R-stick (left right) 

Joystick Buttons
Point of View Hat - D-Pad (desc-positions, right thumb)
Button 1 - A Button (fire trigger)
Button 6 - Right Bumper (pinkie switch)
Button 2 - B Button (Red)
Button 3 - X Button (Blue)
Button 4 - Y Button (Yellow)
Button 8 - Start Button (Forward right index finger)

Throttle Buttons
Button 5 - LB [Left Bumper]
Button 7 - Back 
Button 9 - Left Stick Button (Left Index finger / LS Press)

We need to register the Vendor ID and Product ID of the Ace-Edge with ED. Run Control Panel -> Device Manager -> Microsoft Common Controller for Windows -> Xbox 360 Controller for Windows -> Details -> Property: Hardware IDs

It should return the above if you only have the Ace-Edge hooked up as a gamepad. 

Add VID/PID to DeviceMappings.xml

Find your existing Custom*.binds and make backups in C:\Users\your user id\AppData\Local\Frontier Developments\Elite Dangerous\Options\Bindings. ED currently comes in 32-bit (1.5), 64-bit (1.5) and 64-bit-only Horizons (2.02). There appears to be multiple directories where DeviceMappings.xml can be modified. But you only need to change the one you intend to play.

(Elite Dangerous Ships 1.5 and Horizons 2.02)
(Elite Dangerous Ships 1.5)

Inside either of those is a ControlSchemes directory. Make a backup of DeviceMappings.xml. Modify DeviceMappings.xml then add the PID and VID to the Gamepad area. I put mine in the end of that section right before the Gamepad tag for the XB1 controller.
  <!-- ACE Edge -->

Don't forget to save! If you want a sample here is the posted code.

Create a new Custom Control Profile
Start Elite Dangerous. If you did the above right, the joystick D-pad should let you navigate the menu. The Trigger button (A) will work as select. From here you can go to Options -> Controls -> Xbox 360 Controller. From here you can start customizing as you desire.

I discovered that the Paddle didn't work well as yaw or thruster. When I tried to map it to Left/Right Thruster Axis it turned into a permanent right thrust/turn. Instead I treat it as a modifier button in combination with D-pad to provide left/right thrust. That's too bad since this was used as yaw in the AC6 game. By default the yaw is mapped to the R-Stick x axis.

The Throttle D-pad is supposed to mirror the Joystick D-pad but it wasn't reliable to trigger on my stick so I left it alone. The calibration on my throttle was also a bit suspect when running in full range. If I need a reverse switch I can use the index finger button on the throttle. Also the Joystick Start button couldn't be mapped to the game. It appears to be hard coded as an escape key.

I made an AceEdge.binds which can be used as a starting point. Just copy it to the ControlSchemes folder. Update: Found a thread on this in Frontier forums on Ace Edge Z-Rotation does not work.

Saturday, September 26, 2015

Getting Oculus DK2, Windows 10 and Elite Dangerous 1.4 to Work

This trick also works for other applications. It also works for Runtime 4.4 with the difference that Windows 8 compatibility isn't needed to install the display drivers.
  1. Uninstall any previous Oculus Runtime and reboot
  2. Install Oculus Runtime with Windows 8 compatibility mode. If you don't you will receive an error that the Oculus Display driver couldn't be installed. Complete the install then reboot.
  3. When you turn on the HMD, Windows will say Oculus detected followed by Oculus Service failed. This is fine.
  4. Go to "C:\Program Files (x86)\Oculus\Service\" and right-click "OVRServer_x86.exe". Create a shortcut.
  5. Right-click the shortcut, hit properties. In Shortcut Tab, hit Advanced, then click x Run as administrator.
  6. Still in the shortcut properties, hit Compatiblity then enable x Run this program in compatibility mode for Windows 8.
  7. Now click on the shortcut. This should launch a CLI session showing the server process.
  8. Launch the Config Utility, switch the HMD to Extended mode. Setup your profile. Then run the Demo Scene.
This OVR server process is what the Demo Scene and other Rift programs look for to run. In the case of Elite Dangerous, you need this service to be up before starting game. In ED's Graphics options you should find Oculus (Headphones) and Oculus (Speakers) available as the fourth and fifth option if the service is detected correctly. Also if you are on multiple displays, the sequence listed by the game isn't the same as in Windows. Windows identifies the Rift as #2 but in ED this is a fourth unnamed display (names only go up to Tertiary for some reason). You can tell if you have the correct display as this is probably the only one that will allow 1920x1080 plus 75hz refresh.

Whenever you startup the PC you will get the Oculus VR service failure. This should be normal and mitigated by manually starting OVRServer_x86.
There were some reports of bootloops that can happen if you setup the runtime as Windows 8 Compatibility mode rather than the OVRService so take note.

Monday, October 21, 2013

Make Your Own 7" to 8" Tablet Stand

I have a 8" Tablet but couldn't find a cover that I like with a decent stand function. So in DIY spirit, I made one out of cardboard.  The stand folds so it can adjust to both landscape and portrait mode.  The material is light weight, biodegradable and dirt cheap ... being cardboard.  If it gets worn you can always make a new one.  

The secret to its stability is the W-shape. All you need is a pair of scissors, a ruler and the cardboard. I had some white cardboard that just matched the tablet. The triangle cut doesn't have to be precise, just deep enough to hold the tablet but not too deep that your USB cable can't fit anymore.

Saturday, September 1, 2012

Netgear GS108T and Synology DS412+ Set Up Link Aggregation

The Process
First step is to power down the DS412+ and anything else in your network that needs re-cabling. Make sure to leave at least 2 ports free for the DS412+. Find the two Gig-E ports on the back of the DS412+ and hook it up to any two ports on the Smart Switch. In my case I made the Netgear GS108T the main switch and hooked it up to my Wireless router that connects to the Internet. A second Netgear switch is hooked up by a long cable to another room where the desktop and Xbox reside. Across the living room to the TV I have my old Linux NAS hooked up. Power everything up and make sure everything is communicating as is.

Configure Link Aggregation on GS108T
The GS108T comes with Windows software called SmartControlManager. Alternatively you can access it via a Web Browser if you know its IP address. How do you find it's address aside from using Smart Control Manager? My LAN uses the Wireless router as a DHCP server. So I logged on to that device and listed all DHCP client. Using the names I found the GS108Tv2. A quick browser launch and an http:// got me to the admin page.

From here I choose the Switching tab which immediately shows me the active ports. Follow LAG -> Basic -> LAG Configuration. Select the LAG1 entry (since this is an 8-port switch, you can have a maximum of 4 LAG). This is where it confused me at first. Selecting LAG1 populates the entry fields above it. Enter a Description, I chose "diskstation" then LAG Type of "LACP". Hit Apply.

Move to the LAG Membership option. From here select LAG1 then choose the ports the DS412+ was hooked up to. There is a yellow button that is equivalent of Select All. This works only if you have one device running LAG on this switch. Hit Apply.

That's it for the GS108T. Now to enable it on the NAS.

Configure Link Aggregation on Synology DS412+

Login to DSM on the DS412+ then launch Control Panel -> Network -> Network Interface -> Create
x IEEE 802.3ad Dynamic Link Aggregation -> Next
The two LAN ports should be automatically selected -> Next
x Get network configuration automatically (DHCP) -> Apply
You will now find one connection called Bond 1 rather than two LAN connections. Congratulations, you now have Channel Bonding turned on! The two LAN ports will now start working as a team for all incoming and outgoing requests.
Give it a stress test if you like.

Friday, August 31, 2012

Synology DS412+ and My New Storage Network

Back in 2000 I purchased my first DV camcorder. It was a Canon Elura that used MiniDV tapes. Every tape extracted about 13GB. Even today that's still a lot. You can easily fill hard drives with that much storage. At first I only edited the extracted clips then deleted them leaving the original footage on MiniDV tape. Tape was good for archival if you didn't mind waiting for the re-extraction.

Years have passed and I've switched to CF card which can't be used for archival. I have BD burners to make archival copies but I've found that old footage is still best kept close by. Initially I built a RAID desktop for keeping just photos. Then when .5 and 1TB drives became common I started keeping video on those drives.

It was initially going to be temporary but I've found that family events like birthdays and such required me to dig out years old footage so I never went back to delete them.   I got used to it. Fast forward to today and it's time for a major upgrade. My second generation self-built NAS is an Zotac IONITX-A-U running Ubuntu and SAMBA hooked up to USB drives via a hub. It's decent but not very fast. All those drives were formatted in NTFS and maxed out at 25MB/sec to read.    That's enough for viewing a few pictures here and there.  But I wanted something closer to what direct SATA gave me.

Picking the Synology DS412+
I originally considered the Drobo, Netgear and EMC/Iomega NAS.    I read the reviews and the Synology brand kept coming up.   Two things sold me on the thing: (1) Simplicity of DSM (2) Raw performance.  It was the fastest of the more reasonably priced NAS on the market.

Here's a sample of it's performance in my current configuration.   

Robocopy Write test
Copy from internal SATA drive to Diskstation via 1Gbps port (82.5MB/sec)

               Total    Copied   Skipped  Mismatch    FAILED    Extras
    Dirs :       132       131         1         0         0         0
   Files :      9460      9460         0         0         0         1
   Bytes : 233.776 g 233.776 g         0         0         0    14.5 k
   Times :   0:48:33   0:48:22                       0:00:00   0:00:11

   Speed :            86472142 Bytes/sec.
   Speed :            4947.975 MegaBytes/min.

   Ended : Wed Aug 22 13:49:27 2012

Robocopy Read test
Copy from Diskstation to internal SATA via 1Gbps port (99.98 MB/sec)

               Total    Copied   Skipped  Mismatch    FAILED    Extras
    Dirs :       132       131         1         0         0         0
   Files :      9461      9461         0         0         0         0
   Bytes : 233.776 g 233.776 g         0         0         0         0
   Times :   0:40:03   0:39:54                       0:00:00   0:00:09

   Speed :           104837993 Bytes/sec.
   Speed :            5998.878 MegaBytes/min.

   Ended : Wed Aug 22 14:38:14 2012

Not bad is it? That's over half the bandwidth of a directly hooked up SATA drive. Given that a single gigabit ethernet port has a theoretical cap of 125MB/sec its looking pretty good.   What this allows me to do is pick out some footage, pictures and music from the NAS and output to local USB and SATA drives.   It's the not the fastest configuration but while I'm doing quick edits in Sony Vegas on my laptop, the desktop could be rendering a composition in Adobe After Effects.

My current configuration
Synology DS412+ with 4x Seagate 3TB 7200rpm drives with LAG enabled
ProRaid+ with 4x Western Digital 2TB 5400rpm drives attached via SATA
ioSafe SOLO G3 Fireproof and Waterproof 3TB Hard Drive for critical backups via USB 3.0
Netgear GS108T-NAS Prosafe 8-Port Gigabit Smart Switch attached to 2x1Gigabit Ports on DS412+
Cyberpower 485AV UPS attached via USB

Hold your horses! What's that switch and UPS for you ask? The UPS gives the NAS a chance to do a proper shutdown should there be a power failure. The Smart Switch allows you to bond two ethernet ports together on the DS412+ but keep one IP address. A plain dumb switch would allow you to use the second port as a backup. But a Smart/Managed switch allows both to be used actively with a feature called Link Aggregation (LAG). A 1GigE port has a theoretical max of 125MB/sec but there is some waste in there that brings the real throughput much less. Those individual SATA devices in our previous tests could achieve 175MB/sec. Not to mention I have the ProRaid shared simultaneously as the DS412+'s internal volumes. I can't exceed the throughput of a single port for one transfer but I can have multiple devices and transfers at once each using either available port.  Effectively you can have a ceiling of 250MB/sec on all combined transfers.

Modest Simultaneous Device Test 
Can we prove that LAG is useful?  

(a) Copy from Leonovo W520 SATA to Diskstation via Wireless-G (35.37MB/sec write)
               Total    Copied   Skipped  Mismatch    FAILED    Extras
    Dirs :        40        38         2         0         0        12
   Files :       962       961         0         0         1         1
   Bytes : 125.429 g 125.425 g         0         0    4.39 m  226.63 m
   Times :   1:00:35   1:00:30                       0:00:00   0:00:05

   Speed :            37092186 Bytes/sec.
   Speed :            2122.431 MegaBytes/min.

   Ended : Wed Aug 29 22:31:54 2012
(b) Copy from Ubuntu IONITX-A-U NAS from USB drive via 1Gig-E (22MB/sec write)

(c) Copy from HPE-380T whole SATA HDD (74.97 MB/sec write)

               Total    Copied   Skipped  Mismatch    FAILED    Extras
    Dirs :       568       565         3         0         0         0
   Files :     13809     13809         0         0         0         0
   Bytes : 748.996 g 748.996 g         0         0         0         0
   Times :   2:51:04   2:50:30                       0:00:00   0:00:34

   Speed :            78613676 Bytes/sec.
   Speed :            4498.310 MegaBytes/min.

   Ended : Wed Aug 29 22:42:43 2012

Yes! 132MB/sec with three devices.   This is a write test which is a slower operation.  If I started multiple copies plus video playback I could probably use up more bandwidth.  Keep in mind that 125MB is a theoretical maximum for a single port.  The extra port allows other devices to access the NAS if one is fully saturated. 

A Hint on Adding a Share to your Libraries
You might be wondering how I was able to mount My Documents from the NAS.   It's a trick using symbolic links.

Start -> Command Prompt -> Right-click -> Run as Administrator

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved. 
C:\Windows\system32> mkdir \diskstation
C:\Windows\system32> cd \diskstation
C:\diskstation>mklink /d Pictures \\diskstation\Pictures
symbolic link created for Pictures <===> \\diskstation\Pictures 

From here you can go to Explorer -> Libraries -> Pictures -> Properties -> Include a Folder

Power Consumption
2.7 Watts plugged in for DS412+ with 4 ST3000DM001
17.3 watts powering up (button press)
45.9 watts powering up (spinning up)
62.2 watts peak powering up (blue flashing light)
44-46 watts powered up doing raid check
49 watts doing CrystalMark