Skip to content

MicrobitMore拡張機能のファームウェア更新機能の実装 #22

@takaokouji

Description

@takaokouji

Microbit拡張機能と同様に、MicrobitMore拡張機能でもファームウェア(.hexファイル)を自動的にダウンロードし、接続トラブル時に「周辺機器を更新 (Update Peripheral)」できるようにする機能を実装する。

背景と目的

現在、smalruby3-gui では Microbit 拡張機能利用時に、互換性のあるファームウェアを自動的にダウンロードし、接続できない場合にユーザーがファームウェアを更新できる仕組みがある。
MicrobitMore 拡張機能においても同様の仕組みを導入し、ユーザーが適切なファームウェア(v2対応)を容易に利用できるようにする。


調査結果

現在の実装(Microbit拡張機能)

ファイル 役割
scripts/prepublish.mjs ビルド時に Universal Hex をダウンロード(ZIP形式)
src/lib/microbit-update.js ファームウェア書き込み処理(Universal Hex 形式必須
src/containers/connection-modal.jsx UI制御(148行目: extensionId === 'microbit' にハードコード)
src/generated/microbit-hex-url.cjs ビルド時に自動生成されるhex URLのエクスポート

ファームウェア更新の仕組み

  1. ビルド時: prepublish.mjs が Scratch の microbit hex (Universal Hex形式) をダウンロード
  2. 実行時: デバイスが見つからない場合、connection-modal.jsx が「Update Peripheral」UIを表示
  3. 更新処理: microbit-update.js が WebUSB + DAPLink でファームウェアを書き込み

重要なコード箇所

microbit-update.js (77-83行目):

const getHexMap = async () => {
    const response = await fetch(hexUrl);
    const hex = await response.text();

    if (!isUniversalHex(hex)) {
        throw new Error('Hex file must be in universal format');  // ← V2専用hexでエラー
    }
    // ...
};

connection-modal.jsx (148行目):

const canUpdatePeripheral = (this.props.extensionId === 'microbit') && isMicroBitUpdateSupported();
// ↑ 'microbit' にハードコードされている

connection-modal.jsx (145行目):

// TODO: get this functionality from the extension  ← 将来的な拡張が想定されていた
return selectAndUpdateMicroBit(progressCallback);

MicrobitMore 固有の課題

重大な問題: Universal Hex 非対応

MicrobitMore は V2専用 hex のみを提供しており、Universal Hex 形式ではありません。

項目 Microbit (Scratch) MicrobitMore
Hex 形式 Universal Hex (V1+V2) V2専用
ファイルサイズ 約1.8MB 約700KB
V1 対応 あり なし
ダウンロードURL https://downloads.scratch.mit.edu/microbit/scratch-microbit.hex.zip https://github.com/microbit-more/pxt-mbit-more-v2/releases/download/0.2.5/microbit-mbit-more-v2-0_2_5.hex

技術的な制約

  1. isUniversalHex() チェックで V2専用 hex は失敗する
  2. separateUniversalHex() が V2専用 hex では動作しない
  3. micro:bit V1 ユーザーは MicrobitMore を使用できない(これは MicrobitMore 自体の制約)

実装オプション

オプション A: ビルド時に Universal Hex を作成(推奨)

V2専用 hex と「error hex for V1」を組み合わせて Universal Hex を作成する。

手順:

  1. prepublish.mjs で MicrobitMore V2 hex をダウンロード
  2. micro:bit Foundation の error hex (V1用) を取得
  3. @microbit/microbit-universal-hexcreateUniversalHex() で結合
  4. 結合した Universal Hex を static/microbitMore/ に保存

メリット:

  • 既存の microbit-update.js をほぼそのまま利用可能
  • V1 ユーザーには適切なエラーメッセージが表示される

デメリット:

  • error hex の入手・管理が必要
  • ファイルサイズが増加(約1.8MB)
  • ビルドプロセスが複雑化

必要な作業:

  • error hex for V1 の入手先を確認
  • prepublish.mjs に MicrobitMore 用ダウンロード処理を追加
  • createUniversalHex() による結合処理を実装
  • connection-modal.jsx の条件分岐を追加

オプション B: V2専用処理に対応

microbit-update.js を修正して V2専用 hex を許容する。

変更点:

const getHexMap = async (isUniversalRequired = true) => {
    const response = await fetch(hexUrl);
    const hex = await response.text();

    if (isUniversalRequired && !isUniversalHex(hex)) {
        throw new Error('Hex file must be in universal format');
    }

    if (!isUniversalHex(hex)) {
        // V2専用として処理
        const hexMap = new Map();
        const binary = new TextEncoder().encode(hex);
        hexMap.set(DeviceVersion.V2, binary);
        return hexMap;
    }
    // ... 既存の Universal Hex 処理
};

メリット:

  • ファイルサイズが小さい(約700KB)
  • 実装が比較的シンプル

デメリット:

  • V1 ユーザーに対するエラーハンドリングが必要
  • 既存コードの変更が必要

必要な作業:

  • microbit-update.js の修正
  • V1 デバイス検出時のエラーメッセージ追加
  • connection-modal.jsx の条件分岐を追加

オプション C: 別モジュールを作成

MicrobitMore 専用の microbit-more-update.js を新規作成する。

メリット:

  • 既存コードに影響なし
  • 関心の分離が明確

デメリット:

  • コードの重複が発生
  • メンテナンスコストの増加

必要な作業:

  • src/lib/microbit-more-update.js を新規作成
  • connection-modal.jsx で拡張機能ごとに更新関数を選択

推奨実装方針

オプション B(V2専用処理に対応)を推奨

理由:

  1. MicrobitMore は元々 V2専用であり、V1 をサポートする必要がない
  2. ファイルサイズを小さく保てる
  3. error hex の管理が不要
  4. 実装がシンプル

推奨実装ステップ

  1. prepublish.mjs の修正

    • MicrobitMore V2 hex をダウンロード(ZIP形式ではなく直接hex)
    • static/microbitMore/microbit-mbit-more-v2.hex に保存
    • src/generated/microbit-more-hex-url.cjs を生成
  2. microbit-more-update.js の作成

    • microbit-update.js をベースに作成
    • isUniversalHex チェックを削除
    • V2専用として処理
    • V1 デバイス検出時はエラーメッセージを表示
  3. connection-modal.jsx の修正

    • canUpdatePeripheral の条件に microbitMore を追加
    • handleSendUpdate で拡張機能IDに応じた更新関数を呼び出し

参考リンク


完了条件

  • ビルド時に MicrobitMore の Hex がダウンロードされること
  • GUI 上で MicrobitMore 接続モーダルからファームウェア更新が実行できること
  • V2 デバイスでファームウェア更新が成功すること
  • V1 デバイスでは適切なエラーメッセージが表示されること

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions