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

Valve Index Controllers

I finally pulled the trigger… I have been considering if I should upgrade my HTC Vive set to a new and shiny Valve Index set. My play (and development) time is very limited with two young kids in the house.

In the end I decided that running a Valve Index HMD on my current GPU (Geforce GTX 1080) would be limiting it severely. And upgrading my GPU is not a fun thing to do at this moment (way more expensive than the full Valve Index set).

So I decided to only buy the Valve Index controllers, and keep on using the original HTC Vive HMD for now.

Valve Index controllers

Now I can finally play Half-Life: Alyx ūüėć I was holding out until I had the right gear to experience it “The Way its Meant to be Played”.

I have to say, I needed a little adjusting time (after all the VR hours with the old HTC Vive controllers). But in Half-Life: Alyx these Valve Index controllers really rock! The game is also awesome. It is really cool to be back in the Half-Life universe after all these years ūüėé

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…

Introducing a new generation to Virtual Reality

Today I introduced my 2-year-old son to Virtual Reality, exploring the ocean life in “theBlu“.

First time in VR for my 2 year old…

The HTC Vive is now called the “visjes bril” (a.k.a. fish glasses). The big blue whale seems to be a little intimidating for 2-year-old virtual boys ūüėČ But they really love the jellyfish ūüėć

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.

Currently I’m running the NAS with 2x8TB WD Red in RAID1, and WD Black NVMe SSD 250GB as (read) cache.

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.

Website down due to a glasfiber modem upgrade…

Website was down for a few hours, deu to a glasfiber modem upgrade. Server seems happy after his first reboot in 2.5 years ūüôā

KPN routers force their users to use IP range (with a subnet mask). So it took me some time to get all my devices to the new enforced range.

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.