Duck Hunt VR Alpha 05 on the Oculus Quest 2

A quick (one evening) port of my old Duck Hunt VR game to the Oculus (a.k.a. Meta) Quest 2. Mainly to check what kind of performance I can expect from this device.

The build is still a little rough especially on the light and shading side. Also the mapping of the Zapper (gun) to the Quest 2 controllers needs some polishing, as the trigger is off-center on the physical controllers.

Do-It-Yourself: Hot plate for phone screen repairs

I needed a quick (DIY) solution to create a hot plate (a.k.a. Screen Repair Separator Machine Heating Plate) for repairing the screen of my wifes mobile phone. It is a cheap phone so I needed a cheap solution to create hot plate alternative.

After staring at the kitchen oven (too hot, even on the lowest setting), I got this brief mental lapse… What about a take-out (Dutch Chinees food) container filled to the top with hot water.

Standard take-out container for Chinese food in the Netherlands.

It is easy to control the temperature, by mixing 100 degrees kettle water with tap water (assumed to be ambient temperature):
1 part 100 degrees + 1 parts 20 degrees: (100+20) / 2 = 60 degrees
2 parts 100 degrees + 1 part 20 degrees: (100+100+20) / 3 = 73 degrees

The importance of cable management in the real-world!

My sister is still rocking a Intel Core 2 Duo E6750 for all her graphical design activities. This beast of a CPU has been working hard since 2007 (bundled with 4GB of DDR2). But lately it is struggling a little with modern life… And by extension so is my sister…

The new and shiny boxes…

Knowing my sister, I had to make sure it would be a clean and pretty system. But on a budget. (Keep in mind that GPU’s are crazy expensive at this moment!)

The new and clean case…

My sister does not like cables, so I put some extra effort in my cable management ūüėé

What cable, cable management…

It’s final destination, really showing off my cable management skills to the world ūüėč

Cable management perfection in the real-world…

Shucking a 8TB WD Elements vs 8TB WD Red

Shucking a hard drive is the practice of removing a hard drive from it’s (external) USB exclose. This may sound like a stupid thing to do, but this can save you some money (150 euro vs 220 euro) ūü§Ď

The scary side of shucking is that you never really know what you will get, it is a little like a surprise egg for nerds. This time we got lucky, the WD80EMAZ is actually a helium filled HGST Ultrastar, modified to run at 5400 RPM (instead of 7200 RPM).

The shucked drive ( WD80EMAZ ) runs 5-6 degrees cooler than my original 8TB WD Red drives (WD80EFAX) ūüėé

Hard drive temperatures WD80EFAX (8TB WD Red) vs WD80EMAZ (Shunked 8TB WD Elements).

Update: I have multiple shucked drives in use WD80EMAZ (WD Elements with the blue text on the box) and WD80EDAZ (WD Elements with the orange text on the box). All drives have 256MB cache and are running without issues in a Synology NAS. The WD80EDAZ drives will run a lot hotter ūüėź

Moved from a Linux server to a NAS…

One of my disk in my RAID6 array of my Linux server dropped from the disk array, so it was time to decide the future of my old and trusty server. I have been running a Linux server as my home storage for +15 years. But the family life is limiting my tinker time… So I decided to try an off-the-shelf storage solution (Synolog DiskStation DS918+), to see if this can serve my server needs, without the additional hassle of building and maintaining a Linux server.

Update: Currently I’m running the NAS with 2x8TB WD80EMAZ (WD Red) drives and 1x8TB WD80EMAZ ( shucked WD Elements) drive, with 2x250GB WD Black NVMe SSD’s as (read/write) cache.

Synology DS918+

Allseas ‚Äď The Holiday Spirit

Toying (some more) with an industrial robot at the office ūüėČ

Merry Christmas and a Happy 2019 from the Allseas R&D Eindhoven (a.k.a. Inspection & Robotics) office.

Allseas – R&D Eindhoven – The Holiday Spirit

R&D Eindhoven is part of the Innovation Department of Allseas Engineering B.V.

C# – XBox 360 Controller library with a sample application

Created an easy to use XBox 360 Controller library in C# (with a sample application) using the SharpDX.XInput managed .NET wrapper of the DirectX API.

Screenshot of the sample application.
Screenshot of the sample application.

A BUG in SharpDX.XInput ci-ci217, resulting in issues with the  left Thumb Stick, Left Trigger, and Right Trigger! Please stick to SharpDX.XInput v4.1.0-ci184 for now.

