使用状态图的卡西欧 F-91W
摘要
一个开源交互式演示,使用 XState 库构建的状态图对经典的卡西欧 F-91W 手表进行建模,并配有并排展示的 Stately 可视化工具,用于教学。该实现采用 ClojureScript 和 Babashka,基于 David Harel 于 1987 年发表的状态图开创性论文;这篇论文以数字腕表为例而广为人知。
查看缓存全文
缓存时间: 2026/10/16 07:17
dundalek/casio-f91w-fsm
来源:https://github.com/dundalek/casio-f91w-fsm
使用状态图实现 Casio F-91W
在线演示:casio-f91w.pages.dev (https://casio-f91w.pages.dev)
使用状态图构建的 Casio F-91W 手表交互模型。
简介
状态图 (https://statecharts.dev) 是状态机的扩展,由 David Harel 于 1987 年提出。 在这篇论文 (https://web.archive.org/web/20140828085002/http://www.wisdom.weizmann.ac.il/~harel/papers/Statecharts.pdf) 中,Harel 使用了一款数字腕表作为示例模型。
我一直觉得,如果能有一个交互式演示,让人看到状态图的实际运行效果,那就太好了。 遗憾的是,那款腕表(Citizen Quartz Multi-Alarm III)如今已十分罕见。
不过,还有经典的 Casio F-91W (https://en.wikipedia.org/wiki/Casio_F-91W)。尽管它在论文发表仅两年后就已推出,但至今仍广受欢迎,并且仍在生产和销售。 Alexis Philip 创建了一个在线版本 (https://github.com/alexisphilip/Casio-F-91W),将其图形元素数字化。
本演示 (https://casio-f91w.pages.dev) 基于 Alexis 的工作,通过使用 XState (https://xstate.js.org/) 库替换原有逻辑来展示状态图的用法,并使用 Stately 可视化工具并排展示状态和转换,以便学习。你还可以查阅这款手表的官方说明书 (https://web.archive.org/web/20240310073811/https://support.casio.com/storage/en/manual/pdf/EN/009/qw593.pdf)。
Casio F-91W 状态图演示 (https://casio-f91w.pages.dev)
差异与限制
- 日期和时间的设置方式略有不同,因为它们使用 JavaScript 内置的 Date 对象表示。因此,演示中不提供星期设置。
- 尚未实现通过按住 A 按钮,在设置闹钟或日期时间时持续递增时间的功能。
- 可以设置每日闹钟时间,但尚未实现实际触发闹钟的功能。
资源
- Citizen 手表状态图 (https://github.com/andyjakubowski/statechart-watch) - 对原版 Citizen 手表的类似状态图实现
- 状态图论文 (https://web.archive.org/web/20140828085002/http://www.wisdom.weizmann.ac.il/~harel/papers/Statecharts.pdf) - David Harel 于 1987 年发表的原始论文
- Casio F-91W 说明书 (https://web.archive.org/web/20240310073811/https://support.casio.com/storage/en/manual/pdf/EN/009/qw593.pdf) - 这款手表的官方说明书
实现
文件结构:
- demo/script - 原始实现,仅使用其中的渲染代码
- src/casio - 包含基于状态图的实现
- machine.js - XState 状态机定义
- machine.cljs - 状态机动作的实现
- xstate_service.cljs - 在 ClojureScript 中使用 XState 的辅助函数
- statecharts_service.cljs - 使用 clj-statecharts (https://github.com/lucywang000/clj-statecharts) 对 XState 状态机定义进行封装
- app.cljs - 运行状态机的主应用
开发
运行 bb dev 启动开发进程(需要 Babashka (https://babashka.org/))
打开应用:http://localhost:8888/
在浏览器中运行测试:http://localhost:8888/test
相似文章
Show HN: 模拟手表
一位用户在 Hacker News 上分享了一个模拟手表项目,这很可能是一个具有指针式风格的数字时钟。
新款卡西欧 F-B100W – 经典 F-91W 面世 40 年后迎来升级
卡西欧推出 F-B100W,作为经典 F-91W 数字腕表的现代化升级版本,庆祝这一标志性设计诞生 40 周年。
将我的 CASIO F-91W 改造为非接触式支付设备
本文描述了一个DIY项目,作者改装了CASIO F-91W数字手表,使其支持使用NFC技术的非接触式支付,从而消除了携带手机或卡片进行交易的需要。
@PrajwalTomar_: https://x.com/PrajwalTomar_/status/2106362193063346558
一篇详细教程,讲解如何配合 Tella 和 Higgsfield 连接器使用 Claude Opus 5.5:通过观看参考网站的屏幕录制,搭建一个带 3D 滚动动画的奢侈手表网站(SELENE),包含全部提示词、成本和失败尝试。
首款具备计算机功能的手表
本文重点介绍了精工(Seiko)于1984年发布的世界首款腕上计算机系统,该系统包括一块手表、一个带打印机的控制器以及一个用于编写BASIC程序的键盘。