Skip to main content

Four Down

· 5 min read

Four are out.

Outlet pulls the mains. Milker does the work. Buttplug drives the toys I did not build. Somnus runs the lot off an audio track. Two of them were still in the works last time I said anything. They are done, they are running, and the source for every one of them is up.

That is what is built so far. It is not everything I want on this rig, and it is already enough to run a man through a session start to finish.

Outlet​

The first Outlet target: a yellow M5Stack ATOM Socket with a mains plug in the top, a socket in the middle, and a USB-C cable out of the bottom

A mains relay that stays shut only while something keeps telling it to.

The host says so every 100 milliseconds. Go quiet for a second and it lets go. Crash the host, pull the cable, kill the process. Whatever is plugged into it stops.

Every smart plug on the shelf has this backwards. They come up on and sit there, and when the thing driving them falls over the load keeps running with nobody watching it. Fine for a lamp. Not fine for anything I would put near a man who cannot get himself loose.

So off is where this one rests. It forgives ten missed keepalives, and closing has a 500ms floor so the relay cannot chatter itself to death. Opening is never delayed by anything. Off always wins the race.

Read the build

Milker​

The Milker: a blue and black cylindrical stroking machine with a carry handle and a blue port set into its lid, a small grey control box on a coiled cable beside it, and the sleeve and its end cap laid out below

The stroking machine, and the one here that can do real damage if I get it wrong.

I do not send it motion. I send it numbers. How far, how fast, how lopsided the stroke is. It builds the waveform out of those and keeps building it whether or not anything is still listening, so a host that stutters for fifty milliseconds does not put a hitch in the stroke and nobody underneath it feels a thing.

Off is not the safe state here. That is where it stops looking like Outlet. A relay that stops driving its pin is safe. An actuator is fed frames, and a frame carries force, so firmware that wedges while still shoving the last frame it built is worse than firmware that dies outright. Still running and ten seconds stale is the state that hurts somebody.

So the part that talks to the actuator is not the part that decides what to say. A separate timer sends a frame five hundred times a second, checks how old its instructions are, and drops the force to nothing the moment they go stale.

The dial outranks me. Press the encoder and motion stops. Not queued, not requested, not taken under advisement. Stopped. I can hammer keepalives at 20Hz and it does not care what I want. Starting again takes a deliberate two second hold, and clearing the latch still does not set it moving. Somebody has to arm it on purpose.

That is not me going soft. A man with his hand on that dial gets out from under it whenever he decides to, without asking me first, and the machine is built so I could not overrule him if I tried.

Read the build

Buttplug​

Not a toy of mine. A way of driving everybody else's.

There are hundreds of toys out there, each with its own radio, and Intiface already speaks all of them. So the radios are somebody else's problem, and this is the piece that drops a shop-bought vibrator onto the same timeline as a mains relay and a stroking machine.

It comes with a warning, and I would rather say it up front than let somebody find it out. There is no firmware deadman under this one. The toy stops when the server decides its client is gone, and that is the end of what I will promise you.

Locally that is usually fine. Kill the process mid-session and everything stops. Over a network it is a different story, and there is a setting you had better get right before you tie anybody to it.

Read the build

Somnus​

The part that gives the orders. Everything above takes them.

It plays the track itself instead of asking something else to and hoping. It counts samples, so it always knows exactly where it is. Cues sit at absolute times on that track. Write a session once and it lands the same way every time, which means he does not get an easier night because I was tired.

A cue with a duration gets its start and its stop as one piece. Scrub the timeline, pause, or stop early, and it settles those stops itself. Nothing is left running because a scene ended sooner than planned.

PANIC sits on the screen the whole time, and every plugin has to implement it. If a thing cannot be put into a safe state, it does not get to be a device on my rig.

A dead device does not stop the show either. Missing, unplugged, or simply refusing, Somnus says so on screen and plays anyway, and logs that device's cues as having done nothing at all.

Read the build