using System;
using Com.Okmer.GameController;
namespace XBoxSampleConsole
    class Program
        static void Main(string[] args)
            XBoxController controller = new XBoxController();
            Console.WriteLine("XBox 360 Controller (Press ENTER to exit...)");
            controller.Connection.ValueChanged += (s, e) => Console.WriteLine($"Connection state: {e.Value}");
            controller.Battery.ValueChanged += (s, e) => Console.WriteLine($"Battery level: {e.Value}");
            //Buttons A, B, X, Y
            controller.A.ValueChanged += (s, e) => Console.WriteLine($"A state: {e.Value}");
            controller.B.ValueChanged += (s, e) => Console.WriteLine($"B state: {e.Value}");
            controller.X.ValueChanged += (s, e) => Console.WriteLine($"X state: {e.Value}");
            controller.Y.ValueChanged += (s, e) => Console.WriteLine($"Y state: {e.Value}");
            //Buttons Start, Back
            controller.Start.ValueChanged += (s, e) => Console.WriteLine($"Start state: {e.Value}");
            controller.Back.ValueChanged += (s, e) => Console.WriteLine($"Back state: {e.Value}");
            //Buttons D-Pad Up, Down, Left, Right
            controller.Up.ValueChanged += (s, e) => Console.WriteLine($"Up state: {e.Value}");
            controller.Down.ValueChanged += (s, e) => Console.WriteLine($"Down state: {e.Value}");
            controller.Left.ValueChanged += (s, e) => Console.WriteLine($"Left state: {e.Value}");
            controller.Right.ValueChanged += (s, e) => Console.WriteLine($"Right state: {e.Value}");
            //Buttons Shoulder Left, Right
            controller.LeftShoulder.ValueChanged += (s, e) => Console.WriteLine($"Left shoulder state: {e.Value}");
            controller.RightShoulder.ValueChanged += (s, e) => Console.WriteLine($"Right shoulder state: {e.Value}");
            //Buttons Thumb Left, Right
            controller.LeftThumbclick.ValueChanged += (s, e) => Console.WriteLine($"Left thumb state: {e.Value}");
            controller.RightThumbclick.ValueChanged += (s, e) => Console.WriteLine($"Right thumb state: {e.Value}");
            //Trigger Position Left, Right 
            controller.LeftTrigger.ValueChanged += (s, e) => Console.WriteLine($"Left trigger position: {e.Value}");
            controller.RightTrigger.ValueChanged += (s, e) => Console.WriteLine($"Right trigger position: {e.Value}");
            //Thumb Positions Left, Right
            controller.LeftThumbstick.ValueChanged += (s, e) => Console.WriteLine($"Left thumb X: {e.Value.X}, Y: {e.Value.Y}");
            controller.RightThumbstick.ValueChanged += (s, e) => Console.WriteLine($"Right thumb X: {e.Value.X}, Y: {e.Value.Y}");
            //Rumble Left, Right
            controller.LeftRumble.ValueChanged += (s, e) => Console.WriteLine($"Left rumble speed: {e.Value}");
            controller.RightRumble.ValueChanged += (s, e) => Console.WriteLine($"Right rumble speed: {e.Value}");
            //Rumble 0.25f speed for 500 milliseconds when the A or B button is pushed
            controller.A.ValueChanged += (s, e) => controller.LeftRumble.Rumble(0.25f, 500);
            controller.B.ValueChanged += (s, e) => controller.RightRumble.Rumble(0.25f, 500);
            //Rumble at 1.0f speed for 1000 milliseconds when the X or Y button is pushed
            controller.X.ValueChanged += (s, e) => controller.LeftRumble.Rumble(1.0f, 1000);
            controller.Y.ValueChanged += (s, e) => controller.RightRumble.Rumble(1.0f, 1000);
            //Rumble at the speed of the trigger position
            controller.LeftTrigger.ValueChanged += (s, e) => controller.LeftRumble.Rumble(e.Value);
            controller.RightTrigger.ValueChanged += (s, e) => controller.RightRumble.Rumble(e.Value);
            //Wait on ENTER to exit...

Allseas – Innovation opens beers

Toying with an industrial robot at the office ūüėČ

R&D Eindhoven (a.k.a. Inspection & Robotics) opens the Friday “borrel” beers with their new Fanuc M-710iC/45M Robot in combination with a Cognex In-Sight 2000 Vision Sensor.

R&D Eindhoven is part of the Innovation Department of Allseas Engineering B.V.

Duck Hunt VR (for the HTC Vive)

My first little Unity 3D Virtual Reality project, inspired by my old friend the Nintendo Entertainment System. Please keep in mind the I have never used Unity 3D before, so this is my first sandbox application…

Download link to DuckHuntVR Alpha 04:

This Alpha 04 release incorporated a lot of used feedback from the Vive subreddit:

In particular the feedback gathered during this live coding session:

DuckHuntVR game scene
DuckHuntVR game scene

Duck Red
Duck Red

Duck Green
Duck Green

Duck Blue
Duck Blue

Triple duck dog
Triple duck dog

Zapper EU version.
Zapper EU version.

Zapper US version.
Zapper US version.