Skip to content

Conversation

@harutiro
Copy link
Member

@harutiro harutiro commented Nov 3, 2025

Summary by CodeRabbit

  • 新機能

    • キャリブレーション結果の2D可視化を追加
    • キャリブレーション設定をCSVから読み込み可能に(デフォルト値付き)
    • センサーデータ前処理パイプラインと構成可能な処理設定を統合、処理統計を取得可能に
    • デバイス追加フローに名前入力アラートを追加し操作性を改善
  • 改善

    • ナビゲーションタイトル表示をプラットフォーム間で統一
  • テスト

    • データ処理パイプラインの網羅的なテストスイートを追加

変更内容:
- SensorDataProcessorを新規作成し、データのトリミング、nLoSフィルタリング、移動平均処理を実装
- AutoAntennaCalibrationUsecaseにデータ前処理機能を統合し、処理統計情報を収集
- 収集した統計情報を取得するメソッドを追加

これにより、センサーデータの品質向上と処理結果の分析が可能になります。
変更内容:
- AntennaPositioningViewにデバイス追加のアラートを表示する機能を追加
- 新しいデバイス名を入力するためのテキストフィールドを実装
- デバイス名が空でない場合に新しいデバイスを追加するロジックを追加
- FloatingDeviceListPanelにアラート表示のバインディングを追加

これにより、ユーザーはアンテナ配置画面から新しいデバイスを簡単に追加できるようになります。
変更内容:
- CalibrationCSVLoaderを新規作成し、CSVファイルからタグとアンテナの位置情報を読み込む機能を追加
- CalibrationResultVisualizationViewを新規作成し、キャリブレーション結果を視覚的に表示する機能を実装
- AntennaPositioningViewModelにキャリブレーション結果を表示するためのデータ構造とロジックを追加
- 各画面でのナビゲーションバーの表示モードを条件付きで適用する機能を追加

これにより、ユーザーはキャリブレーション結果を視覚的に確認できるようになります。
変更内容:
- `View+NavigationBarTitleDisplayMode.swift`内のインデントを修正し、コードの可読性を向上
- 各画面でのナビゲーションバーの表示モードを一貫して適用するように修正
- `AntennaPositioningView`, `FieldSettingView`, `PairingSettingView`, `SensingManagementView`, `TrajectoryView`でのナビゲーションバー表示モードの適用を整理

これにより、コードの整合性が向上し、メンテナンスが容易になります。
@coderabbitai
Copy link

coderabbitai bot commented Nov 3, 2025

ウォークスルー

AutoAntennaCalibrationUsecase にセンサーデータ前処理を統合し、処理設定・生観測の保存・アンテナ/タグごとの処理統計を追加。CSVベースのキャリブレーション読込、SensorDataProcessor、結果可視化ビュー、ナビゲーション修飾子の共通化、および関連テストを導入。

変更

コホート / ファイル(s) 変更概要
データ処理パイプライン
UWBViewerSystem/Domain/Usecase/AutoAntennaCalibrationUsecase.swift
SensorDataProcessor を受け取る初期化引数(processingConfig)を追加。collectDataFromSession(..., applyPreprocessing: Bool = true)を拡張し、アンテナ/タグ毎に生観測を保存、任意の前処理を適用、処理統計を算出・保存し公開アクセサを追加。
センサーデータ処理ユーティリティ
UWBViewerSystem/Domain/Utils/SensorDataProcessor.swift
新規追加。SensorDataProcessingConfigSensorDataProcessor、トリム/NLOSフィルタ/移動平均処理、統計算出(ProcessingStatistics)を実装。
CSV 読込ユーティリティ
UWBViewerSystem/Domain/Utils/CalibrationCSVLoader.swift
新規追加。TAG/INITIAL_ANTENNA の CSV 読込、ヘッダ検証、行単位パース、LoaderError、およびデフォルト設定やディレクトリ一括読込を実装。
可視化 UI コンポーネント
UWBViewerSystem/Presentation/Components/CalibrationResultVisualizationView.swift
新規追加。2D グリッド上でタグ・初期/較正アンテナ位置、向き矢印、移動矢印を描画する SwiftUI ビューと補助型を導入。
ナビゲーション表示ヘルパー
UWBViewerSystem/Presentation/Components/View+NavigationBarTitleDisplayMode.swift
新規追加。プラットフォームに依存しない navigationBarTitleDisplayModeIfAvailable(_:) とラッパー列挙を追加。
ナビゲーション修飾子置換
.../FieldSettingView.swift, .../FloorMapView.swift, .../PairingSettingView.swift, .../SensingManagementView.swift, .../SensingView.swift, .../TrajectoryView.swift, .../SettingsView.swift
既存の .navigationBarTitleDisplayMode(...) 呼び出しを .navigationBarTitleDisplayModeIfAvailable(...) に統一。プラットフォーム条件を削除。
AntennaPositioning UI / フロー
UWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningView.swift
FloatingDeviceListPanel のシグネチャに @Binding var showingAddDeviceAlert: Bool を追加。デバイス追加アラートやキャリブレーション結果シートを導入。
ビューモデル拡張
UWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningViewModel.swift
showCalibrationResultcalibrationResultDataCalibrationResultData 構造体、hasCalibrationDatashowCalibrationResultVisualization() を追加し、可視化用データを生成・公開。
テスト
UWBViewerSystemTests/SensorDataProcessorTests.swift
SensorDataProcessor 用のユニットテスト群を新規追加(トリミング、移動平均、NLOS フィルタ、統計、統合パイプラインなど)。
プロジェクト設定 / Info.plist 変更
UWBViewerSystem.xcodeproj/project.pbxproj, UWBViewerSystem/Info.plist
Xcode プロジェクトの署名・バンドルID・使用説明の設定変更と、Info.plist のいくつかの利用キー削除(構成変更)。

