我的 Garmin 表盘

我的表盘

23年的双十一换了 Garmin 的 Forerunner265S

购买原因:

1. 可以不带手机跑步和听音乐 
2. 待机时间长 
3. 显得专业

想换《辐射》主题很久了…… 有看到喜欢的又没办法海外付款,最近试试用AI写了一个主题,目前还是比较满意的

Pip-Boy 3000 表盘 - Garmin Forerunner 265s

辐射(Fallout)系列游戏启发的Pip-Boy主题表盘,专为Garmin Forerunner 265s设计,采用标志性的绿色单色复古未来主义美学。

功能特性

  • 复古Pip-Boy设计:经典绿色单色配色方案 (#00FF00)
  • CRT屏幕效果:真实的扫描线叠加,呈现复古终端外观
  • 全面的数据显示
    • 时间(时:分,带秒数)
    • 日期(日、月、年)
    • 步数计数器
    • 心率监测
    • 电池百分比
    • 消耗卡路里
  • 避难所男孩角色:标志性的辐射吉祥物
  • Pip-Boy边框:带角落支架的技术边框

安装说明

前置要求

  1. 安装 Connect IQ SDK Manager

  2. 安装 Visual Studio Code

  3. 安装 Monkey C 扩展

官方文档

  • 打开 VS Code
  • 进入扩展 (Cmd+Shift+X)
  • 搜索 “Monkey C”
  • 安装官方Garmin扩展
  1. 生成开发者密钥(如果还没有)
    openssl genrsa -out developer_key.pem 4096
    openssl pkcs8 -topk8 -inform PEM -outform DER -in developer_key.pem -out developer_key.der -nocrypt
    

构建表盘

  1. 使用 Visual Studio Code(推荐):

    • 在VS Code中打开此项目文件夹
    • Ctrl+Shift+P(Mac上为 Cmd+Shift+P
    • 输入 “Monkey C: Build for Device”
    • 选择 “fr265s” (Forerunner 265s)
    • .prg 文件将在 bin 文件夹中生成
  2. 使用命令行

    # 确保 monkeyc 编译器在你的 PATH 中
    # -o: 输出文件
    # -f: Jungle 配置文件
    # -y: 开发者密钥
    # -d: 目标设备 (fr265s)
    # -w: 显示警告
    monkeyc -o bin/garmin.prg -f monkey.jungle -y developer_key.der -d fr265s -w
    

在模拟器中测试

  1. 使用 VS Code

    • Ctrl+Shift+P(Mac上为 Cmd+Shift+P
    • 输入 “Monkey C: Run”
    • 选择 “fr265s”
  2. 使用命令行(推荐)

    第一步:启动模拟器 在新的终端窗口中运行(需保持运行状态):

    # 启动 Connect IQ 模拟器
    connectiq
    

    第二步:编译并推送 在项目根目录下运行:

    # 1. 编译项目 (生成 PRG 文件)
    # 注意:请确保替换为你实际的 SDK路径 和 开发者密钥路径
    monkeyc -o bin/garmin.prg -f monkey.jungle -y developer_key.der -d fr265s -w
    
    # 2. 推送到模拟器
    monkeydo bin/garmin.prg fr265s
    

    提示: 如果 monkeyc 命令未找到,主要需要在 PATH 中添加 SDK 的 bin 目录。 Mac 默认路径通常为: ~/Library/Application Support/Garmin/ConnectIQ/Sdks/connectiq-sdk-mac-x.x.x/bin

安装到手表

  1. 通过 Garmin Express(电脑):

    • 将Forerunner 265s连接到电脑
    • 打开Garmin Express
    • .prg 文件复制到手表的 GARMIN/APPS 文件夹
  2. 通过 Connect IQ 手机应用

    • 在VS Code中将项目导出为 .iq 文件
    • 传输到手机
    • 使用Connect IQ应用安装到手表

项目结构

gamini/
├── manifest.xml                          # 应用清单和设备配置
├── monkey.jungle                         # 构建配置
├── source/
│   ├── PipBoyWatchFaceApp.mc            # 主应用入口点
│   └── PipBoyWatchFaceView.mc           # 表盘视图和渲染逻辑
└── resources/
    ├── strings/
    │   └── strings.xml                   # 本地化字符串
    ├── layouts/
    │   └── layout.xml                    # UI布局定义
    └── drawables/
        ├── drawables.xml                 # 可绘制资源定义
        ├── launcher_icon.png             # 应用启动图标
        ├── vault_boy_walk1.png     # 走路动画1
        ├── vault_boy_walk2.png     # 走路动画2
        └── vault_boy.png           # 避难所男孩待机精灵图

自定义

更改颜色

编辑 PipBoyWatchFaceView.mc 并修改这些变量:

var pipboyGreen = 0x00FF00;  // 主Pip-Boy绿色
var backgroundColor = 0x000000;  // 黑色背景
var darkGreen = 0x006600;  // 扫描线颜色

调整数据字段

修改 PipBoyWatchFaceView.mc 中的 drawStats() 函数来更改显示的健身指标或它们的位置。

动画

可以通过修改 drawVaultBoy() 函数来增强避难所男孩角色的动画效果,根据不同状态(心率区间、活动水平等)使用精灵图像。

技术细节

  • 目标设备:Garmin Forerunner 265s(416x416 AMOLED显示屏)
  • 最低API级别:3.2.0
  • 语言:Monkey C
  • 权限:SensorHistory, UserProfile

致谢

  • 灵感来自辐射游戏系列的Pip-Boy界面
  • 为Garmin Connect IQ平台创建
  • 避难所男孩角色 © Bethesda Softworks

许可

这是一个粉丝制作的表盘,仅供个人使用。

支持

有关Garmin Connect IQ开发的问题:

  • 官方文档:https://developer.garmin.com/connect-iq/
  • 开发者论坛:https://forums.garmin.com/developer/

一些修改过程

添加唤醒走路动画

添加了一个手表唤醒之后行走的动画 会在 drawables.xml 文件制定图片资源

<?xml version="1.0"?>
<resources>
    <bitmap id="LauncherIcon" filename="launcher_icon.png" />
    <bitmap id="VaultBoy" filename="vault_boy.png" />
    <bitmap id="VaultBoyWalk1" filename="vault_boy_walk1.png" />
    <bitmap id="VaultBoyWalk2" filename="vault_boy_walk2.png" />
</resources>

PipBoyWatchFaceView.mc 中定义动画

// --- Center: Vault Boy ---
        var bmpToDraw = vaultBoyBitmap;
        if (isAwake && vaultBoyWalk1Bitmap != null && vaultBoyWalk2Bitmap != null) {
            var nowMs = System.getTimer();
            // Play animation for 2 seconds
            if (nowMs - animStartTime < ANIM_DURATION) {
                // Cycle every 250ms (Walking speed)
                // 3 Frames: 0=Stand, 1=Walk1, 2=Walk2
                var frame = (nowMs / 250) % 3;
                if (frame == 1) {
                    bmpToDraw = vaultBoyWalk1Bitmap;
                } else if (frame == 2) {
                    bmpToDraw = vaultBoyWalk2Bitmap;
                }
            }
        }

动画效果 走路效果

字体

字体使用了谷歌的开源字体:(Share Tech Mono)[https://fonts.google.com/specimen/Share+Tech+Mono] 从AI写的工程来看,会提取使用的字符形成 fnt 格式的文档

font文件 ShareTechMonoTime

还优化了一些字符的显示, 比如步数超过9999会溢出,当步数超过此数值时,会切换成千分位 10.0k 显示

时间符号 “:” 全字符很占小屏幕的位置,把小时和分钟布置成上下排列,减少占位

目前看还是比较满意的 AI Coding 上大分!