Overview
DynoReader is a Windows application I designed and built for Enspire DBS Therapy, a Cleveland Clinic portfolio company developing deep brain stimulation, paired with rehabilitation, for people left with arm weakness after a stroke. During a study participant's in-clinic programming visits, DynoReader turns a squeeze on a hand dynamometer into a visual task on a screen, scores every repetition, and sends event markers so that the motor task can be lined up with an EEG recorded by separate equipment. The study team uses that data to work out which stimulation settings suit each participant.
My role: application design and development: the participant display, the examiner workflow, the task engine, dynamometer and TriggerBox integration, protocol configuration and session records.
Demo paused halfway through the hold. Your turn: press and hold.
The therapy behind the task
About 800,000 people in the United States have a stroke each year, and stroke is the leading cause of long-term disability; roughly half of survivors are left needing help with daily activities. Enspire's approach is deep brain stimulation of the cerebellar dentate nucleus, delivered together with months of physical rehabilitation, to promote reorganisation of the cortex around the stroke.
In EDEN, a phase I trial at Cleveland Clinic published in Nature Medicine in 2023, twelve people with persistent moderate-to-severe arm impairment one to three years after a stroke received the implant. There were no serious perioperative or stimulation-related adverse events, and the group improved by a median of seven points on the Upper-Extremity Fugl-Meyer Assessment; those who enrolled with some preserved hand function improved by a median of fifteen. That result led to RESTORE, a multicentre pivotal trial under an FDA Investigational Device Exemption, now recruiting at sites including Cleveland Clinic, Brown University Health, Massachusetts General Hospital, Mayo Clinic and the Medical University of South Carolina. The device is investigational; none of this is an approved treatment yet.
Where DynoReader fits
A DBS system has settings: which electrode contact is active, and the frequency, amplitude and pulse width of the stimulation. In RESTORE, participants come to the clinic for programming visits where those settings are tried out, and the study needed an objective, repeatable way to see how each one affected the hand. Enspire's specification named DynoReader as the software half of that Programming Optimization System: the participant squeezes a dynamometer, the examiner instructs them, DynoReader provides the visual cues and feedback, and the data captured at the visit is used to determine the settings.
A visit is organised as sessions. Each session is a maximum-force measurement for both hands, then the same action task with stimulation off and again with stimulation on, with a break between sessions. Throughout, an EEG cap records brain activity into the BrainVision software suite on its own equipment. DynoReader never sees the EEG. It sends a coded marker through a TriggerBox at every cue and threshold, so the recording can later be aligned with what the hand was asked to do.
A squeeze becomes a visual response
The first design decision was what the participant should look at. A stream of force numbers asks a person recovering from a stroke to read and interpret while they squeeze. Instead the display shows one blue ball on a rail and one green target band. Squeeze harder and the ball rises; keep it in the band and the repetition counts. Nothing on the participant's screen is a number.
Behind that, DynoReader reads each hand's two load cells over a serial link, removes a tare offset taken at the start of the visit, sums the channels, applies configurable smoothing and maps affected and unaffected to left and right from the protocol. The ball is force, not hand position.
One ordinary repetition runs like this. During a randomised wait of a few seconds only a fixation cross shows. Then an arrow appears, pointing to the hand to use; the ball follows the squeeze, the arrow turns blue while force is inside the band, and after an unbroken hold the arrow becomes a thumbs-up. The next repetition does not begin until the hand has relaxed.
Only the cross is on screen. Squeezing now would fail the rep.
Each hand gets its own target
After a stroke the affected and unaffected hands can differ enormously, and a fixed force target would be trivial for one and impossible for the other. So every visit starts with reference measurements: for each hand, three maximum-effort squeezes of five seconds with thirty seconds of rest between them. DynoReader keeps the highest maximum and a resting baseline taken from the rest period, and records the variability of the effort.
After three reps, the highest max and the highest baseline set the band, 15–25% of the way up that range.
Tap a rep to draw it above. Each result is logged after its rest.
Targets are then relative. The protocol states a target percentage and a band half-width, and DynoReader places each hand's band at that proportion of that hand's own range. A twenty percent target means the same relative effort for both hands and a different force for each. The examiner can adjust the percentages between blocks, and every change is logged.
Reach, or hold
The protocol distinguishes two kinds of action. A ballistic repetition is complete the instant force reaches the target line; it asks how quickly a participant can produce a force. A sustained repetition asks them to stay inside the band for more than two seconds without a break, and leaving the band restarts the hold clock rather than failing the attempt outright. Both come in a Go form, where the arrow appears at the go cue, and a Prep form, where a hollow arrow appears first so the participant knows which hand is coming before they are told to move.
Ballistic: reach the line
Done the moment force touches the centre line.
Try it: drag the ball, or use the arrow keys.
Sustained: hold the band
Stay inside for more than 2 s without a break.
Try it: drag the ball, or use the arrow keys.
Every repetition ends in a record
The participant only ever sees a thumbs-up or a thumbs-down. The record keeps the reason. A repetition can fail because the participant moved before the cue, because the target was never reached, or because a hold broke; or it can succeed. Each outcome is logged with its own status, alongside the hand used, the randomised delay, the cue time, the first crossing into the band and the relaxation that followed. I wanted a researcher looking at the data months later to know not just that a repetition failed, but how.
Testing stimulation settings
The point of a programming visit is to compare settings. DynoReader displays each configured setting, frequency, amplitude, pulse width and the active contact, and highlights only what changed from the previous one, so the operator checks the difference instead of re-reading every value. The operator dials the setting into the stimulator by hand, on Enspire's own equipment, and confirms it in DynoReader; the application never programs the device.
Condition ASetting 1 of 2
Confirmed by operator- Frequency
- 130 Hz
- Amplitude
- 2.0 mA
- Pulse width
- 60 μs
- Contact
- 2 −
One device, one task
Each setting is dialled in on the stimulator by hand and confirmed before its task runs.
Condition BSetting 2 of 2
Confirmed by operator- Frequency
- 130 Hz
- Amplitude
- 3.0 mA
- Pulse width
- 90 μs
- Contact
- 5 −
For the settings-sweep task the loop is the same for every setting: confirm the setting was reached, count down a configured wash-in period so the stimulation has taken effect, run a block of fixed-length repetitions, then redo it or move to the next setting. After the last one the operator turns stimulation off and confirms the EEG recording has stopped. DynoReader keeps the time and the order; the operator keeps the stimulator.
Markers for the EEG
Each cue, threshold crossing, outcome and session event sends a code byte to the TriggerBox, which holds it for 200 ms and then resets to zero. Sends are queued, so when a success marker and a relax-cue marker fire together the second waits its turn rather than being dropped. DynoReader also walks the operator through starting and stopping the recording and supplies filenames that match the assessment, so each recording can be tied back to its session. Where a marker lands in the recording relative to the cue on screen was never measured in this project, and the page does not claim it was.
What a session leaves behind
Every visit produces a JSON record: a snapshot of the protocol, timestamped events, the force samples, the maximum-force results and derived targets, the outcome of every repetition, the examiner's annotations, and the participant's own seven-point rating of their hand function with a free-text explanation. Analysis happens afterwards, in the researchers' tools; DynoReader's job is to make sure nothing about the session is lost.
Building it
The application is split into an examiner window, a separate participant display and a shared library of models and workflow logic. The examiner side holds protocol setup, device connection status, session progress, the stimulation-setting displays, a live preview of what the participant sees, and the recording instructions; it also allows practice trials, pause and resume, and repeating or redoing a block, with a warning before a completed set is repeated, because real sessions get interrupted.