我的 Garmin 表盘

· fifteenbao

我的 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
    • 下载地址:https://developer.garmin.com/connect-iq/sdk/
    • 使用Garmin Connect账户登录
  2. 安装 Visual Studio Code
    • 下载地址:https://code.visualstudio.com/
  3. 安装 Monkey C 扩展
    • 打开 VS Code,进入扩展 (Cmd+Shift+X),搜索 “Monkey C”,安装官方Garmin扩展
  4. 生成开发者密钥(如果还没有)
    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 → 输入 “Monkey C: Run” → 选择 “fr265s”
  2. 使用命令行(推荐)
    • 第一步:启动模拟器(新终端运行,需保持运行):connectiq
    • 第二步:编译并推送:
    monkeyc -o bin/garmin.prg -f monkey.jungle -y developer_key.der -d fr265s -w
    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;  // 扫描线颜色
    
  • 调整数据字段:修改 drawStats() 函数来更改显示的健身指标或它们的位置
  • 动画:通过修改 drawVaultBoy() 函数增强避难所男孩角色的动画效果,根据不同状态(心率区间、活动水平等)使用精灵图像

技术细节

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

致谢

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

许可

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

支持

  • 官方文档: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。从AI写的工程来看,会提取使用的字符形成 fnt 格式的文档。

font文件 ShareTechMonoTime

还优化了一些字符的显示,比如步数超过9999会溢出,当步数超过此数值时,会切换成千分位 10.0k 显示。时间符号 “:” 全字符很占小屏幕的位置,把小时和分钟布置成上下排列,减少占位。

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