powerfun-setting/CLAUDE.md
Caiyanpeng 64beed9c4e 新增自动更新功能,隐藏首页T5骑行台入口
① 新增自动更新功能(UpdateModal),HomeScreen接入版本检测
② LanguageModal 添加 statusBarTranslucent 浸润样式
③ 首页T5骑行台入口注释隐藏
④ 版本号从 1.0.1 升级至 1.0.2
⑤ 多语言文件更新(en.json, zh.json)
⑥ 新增 CLAUDE.md 项目说明文档
⑦ 更新 yarn.lock 依赖

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-06-11 09:18:11 +08:00

4.5 KiB

CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

Project Overview

POWERFUN Settings App - A React Native application for managing POWERFUN fitness devices (power meters, paddle sensors, T5 trainers) via Bluetooth LE. Supports device scanning, information reading, calibration, firmware updates (DFU), and spindown calibration.

Build Commands

yarn start          # Start Metro bundler
yarn android        # Run on Android
yarn ios            # Run on iOS
yarn build-a        # Android release build (set NODE_OPTIONS=--openssl-legacy-provider)
yarn lint           # Run ESLint
yarn test           # Run Jest tests
yarn clean-a        # Clean Android build (cd android && gradlew clean)

Architecture

Navigation Structure

  • React Navigation Native Stack Navigator
  • Entry: SplashScreen → HomeScreen
  • Three device paths from HomeScreen: Power Meter, Paddle, T5 Trainer
  • Each path: ScanScreen → InfoScreen → DfuScreen
  • T5 has additional: SpindownScreen
  • Global: SettingScreen, PrivacyScreen

Screen to File Mapping

Screen File Purpose
HomeScreen src/HomeScreen.tsx Device type selection (3 buttons)
ScanScreen src/ScanScreen.tsx Power meter BLE scanning
ScanScreen2 src/ScanScreen2.tsx Paddle BLE scanning
ScanScreen3 src/ScanScreen3.tsx T5 trainer BLE scanning
InfoScreen src/InfoScreen.tsx Power meter info, real-time data, calibration, power trim
InfoScreen2 src/InfoScreen2.tsx Paddle boat type settings
InfoScreen3 src/InfoScreen3.tsx T5 trainer weight, bike type, ERG smoothing
DfuScreen src/DfuScreen.tsx Nordic DFU firmware upgrade
SpindownScreen src/SpindownScreen.tsx T5 trainer spindown calibration
SettingScreen src/SettingScreen.tsx Language, privacy policy
PrivacyScreen src/PrivacyScreen.tsx Privacy policy content

Bluetooth LE Architecture

  • Library: @systemic-games/react-native-bluetooth-le
  • Central API for scanning, connecting, reading/writing characteristics, subscribing to notifications
  • Device name prefixes for filtering:
    • Power meters: PF-PM5- or POWERFUN-
    • Paddles: PF-STK- or POWERFUN-
    • T5 trainers: PF-T5- or POWERFUN-
  • RSSI filtering: devices below -90 dBm are filtered out

BLE Service/Characteristic UUIDs

Service Characteristic Purpose
fff1 fff2 (write) Custom power meter commands
fff1 fff3 (notify) Custom power meter responses
180a 2a25 Serial number
180a 2a28 Firmware version
180a 2a27 Hardware version
180f 2a19 Battery level
1818 2a63 Cycling power measurement (real-time)

DFU Architecture

  • Library: @systemic-games/react-native-nordic-nrf5-dfu
  • Firmware manifest: https://powerfun.oss-cn-shanghai.aliyuncs.com/yecongdfu/latest.json
  • Firmware versions parsed as hardware.iteration.build (e.g., "1.23.456")
  • Upgrade only allowed when server iteration > device iteration
  • Downloads firmware zip to cache, then initiates DFU

i18n Architecture

  • Library: i18next with react-i18next
  • Languages: Chinese (zh) and English (en)
  • Storage key: @app_language in AsyncStorage
  • Translation files: src/i18n/locales/zh.json, src/i18n/locales/en.json

Key Implementation Notes

Bluetooth Connection Lifecycle

  • InfoScreens connect to device on mount, disconnect on navigation away (except when going to DfuScreen)
  • Connection status listener: Central.addListener("peripheralConnectionStatus", handler)
  • Device ready state: connectionStatus === "ready"

Real-time Data Parsing (Power Meter - 2A63)

  • Byte 2-3: Power value (little-endian)
  • Byte 4: Left balance (0.5% units)
  • Byte 5-6: Cadence revolution count (little-endian)
  • Byte 7-8: Cadence timestamp (1/1024 second units)
  • Cadence RPM = (revolution_diff / time_in_seconds) * 60

Power Trim

  • Range: 50-200 (represents 50%-200%)
  • Stored as: value * 100, sent as 2-byte little-endian
  • Protocol: Write [0x02, low, high] to FFF2, then write [0x04] to trigger update

Calibration

  • Command: Write 0x05 to FFF2
  • Response: Read from FFF3 notify (0x05 + 2-byte value in 0.1 units)
  • Timeout: 5 seconds

Firmware Version Comparison

// Version format: "hardware.iteration.build" (e.g., "1.23.456")
// Only iteration is compared for upgrade decision
// hardware mismatch → cannot upgrade
// server iteration <= device iteration → no upgrade needed