シーケンス図

sequenceDiagram
    autonumber
    participant User as ユーザー
    participant UI as AntennaPositioningView
    participant VM as AntennaPositioningViewModel
    participant Usecase as AutoAntennaCalibrationUsecase
    participant Processor as SensorDataProcessor
    participant Viz as CalibrationResultVisualizationView

    User->>UI: キャリブレーション開始操作
    UI->>VM: showCalibrationResultVisualization()
    VM->>Usecase: collectDataFromSession(sessionId, tagId, applyPreprocessing:true)
    Usecase->>Usecase: 観測をアンテナ/タグでグループ化し生観測を保存
    alt applyPreprocessing == true
        Usecase->>Processor: processObservations(observations)
        Processor->>Processor: トリミング / NLOS フィルタ / 移動平均
        Processor-->>Usecase: 処理済観測 + ProcessingStatistics
    else
        Usecase-->>Usecase: 生観測をそのまま使用、統計は未加工として記録
    end
    Usecase->>VM: キャリブレーション用観測と統計を返却
    VM->>VM: CalibrationResultData を構築
    VM-->>UI: showCalibrationResult = true, calibrationResultData
    UI->>Viz: 可視化ビュー表示(タグ/初期/較正アンテナ位置・矢印)
    Viz->>User: 2D ビジュアライゼーションを描画
Loading

推定レビュー実施量

🎯 4 (複雑) | ⏱️ ~60 分

  • 注力箇所:
    • SensorDataProcessor.swift — トリム/NLOS/moving-average の結合ロジック、境界条件、統計計算(標準偏差)検証
    • AutoAntennaCalibrationUsecase.swift — 非同期フローへの統合、アンテナ/タグ毎のデータ構造整合性、API 変更点(初期化・collectDataFromSession)
    • CalibrationResultVisualizationView.swift / AntennaPositioningViewModel.swift — 座標変換と表示整合性(real→画面)、描画順序・パフォーマンス
    • テスト (SensorDataProcessorTests.swift) — テストケースの網羅性と期待値の妥当性

関連するプルリクエスト

  • Feature/calibration improvements #36 — AutoAntennaCalibrationUsecase に関連する変更が含まれており、データ収集/キャリブレーション統合点の競合や設計差異に直接関係。
  • Revert "Feature/calibration improvements" #37 — キャリブレーション改善の差分を取り扱った PR。前処理導入やロールバックの可能性をコードレベルで確認する必要あり。
  • Feature/carib new #38 — SensorDataProcessor や処理統計を共有する変更を含むため、実装重複や API 互換性を照合するべき PR。

🐰 新しい朝、ウサギの祝辞

データをひろって、シャキッと磨き、
アンテナはぴたり、地図に舞う。
CSV 読んで、ビューで見せて、
前処理の魔法で統計もにっこり。
小さな足跡で、大きな改善 🥕✨

Pre-merge checks and finishing touches

✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed プルリクエストのタイトル「キャリブレーション機能の作成」は、変更セットの主要な内容(キャリブレーション関連の機能追加)を正確に反映しており、簡潔で明確です。
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feature/caribration-check

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
UWBViewerSystem/Domain/Usecase/AutoAntennaCalibrationUsecase.swift (1)

312-321: 新しい状態もクリアしないと古い統計が残ります

