Klock Plus 是一个时钟App展示工具,可以运行在PC / CASIO fx-9860 / WinCE等平台上。
并且可以在PC上构建用户自定义的表盘。
此项目按照 BSD 协议开源。
在这里下载当前版本的 KlockPlus。包含可执行文件与构建好的样例表盘。
将KLOCKP.G1A
安装在 Flash Mem,并将需要展示的表盘文件 *.kwf
放置在 Flash Mem 或者 SD Card,启动程序即可展示。
因为CE.1x并不支持 GetModuleFileName
API。所以需要把所有KWF文件放在根目录下。在其他地方运行KlockP
开头的exe即可。
在CE2.x下把exe与KWF文件放在同个目录下即可。
可以启动,但是文件不能被正确列出,请按照CE1.x的情况把KWF文件放在系统根目录下。
为了尽可能兼容更多的设备,KlockPlus在WinCE上使用了虚拟按键。实体按键的功能如下:
实体键 | 功能 |
---|---|
方向键 上 / Enter / 确认 | 显示 / 隐藏虚拟按键 |
方向键 下 | 翻转屏幕方向(在竖屏的设备上) |
Tab / Esc / 取消 | 退出 App |
W, A, S, D | 对应方向:上,下,左,右 |
K, L | 对应功能键 A,B |
用户可以自己编写 KBasic Script
并且使用KlockPlus Builder
来构建KWF
格式的表盘。
KBasic 是一种表达绘制流程的简单脚本语言,使用Builder构建,编译为KRT字节码(一个简单的基于堆栈的虚拟机)。
表盘 App 加载后,会后循环执行KBasic的代码,并且传入时、分、秒、毫秒等信息来执行绘制表盘,绘制的速度大约是 12 FPS。
x# 打印一句提示语
print(0, 0, "Basic Clock", 1)
# 拼接字符串,格式化时分秒
let str_time = zeropad(hh, 2) & ":" & zeropad(mm, 2) & ":" & zeropad(ss, 2)
# 打印时间字符串
print(8, 12, str_time, 0)
更多的样例请参考 samples/
文件夹下的kbs
文件。
假设上面的样例保存为文件 sample0-basic.kbs
。
在命令行输入下面的命令来构建
xxxxxxxxxx
# -i 输入脚本文件名字
# -o 输出二进制文件名
# -d 可选选项,附加之后会打印调试信息
klockbuilder build -i sample0-basic.kbs -o sample0.kwf
输入以下的命令来预览
xxxxxxxxxx
# -i 输入二进制文件名字
# -d 可选选项,附加之后会打印调试信息
klockbuilder preview -i sample0.kwf
当然,也可以选择直接双击 klockbuilder.exe
,会弹出选择文件的对话框,选择文件来预览。
KBasic 有五种指令:
指令 | 样例 | 功能 | 附注 | |
---|---|---|---|---|
1 | image 指令 | image "bitmap_file_name.bmp" | 加载 bmp 格式的图片 | 只接受色深为 24bit 的 bmp |
2 | let 指令 | let var_name = expr | 将 expr 的计算结果赋值给变量 var_name | 请注意,如果没有let在行首,会被理解为使用=(等于)操作符的表达式,并不会报错 |
3 | 标签指令 | label_name: | 跳转标签 | |
4 | goto 指令 | goto label_name | 无条件跳转到指定标签 | |
5 | if 指令 | if expr goto label_name | expr 计算结果不为0时跳转到指定标签 | |
6 | 表达式 | zeropad(hh, 2) & ":" & zeropad(mm, 2) 1+2/sin(ms) | 可以计算的表达式 |
变量名 | 功能 | 附注 |
---|---|---|
hh | 当前时间的小时 | |
mm | 当前时间的的分钟 | |
ss | 当前时间的秒 | |
ms | 当前时间的毫秒 | 受到 fx-9860 RTC 功能的限制,毫秒的精度是基于1/128秒的,需要注意。 |
表达式可以有两种值,字符串 RVT_STRING
与 数值RVT_NUMBER
优先级 | 操作符 | 功能 | 样例 |
---|---|---|---|
500 | - | 取负数 | -a -1.5 |
200 | * | 乘法 | a * b |
200 | / | 除法 | a / b |
200 | % | 取模 | a % b |
200 | \ | 整数除法 | a \ b |
100 | + | 加法 | a + b |
100 | - | 减法 | a - b |
90 | & | 字符串连接 | "hello " & "world & 2" |
60 | > | 大于 | a > b |
60 | < | 小于 | a < b |
60 | >= | 大于等于 | a >= b |
60 | <= | 小于等于 | a <= b |
50 | = | 等于 | a = b |
50 | <> | 不等于 | a <> b |
50 | ! | 逻辑非 | !a |
40 | && | 逻辑与 | a && b |
30 | || | 逻辑或 | a || b |
函数标号 | 函数声明 | 返回值 | 附注 |
---|---|---|---|
0 | sin(a) | RVT_NUMBER | 正弦 |
1 | cos(a) | RVT_NUMBER | 余弦 |
2 | tan(a) | RVT_NUMBER | 正切 |
3 | sqrt(a) | RVT_NUMBER | 平方根 |
4 | exp(a) | RVT_NUMBER | 指数 |
5 | abs(a) | RVT_NUMBER | e为底的指数函数 |
6 | log(a) | RVT_NUMBER | 对数 |
7 | rand() | RVT_NUMBER | 范围在区间[0, 1) 的随机数 |
8 | clr() | RVT_NUMBER | 清除屏幕内容。总是返回 0 |
9 | zeropad(num, digits) | RVT_STRING | 将数值转化为字符串,长度不足的时候在前方补充0 |
10 | printmini(x, y, str, rev) | RVT_NUMBER | 打印字符串,字体尺寸4x6。总是返回 0 |
11 | print(x, y, str, rev) | RVT_NUMBER | 打印字符串,字体尺寸6x8。总是返回 0 |
12 | gprint(x, y, str, image_index) | RVT_NUMBER | 将指定的图片当做包含字符: 与字符0-9 的字体,打印字符串总是返回 0 |
13 | line(x0, y0, x1, y1, dot) | RVT_NUMBER | 画线,dot为1是黑色,dot为0时白色。总是返回 0 |
14 | blt(x, y, image_index) | RVT_NUMBER | 在指定位置绘制图片。总是返回 0 |
15 | p(expr) | RVT_NUMBER | 在控制台输出参数的内容,只在pc上有效。总是返回 0 |
16 | gprintv(x, y, str, image_index) | RVT_NUMBER | 与gprint 功能相同,但是打印方向是竖向。 总是返回 0 |
我为fx-9860GII设计了可以3D打印的表带:
可以真的把fx-9860当做手表戴在手腕上,稍后你可以在Thingiverse上找到它。
此项目的 KlockPlus Builder
使用了 SDL,并在分发时附带了 SDL.dll
。如果想要自己修改、构建 KlockPlus Builder
,需要在你的工具链中安装SDL 1.2
。
此项目的字体使用了 Portfolio 6x8 与 Tom Thumb 4x6。
此项目的吉祥物:狗大哈 · Husky The Big。记得谢谢狗大哈!