Veel te veel detail over de knipperende lampjes van de TermDriver2

Ik heb verrassend veel tijd besteed om de vier statusindicatoren van een TermDriver2 precies goed te krijgen.

Dit zijn vier kleine gesimuleerde indicatielampjes in de hoek van het display van de TermDriver2. De bovenste twee (TX, RX) knipperen en lichten op wanneer er dataverkeer is, en de onderste twee tonen de huidige status van de controllijnen.

Aan/uit leek niet voldoende. Vooral voor TX en RX wilde ik dat de lampjes langer aan bleven dan de eigenlijke transmissietijd, anders kun je de flits gemakkelijk missen. (UART-chips van FTDI doen hetzelfde; zij implementeren een pulse stretch op hun LED-uitgangen om precies dezelfde reden.)

Maar ik wilde de lampjes ook een meer analoog gevoel geven. Iets als de prachtige indicatoren uit het Apollo-tijdperk.

De animatie van het licht

Om te beginnen is er geen sprake meer van een onmiddellijke aan/uit-schakeling. Gloeilampen werken niet zo. Elk van de vier lampen is geanimeerd van 'uit' naar 'aan' in 16 stappen:

De firmware houdt voor elk lampje een teller van 0-15 bij. Als het signaal aan staat, wordt de teller met 5 verhoogd, en als het uit staat, wordt deze met 1 verlaagd. De lampjes worden dus veel sneller helderder dan ze dimmer worden. Dit zorgt voor een mooie, gloeilamp-achtige tijdrespons.

Eén enkel byte veroorzaakt een waarneembare maar zwakke flikkering. Een constante stroom verkeer zorgt voor maximale helderheid. Wanneer het verkeer stopt, duurt het ongeveer een kwart seconde voordat het lampje volledig donker is.

Grafische details

Maar dat is nog niet alles. De graphics van de lampjes zelf (die slechts 24x16 pixels groot zijn) bevatten een verrassende hoeveelheid detail:

  • De vorm: De omtrek is geen simpele rechthoek met afgeronde hoeken, maar een superellipse, geliefd bij liefhebbers van meetkunde vanwege de prettige gebogen vorm.
  • De helderheid: De helderheid is niet gelijkmatig over het lampje verdeeld. Er is een kwadratische afname van het centrum van het lampje naar de rand. Dit is het duidelijkst te zien bij de drie gekleurde lampjes; het centrum is volledig helder en wordt minder verzadigd naar de randen toe.
  • De gloed: Er is een laatste stap die een Gaussian glow (Gaussische gloed) toevoegt om te simuleren dat het felle licht van het lampje door de zwarte tekst begint te lekken, waardoor het helderder lijkt.

(Bijschrift: Zonder gloed links, met gloed rechts)

Al deze stappen worden gerenderd op een resolutie van 96x64, om vervolgens met een filter 4x te worden verkleind naar de uiteindelijke 24x16 die in de hardware wordt gebruikt.

Reflectie op het proces

Over het geheel genomen denk ik dat ik een hele middag heb besteed om de lampjes er zo uit te laten zien. Was dat de tijd waard? Mijn gevoel hierover is wat complex. In 2024, toen ik het deed, misschien niet echt. Er was veel ander werk dat ik had kunnen doen: de firmware van de TermDriver2 gereedmaken, testsuites schrijven, acceptatietesten uitvoeren.

Maar in 2026? Ja, absoluut. Veel van dat andere werk kan worden geautomatiseerd. Het schrijven van kwalitatief goede testsuites is bijvoorbeeld geen enkel probleem voor coding agents. Maar esthetisch werk kan niet worden geautomatiseerd. En alle beslissingen die ik hierboven heb genomen, waren kwesties van smaak. Wij hebben smaak, en het uitoefenen van die smaak op plekken waar het zichtbaar is, lijkt me tijd en moeite waard.