Casio F-91W met Statecharts

Online demo: casio-f91w.pages.dev

Introductie

Statecharts zijn een uitbreiding van state machines, geïntroduceerd door David Harel in 1987. In zijn paper gebruikte Harel een digitaal polshorloge als voorbeeldmodel.

Het doel van dit project was om een interactieve demo te creëren waarmee men statecharts in actie kan zien. Omdat het specifieke horloge uit de paper (de Citizen Quartz Multi-Alarm III) inmiddels zeldzaam is, is er gekozen voor de iconische Casio F-91W. Ondanks dat dit model pas twee jaar na de publicatie van de paper verscheen, blijft het wereldwijd populair en wordt het nog steeds geproduceerd en verkocht.

Deze demo bouwt voort op het werk van Alexis Philip, die een online versie maakte waarin de grafische elementen werden gedigitaliseerd. In deze versie is de logica vervangen door de XState-bibliotheek en wordt de Stately-visualisator gebruikt om statussen en overgangen zij aan zij te tonen voor educatieve doeleinden. Voor meer informatie kan de officiële handleiding van het horloge worden geraadpleegd.

Verschillen en beperkingen

  • Datum en tijd: Het instellen van de datum en tijd wijkt enigszins af, aangezien dit is gerealiseerd met het ingebouwde JavaScript Date-object. Het instellen van de dag van de week is daarom niet opgenomen in de demo.
  • Knoppen: De functie waarbij men knop A ingedrukt houdt om de tijd in het alarm- of datum/tijdmenu sneller te verhogen, is niet geïmplementeerd.
  • Alarm: Het is mogelijk om de tijd voor het dagelijkse alarm in te stellen, maar het daadwerkelijk triggeren van het alarm is niet geïmplementeerd.

Bronnen

  • Citizen watch statechart – een vergelijkbare statechart-implementatie van het originele Citizen-horloge.
  • Statecharts paper – het originele paper uit 1987 door David Harel.
  • Casio F-91W handleiding – de officiële handleiding voor het horloge.

Implementatie

De mappenstructuur is als volgt opgebouwd:

  • demo/script – de originele implementatie; alleen de code voor het renderen wordt gebruikt.
  • src/casio – bevat de implementatie op basis van statecharts.
  • machine.js – de definitie van de XState-machine.
  • machine.cljs – implementatie van de machine-acties.
  • xstate_service.cljs – helpers voor het gebruik van XState in ClojureScript.
  • statecharts_service.cljs – wrapper voor de XState-machinedefinitie met clj-statecharts.
  • app.cljs – de hoofdapplicatie die de machine aanstuurt.

Ontwikkeling

  1. Voer bb dev uit om het ontwikkelproces te starten (hiervoor is Babashka vereist).
  2. Open de applicatie via: http://localhost:8888/
  3. Voer tests uit in de browser via: http://localhost:8888/test