clearData()clearData(for:)measuredDataByAntennacalibrationResults しか初期化しておらず、今回追加された rawObservationsByAntennaprocessingStatistics が残り続けてしまいます。この状態で再度キャリブレーションを走らせると、getProcessingStatistics() などが過去の統計値を返してしまい、扱うデータが不整合になります。新しい state も同時にクリアしてください。

 func clearData() {
     self.measuredDataByAntenna.removeAll()
     self.calibrationResults.removeAll()
+    self.rawObservationsByAntenna.removeAll()
+    self.processingStatistics.removeAll()
     print("🧹 キャリブレーションデータをクリアしました")
 }

 func clearData(for antennaId: String) {
     self.measuredDataByAntenna.removeValue(forKey: antennaId)
     self.calibrationResults.removeValue(forKey: antennaId)
+    self.rawObservationsByAntenna.removeValue(forKey: antennaId)
+    self.processingStatistics.removeValue(forKey: antennaId)
     print("🧹 \(antennaId) のデータをクリアしました")
 }
🧹 Nitpick comments (2)
UWBViewerSystem/Presentation/Components/View+NavigationBarTitleDisplayMode.swift (1)

1-30: LGTM! プラットフォーム条件付きナビゲーションヘルパーの実装が優れています。

このヘルパーにより、プラットフォーム固有のコードが効果的に抽象化され、コードベース全体で一貫性が保たれています。実装は明確で保守性が高いです。

オプション: コメントの明確化

より正確な説明にするため、以下の修正を検討してください:

-// iOS用のenum値を列挙型で定義
+// ナビゲーションバーのタイトル表示モードを表す列挙型(iOS用の値をラップ)
 enum NavigationBarTitleDisplayModeWrapper {
     case large
     case inline
     case automatic
 }

 extension View {
-    /// iOS専用のnavigationBarTitleDisplayModeを条件付きで適用する
-    /// macOSでは何もしない
+    /// プラットフォームに応じてナビゲーションバーのタイトル表示モードを適用
+    /// - iOS: 指定されたdisplayModeを適用
+    /// - その他のプラットフォーム: 何も変更しない
     @ViewBuilder
     func navigationBarTitleDisplayModeIfAvailable(
UWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningView.swift (1)

4-10: オプション: ドキュメントコメントの簡素化を検討してください。

コーディングガイドラインでは「コメントは必要最小限に留める(自己文書化を優先)」とされています。現在のドキュメントコメントは非常に詳細ですが、多くの情報はコードから明らかです。重要な部分(なぜその実装を選択したか、注意点など)にフォーカスすることを検討してください。

例:

-/// アンテナ位置設定画面
-///
-/// フロアマップ上でアンテナデバイスの位置と向きを設定するための画面です。
-/// - フローティングパネルでデバイスの追加・削除・管理
-/// - ドラッグ&ドロップでアンテナの配置
-/// - ダブルタップでアンテナの回転
-/// - キャリブレーション結果の可視化
+/// アンテナ位置設定画面
+/// ドラッグ&ドロップとダブルタップでアンテナの配置と回転を設定
 struct AntennaPositioningView: View {

コーディングガイドラインより

Also applies to: 153-159, 207-212, 266-273, 386-393, 525-531, 645-652

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d92164e and fa6d174.

📒 Files selected for processing (15)
  • UWBViewerSystem/Domain/Usecase/AutoAntennaCalibrationUsecase.swift (5 hunks)
  • UWBViewerSystem/Domain/Utils/CalibrationCSVLoader.swift (1 hunks)
  • UWBViewerSystem/Domain/Utils/SensorDataProcessor.swift (1 hunks)
  • UWBViewerSystem/Presentation/Components/CalibrationResultVisualizationView.swift (1 hunks)
  • UWBViewerSystem/Presentation/Components/View+NavigationBarTitleDisplayMode.swift (1 hunks)
  • UWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningView.swift (19 hunks)
  • UWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningViewModel.swift (3 hunks)
  • UWBViewerSystem/Presentation/Scenes/FloorMapTab/FieldSettingPage/FieldSettingView.swift (3 hunks)
  • UWBViewerSystem/Presentation/Scenes/FloorMapTab/FloorMapView.swift (1 hunks)
  • UWBViewerSystem/Presentation/Scenes/FloorMapTab/PairingSettingPage/PairingSettingView.swift (1 hunks)
  • UWBViewerSystem/Presentation/Scenes/SensingTab/SensingManagementPage/SensingManagementView.swift (1 hunks)
  • UWBViewerSystem/Presentation/Scenes/SensingTab/SensingView.swift (1 hunks)
  • UWBViewerSystem/Presentation/Scenes/SensingTab/TrajectoryViewPage/TrajectoryView.swift (1 hunks)
  • UWBViewerSystem/Presentation/Scenes/SettingsTab/SettingsView.swift (1 hunks)
  • UWBViewerSystemTests/SensorDataProcessorTests.swift (1 hunks)
🧰 Additional context used
📓 Path-based instructions (4)
**/*.swift

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.swift: SwiftFormat(swift-format)ルールに従い、make formatでコード整形を行う
デバッグ用コードやコメントアウトされた古いコードなどの不要なコードは削除する
不要なimport文は削除する
デッドコードは削除し、コメントは必要最小限に留める(自己文書化を優先)

Files:

  • UWBViewerSystem/Presentation/Components/View+NavigationBarTitleDisplayMode.swift
  • UWBViewerSystem/Presentation/Scenes/FloorMapTab/PairingSettingPage/PairingSettingView.swift
  • UWBViewerSystem/Presentation/Scenes/SensingTab/TrajectoryViewPage/TrajectoryView.swift
  • UWBViewerSystem/Presentation/Scenes/SettingsTab/SettingsView.swift
  • UWBViewerSystem/Presentation/Scenes/SensingTab/SensingManagementPage/SensingManagementView.swift
  • UWBViewerSystem/Presentation/Scenes/FloorMapTab/FieldSettingPage/FieldSettingView.swift
  • UWBViewerSystem/Presentation/Scenes/SensingTab/SensingView.swift
  • UWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningViewModel.swift
  • UWBViewerSystem/Domain/Utils/SensorDataProcessor.swift
  • UWBViewerSystem/Presentation/Scenes/FloorMapTab/FloorMapView.swift
  • UWBViewerSystem/Presentation/Components/CalibrationResultVisualizationView.swift
  • UWBViewerSystem/Domain/Utils/CalibrationCSVLoader.swift
  • UWBViewerSystemTests/SensorDataProcessorTests.swift
  • UWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningView.swift
  • UWBViewerSystem/Domain/Usecase/AutoAntennaCalibrationUsecase.swift
**/*View.swift

📄 CodeRabbit inference engine (CLAUDE.md)

Viewのファイル名は「〜View.swift」とする

Files:

  • UWBViewerSystem/Presentation/Scenes/FloorMapTab/PairingSettingPage/PairingSettingView.swift
  • UWBViewerSystem/Presentation/Scenes/SensingTab/TrajectoryViewPage/TrajectoryView.swift
  • UWBViewerSystem/Presentation/Scenes/SettingsTab/SettingsView.swift
  • UWBViewerSystem/Presentation/Scenes/SensingTab/SensingManagementPage/SensingManagementView.swift
  • UWBViewerSystem/Presentation/Scenes/FloorMapTab/FieldSettingPage/FieldSettingView.swift
  • UWBViewerSystem/Presentation/Scenes/SensingTab/SensingView.swift
  • UWBViewerSystem/Presentation/Scenes/FloorMapTab/FloorMapView.swift
  • UWBViewerSystem/Presentation/Components/CalibrationResultVisualizationView.swift
  • UWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningView.swift
**/*ViewModel.swift

📄 CodeRabbit inference engine (CLAUDE.md)

ViewModelのファイル名は「〜ViewModel.swift」とする

Files:

  • UWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningViewModel.swift
**/*Usecase.swift

📄 CodeRabbit inference engine (CLAUDE.md)

Usecaseのファイル名は「〜Usecase.swift」とする

Files:

  • UWBViewerSystem/Domain/Usecase/AutoAntennaCalibrationUsecase.swift
🧠 Learnings (4)
📚 Learning: 2025-09-23T15:18:09.790Z
Learnt from: CR
Repo: kajiLabTeam/UWBViewerSystem PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-09-23T15:18:09.790Z
Learning: Applies to **/*View.swift : Viewのファイル名は「〜View.swift」とする

Applied to files:

  • UWBViewerSystem/Presentation/Components/View+NavigationBarTitleDisplayMode.swift
  • UWBViewerSystem/Presentation/Scenes/SensingTab/TrajectoryViewPage/TrajectoryView.swift
  • UWBViewerSystem/Presentation/Scenes/SensingTab/SensingManagementPage/SensingManagementView.swift
📚 Learning: 2025-09-23T15:18:09.790Z
Learnt from: CR
Repo: kajiLabTeam/UWBViewerSystem PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-09-23T15:18:09.790Z
Learning: ViewModelはPublished/StateObjectでViewと双方向バインディングする

Applied to files:

  • UWBViewerSystem/Presentation/Components/View+NavigationBarTitleDisplayMode.swift
  • UWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningViewModel.swift
  • UWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningView.swift
📚 Learning: 2025-09-23T15:18:09.790Z
Learnt from: CR
Repo: kajiLabTeam/UWBViewerSystem PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-09-23T15:18:09.790Z
Learning: Clean Architecture + MVVMを採用する(データフロー: View→ViewModel→Usecase→Repository)

Applied to files:

  • UWBViewerSystem/Presentation/Scenes/SensingTab/SensingManagementPage/SensingManagementView.swift
📚 Learning: 2025-09-23T15:18:09.790Z
Learnt from: CR
Repo: kajiLabTeam/UWBViewerSystem PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-09-23T15:18:09.790Z
Learning: Applies to Devices/**/*.swift : UWBデバイス関連の通信・制御ロジックはDevices/配下に配置する

Applied to files:

  • UWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningView.swift
🧬 Code graph analysis (11)
UWBViewerSystem/Presentation/Scenes/FloorMapTab/PairingSettingPage/PairingSettingView.swift (3)
UWBViewerSystem/Presentation/Components/View+NavigationBarTitleDisplayMode.swift (1)
  • navigationBarTitleDisplayModeIfAvailable (13-29)
UWBViewerSystem/Presentation/Scenes/FloorMapTab/PairingSettingPage/PairingSettingViewModel.swift (1)
  • setSwiftDataRepository (69-74)
UWBViewerSystem/Presentation/Router/SensingFlowNavigator.swift (1)
  • setRouter (32-34)
UWBViewerSystem/Presentation/Scenes/SensingTab/TrajectoryViewPage/TrajectoryView.swift (2)
UWBViewerSystem/Presentation/Components/View+NavigationBarTitleDisplayMode.swift (1)
  • navigationBarTitleDisplayModeIfAvailable (13-29)
UWBViewerSystem/Presentation/Scenes/SensingTab/TrajectoryViewPage/TrajectoryViewModel.swift (1)
  • initialize (92-101)
UWBViewerSystem/Presentation/Scenes/SettingsTab/SettingsView.swift (1)
UWBViewerSystem/Presentation/Components/View+NavigationBarTitleDisplayMode.swift (1)
  • navigationBarTitleDisplayModeIfAvailable (13-29)
UWBViewerSystem/Presentation/Scenes/SensingTab/SensingManagementPage/SensingManagementView.swift (3)
UWBViewerSystem/Presentation/Components/View+NavigationBarTitleDisplayMode.swift (1)
  • navigationBarTitleDisplayModeIfAvailable (13-29)
UWBViewerSystem/Presentation/Scenes/SensingTab/SensingManagementPage/SensingManagementViewModel.swift (2)
  • setSwiftDataRepository (45-48)
  • initialize (62-66)
UWBViewerSystem/Presentation/Router/SensingFlowNavigator.swift (1)
  • setRouter (32-34)
UWBViewerSystem/Presentation/Scenes/FloorMapTab/FieldSettingPage/FieldSettingView.swift (2)
UWBViewerSystem/Presentation/Components/View+NavigationBarTitleDisplayMode.swift (1)
  • navigationBarTitleDisplayModeIfAvailable (13-29)
UWBViewerSystem/Presentation/Scenes/FloorMapTab/FieldSettingPage/FieldSettingViewModel.swift (1)
  • addAntenna (113-116)
UWBViewerSystem/Presentation/Scenes/SensingTab/SensingView.swift (1)
UWBViewerSystem/Presentation/Components/View+NavigationBarTitleDisplayMode.swift (1)
  • navigationBarTitleDisplayModeIfAvailable (13-29)
UWBViewerSystem/Presentation/Scenes/FloorMapTab/FloorMapView.swift (1)
UWBViewerSystem/Presentation/Components/View+NavigationBarTitleDisplayMode.swift (1)
  • navigationBarTitleDisplayModeIfAvailable (13-29)
UWBViewerSystem/Presentation/Components/CalibrationResultVisualizationView.swift (1)
UWBViewerSystem/Presentation/Scenes/FloorMapTab/FieldSettingPage/FieldSettingView.swift (1)
  • gridBackground (109-132)
UWBViewerSystemTests/SensorDataProcessorTests.swift (1)
UWBViewerSystem/Domain/Utils/SensorDataProcessor.swift (4)
  • filterNLOS (120-122)
  • processObservations (60-71)
  • calculateStatistics (192-211)
  • applyMovingAverageToPoints (76-96)
UWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningView.swift (3)
UWBViewerSystem/Presentation/Components/View+NavigationBarTitleDisplayMode.swift (1)
  • navigationBarTitleDisplayModeIfAvailable (13-29)
UWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningViewModel.swift (4)
  • setModelContext (102-110)
  • loadMapAndDevices (155-165)
  • addNewDevice (547-572)
  • showCalibrationResultVisualization (935-999)
UWBViewerSystem/Presentation/Router/SensingFlowNavigator.swift (1)
  • setRouter (32-34)
UWBViewerSystem/Domain/Usecase/AutoAntennaCalibrationUsecase.swift (1)
UWBViewerSystem/Domain/Utils/SensorDataProcessor.swift (2)
  • processObservations (60-71)
  • calculateStatistics (192-211)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Run Swift Tests
🔇 Additional comments (9)
UWBViewerSystem/Presentation/Scenes/FloorMapTab/PairingSettingPage/PairingSettingView.swift (1)

73-87: LGTM! 統一されたナビゲーション修飾子への移行が適切です。

新しい navigationBarTitleDisplayModeIfAvailable ヘルパーの使用により、プラットフォーム固有のコードが適切に抽象化されています。alertonAppear の適用も、SwiftUI のクロスプラットフォーム対応により問題ありません。

UWBViewerSystem/Presentation/Scenes/SensingTab/SensingManagementPage/SensingManagementView.swift (1)

35-48: LGTM! プラットフォーム非依存のナビゲーション処理への移行が完了しています。

新しいヘルパーの使用により、コードの保守性が向上しています。フォーマットの調整も適切です。

UWBViewerSystem/Presentation/Scenes/SensingTab/TrajectoryViewPage/TrajectoryView.swift (1)

22-30: LGTM! ナビゲーション修飾子の統一が適切に実装されています。

他のビューファイルと一貫性のある変更で、問題ありません。

UWBViewerSystem/Presentation/Scenes/FloorMapTab/FieldSettingPage/FieldSettingView.swift (1)

362-363: LGTM! シート内のナビゲーション修飾子が統一されています。

AddAntennaSheetSimpleAddAntennaSheetEditAntennaSheet のすべてで新しいヘルパーが一貫して使用されており、ツールバーの構造も適切に整理されています。アンテナ作成ロジックは保持されています。

Also applies to: 499-523, 552-553

UWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningView.swift (2)

30-35: LGTM! デバイス追加フローとキャリブレーション可視化の統合が適切です。

新しいデバイス追加アラートとキャリブレーション結果シートの実装は、適切に構造化されており、ユーザーエクスペリエンスを向上させています。状態管理とバインディングの流れも正確です。

Also applies to: 106-147


51-53: FloatingDeviceListPanel のシグネチャ変更は正しく実装されています。

検証結果:

  • FloatingDeviceListPanel の使用箇所はAntennaPositioningView.swift内の1箇所のみ
  • 新しい showingAddDeviceAlert バインディングパラメータが正しく追加され、呼び出し箇所で正しく渡されている
  • コンポーネント定義で新しいバインディング(539-541行)が正しく定義されている
  • コンポーネント内での実装(614-616行付近)で新しいバインディングが正しく使用されている

すべての変更が一貫性を持って実装されており、他に更新すべき箇所はありません。

UWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningViewModel.swift (2)

18-27: LGTM! キャリブレーション可視化のための状態管理が適切に追加されています。

CalibrationResultData 構造体は、タグ位置と初期/キャリブレーション後のアンテナ位置を保持するための明確な設計となっています。hasCalibrationData 計算プロパティも適切です。

Also applies to: 71-74


933-999: LGTM! キャリブレーション結果の可視化ロジックが正確に実装されています。

座標変換(正規化座標から実世界座標への変換)が正しく処理されており、Y軸の反転(1.0 - y)も適切に考慮されています。デフォルト位置の処理(フロアマップの中央に配置)も合理的です。

UWBViewerSystemTests/SensorDataProcessorTests.swift (1)

1-298: LGTM! SensorDataProcessor の包括的なテストスイートが実装されています。

テストカバレッジは優れており、以下の項目が適切にカバーされています:

  • トリミング(通常ケースとデータ不足のエッジケース)
  • 移動平均(通常ケースと大きなウィンドウサイズのエッジケース)
  • nLoS フィルタリング(有効/無効の両方)
  • 統計情報の計算
  • エンドツーエンドの処理パイプライン

テストデータの生成も現実的で、アサーションも明確です。

harutiro and others added 2 commits November 4, 2025 03:04
- CalibrationCSVLoader.swift: angleColumnIndexの境界チェックを追加し、配列アクセス前の検証を強化
- CalibrationResultVisualizationView.swift: calculateScale()の縦横比計算を修正し、要素がキャンバス外にレンダリングされる問題を解決

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (5)
UWBViewerSystem/Presentation/Components/CalibrationResultVisualizationView.swift (4)

3-10: ドキュメントコメントを簡潔にすることを検討してください

コーディングガイドラインではコメントは必要最小限に留め、自己文書化を優先することが推奨されています。現在のドキュメントコメントは詳細すぎる可能性があります。構造体名とプロパティ名から機能が明確であれば、コメントを簡略化できます。

以下のように簡潔にすることを検討してください:

-/// キャリブレーション結果を可視化するビューコンポーネント
-///
-/// Pythonの`visualize_calibration_result`関数と同等の機能を提供します。
-/// - タグの既知位置を青色のマーカーで表示
-/// - 初期アンテナ位置をオレンジ色の三角形で表示
-/// - キャリブレーション後のアンテナ位置を赤色の三角形で表示
-/// - アンテナの向きを矢印で表示
-/// - 初期位置からの移動を灰色の点線矢印で表示
+/// キャリブレーション結果を2D空間で可視化
 struct CalibrationResultVisualizationView: View {

As per coding guidelines


57-74: 冗長な境界チェックを削除できます

zipは既に短い方の配列の長さまでしか要素を返さないため、63-64行目の境界チェックは冗長です。zipの結果を反復処理する際、インデックスは常に両方の配列の範囲内にあることが保証されています。

以下のように簡略化できます:

                 if self.showInitialPositions {
                     ForEach(
                         Array(
                             zip(self.initialAntennaPositions.indices, self.calibratedAntennaPositions.indices)
                         ),
                         id: \.0
                     ) { initialIndex, calibratedIndex in
-                        if initialIndex < self.initialAntennaPositions.count
-                            && calibratedIndex < self.calibratedAntennaPositions.count
-                        {
-                            self.movementArrow(
-                                from: self.initialAntennaPositions[initialIndex],
-                                to: self.calibratedAntennaPositions[calibratedIndex],
-                                scale: scale,
-                                size: size
-                            )
-                        }
+                        self.movementArrow(
+                            from: self.initialAntennaPositions[initialIndex],
+                            to: self.calibratedAntennaPositions[calibratedIndex],
+                            scale: scale,
+                            size: size
+                        )
                     }
                 }

88-110: グリッド背景の重複を検討してください

FieldSettingView.swiftにも類似のグリッド背景実装があります。共通コンポーネントとして抽出することで、コードの重複を削減し、保守性を向上できます。

ただし、実装の詳細(ピクセルベース vs 分割ベース)が異なるため、現状のままでも問題ありません。


162-162: ラベルオフセットの定数化を検討してください

マジックナンバー(2, 3)を使用したオフセット計算が複数箇所にあります。定数として抽出することで可読性と保守性が向上します。

例:

private let tagLabelOffsetX: CGFloat = 1.0  // markerSize の倍数
private let tagLabelOffsetY: CGFloat = 1.0
private let initialAntennaLabelOffsetX: CGFloat = -3.0  // antennaSize の倍数
private let initialAntennaLabelOffsetY: CGFloat = -2.0
private let calibratedAntennaLabelOffsetX: CGFloat = 2.0
private let calibratedAntennaLabelOffsetY: CGFloat = -1.0

そして使用箇所で:

.offset(x: self.markerSize * self.tagLabelOffsetX, y: self.markerSize * self.tagLabelOffsetY)

Also applies to: 207-207, 255-255

UWBViewerSystem.xcodeproj/project.pbxproj (1)

421-424: プライバシー説明文をより具体的にすることを推奨します。

Bluetooth、ローカルネットワーク、および位置情報の使用許可説明が追加されていますが、説明文がやや一般的です。ユーザーがなぜこれらの権限が必要なのかを理解しやすくするため、より具体的な説明を検討してください。

例:

  • NSBluetoothAlwaysUsageDescription: "UWB通信により近くのデバイスとの距離測定を行うために使用します"
  • NSLocalNetworkUsageDescription: "ローカルネットワーク上のUWBデバイスと通信するために使用します"
  • NSLocationWhenInUseUsageDescription: "UWBによる位置測定機能を利用するために使用します"

現在の実装でも機能しますが、より詳細な説明はユーザーエクスペリエンスを向上させます。

Also applies to: 456-459

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between fa6d174 and 3d7f381.

📒 Files selected for processing (4)
  • UWBViewerSystem.xcodeproj/project.pbxproj (2 hunks)
  • UWBViewerSystem/Domain/Utils/CalibrationCSVLoader.swift (1 hunks)
  • UWBViewerSystem/Info.plist (0 hunks)
  • UWBViewerSystem/Presentation/Components/CalibrationResultVisualizationView.swift (1 hunks)
💤 Files with no reviewable changes (1)
  • UWBViewerSystem/Info.plist
🚧 Files skipped from review as they are similar to previous changes (1)
  • UWBViewerSystem/Domain/Utils/CalibrationCSVLoader.swift
🧰 Additional context used
📓 Path-based instructions (2)
**/*.swift

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.swift: SwiftFormat(swift-format)ルールに従い、make formatでコード整形を行う
デバッグ用コードやコメントアウトされた古いコードなどの不要なコードは削除する
不要なimport文は削除する
デッドコードは削除し、コメントは必要最小限に留める(自己文書化を優先)

Files:

  • UWBViewerSystem/Presentation/Components/CalibrationResultVisualizationView.swift
**/*View.swift

📄 CodeRabbit inference engine (CLAUDE.md)

Viewのファイル名は「〜View.swift」とする

Files:

  • UWBViewerSystem/Presentation/Components/CalibrationResultVisualizationView.swift
🧬 Code graph analysis (1)
UWBViewerSystem/Presentation/Components/CalibrationResultVisualizationView.swift (1)
UWBViewerSystem/Presentation/Scenes/FloorMapTab/FieldSettingPage/FieldSettingView.swift (1)
  • gridBackground (109-132)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Run Swift Tests
🔇 Additional comments (4)
UWBViewerSystem/Presentation/Components/CalibrationResultVisualizationView.swift (3)

315-325: スケール計算が正しく修正されています

過去のレビューコメントで指摘されたスケール計算の問題が適切に修正されています。現在の実装は:

  • 幅と高さの両方のスケールを計算
  • より制約の厳しい軸(最大値)を採用して縦横比を保持
  • ゼロ除算を防ぐガード句を実装

これにより、要素が画面外にはみ出す問題が解決されています。


340-364: サポート型の実装が適切です

TagPositionAntennaCalibrationPositionTriangleの実装は明確で、必要なプロトコルに準拠しています。構造が簡潔で、各型の責務が明確です。


368-414: プレビュー実装が適切です

プレビューには適切なサンプルデータが含まれており、開発時の動作確認に役立ちます。初期位置とキャリブレーション後の位置の両方を表示することで、ビューの全機能を確認できます。

UWBViewerSystem.xcodeproj/project.pbxproj (1)

431-431: バンドル識別子の変更理由を説明してください。

バンドル識別子がnet.harutiro.UWBViewerSystemからnet.harutiro.UWBViewerSystem3に変更されています(行431および466、Debug・Release両構成)。

このバンドル識別子の変更により以下の影響が生じます:

  • 既存のアプリケーションデータやインストールとの互換性が失われる
  • プロビジョニングプロファイルやApp Store Connectの設定が無効になる可能性がある
  • 「3」というサフィックスの追加理由が明確でない

このバンドル識別子の変更がプルリクエストの意図に沿ったものであるか、またはその必要性について確認が必要です。キャリブレーション機能の追加とは無関係に見えるため、この変更の目的を明確にしてください。

COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = HK6A3CR45M;
DEVELOPMENT_TEAM = 8V93G3Y2W5;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

開発チームIDの不整合を修正してください。

メインターゲット(UWBViewerSystem)の開発チームIDが8V93G3Y2W5に変更されていますが、プロジェクトレベルの設定(Line 322, 386)とテストターゲット(Lines 483, 501, 518, 534)ではまだHK6A3CR45Mのままです。この不整合により、コード署名やプロビジョニングプロファイルの問題が発生する可能性があります。

すべてのターゲットで同じ開発チームIDを使用することを推奨します。

以下のスクリプトを実行して、すべてのDEVELOPMENT_TEAM設定を確認してください:

Also applies to: 451-451


🏁 Script executed:

#!/bin/bash
# Description: すべてのDEVELOPMENT_TEAM設定を確認する

rg -n 'DEVELOPMENT_TEAM = ' UWBViewerSystem.xcodeproj/project.pbxproj

Length of output: 311


開発チームIDの不整合を修正してください。

メインターゲット(UWBViewerSystem)の開発チームIDが8V93G3Y2W5に変更されていますが、プロジェクトレベル(行322, 386)とテストターゲット(行483, 501, 518, 534)ではHK6A3CR45Mのままです。この不整合はコード署名に失敗したり、テスト実行時にプロビジョニングプロファイルエラーを引き起こす可能性があります。

すべてのターゲットで同じ開発チームIDを統一することが必須です。

@harutiro harutiro merged commit 8a78f86 into main Nov 3, 2025
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants