Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 50 additions & 30 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
# CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
<!-- 句点は他の文書と同じく「。」で統一している. -->
<!-- textlint-disable ja-technical-writing/ja-no-mixed-period -->

本ファイルは、このリポジトリのコードを扱う Claude Code(claude.ai/code)への指針を示す。

## プロジェクト概要

PHPでマイコンとのシリアル通信を行うクロスプラットフォームライブラリ。
PySerialやRuby serialportのような使い勝手を目指す。
Windows、Mac、Linuxで動作し、PHP 8.5に対応。
PHP でマイコンとシリアル通信するクロスプラットフォームライブラリ。
PySerial や Ruby serialport のような使い勝手を目指す。
Windows、Mac、Linux で動作し、PHP 8.5 に対応。

## 技術スタック

Expand All @@ -17,7 +20,7 @@ Windows、Mac、Linuxで動作し、PHP 8.5に対応。

## プロジェクト構造

```
```text
php-serial/
├── src/PhpSerial/ # メインライブラリコード
│ ├── SerialPort.php # シリアルポート通信のメインクラス
Expand All @@ -36,25 +39,29 @@ php-serial/
## アーキテクチャ設計

### 実装方針
1. **Pure PHP実装**: PHP標準機能とFFIでシリアルポート制御
2. **プラットフォーム抽象化**: Platform配下で各OS固有の処理を分離
3. **Windows FFI**: Windows APIを直接呼び出して正確なボーレート制御

1. **Pure PHP実装**: PHP 標準機能と FFI でシリアルポート制御
2. **プラットフォーム抽象化**: Platform 配下で各 OS 固有の処理を分離
3. **Windows FFI**: Windows API を直接呼び出して正確なボーレート制御

### クラス設計
- `SerialPort`: ユーザー向けAPI。open/close/read/writeを提供

- `SerialPort`: ユーザー向け API。open/close/read/write を提供
- `Configuration`: ボーレート、データビット、パリティ、ストップビットを管理
- `Platform\Unix`: Linux/macOS向け、sttyコマンドを使用
- `Platform\Windows`: Windows向け、fopenベース(FFI無効時のフォールバック)
- `Platform\WindowsFFI`: Windows向け、FFI + Windows API(推奨)
- `Platform\Unix`: Linux/macOS 向け、stty コマンドを使用
- `Platform\Windows`: Windows 向け、fopen ベース(FFI 無効時のフォールバック)
- `Platform\WindowsFFI`: Windows 向け、FFI + Windows API(推奨)

## 開発コマンド

### 依存関係のインストール

```bash
composer install
```

### テスト実行

```bash
# 全テスト実行
composer test
Expand All @@ -67,6 +74,7 @@ composer test:coverage
```

### コーディングスタイルチェック

```bash
composer cs:check
composer cs:fix
Expand All @@ -75,68 +83,80 @@ composer cs:fix
## テスト戦略

### ユニットテスト

- 設定クラスのバリデーション
- プラットフォーム検出ロジック
- コマンド生成ロジック

### モックテスト

- 実際のシリアルポートなしでテスト可能にする
- システムコマンド実行部分をモック化

### 統合テスト (任意)

- 実際のシリアルデバイスを使用したテスト
- CIでは実行不可のためローカル環境のみ
- CI では実行不可のためローカル環境のみ

## 重要な実装上の注意

### 環境
- PHP 8.5とComposerがインストール済み

- PHP 8.5 と Composer がインストール済み
- 初期セットアップ時は依存関係が未インストールの状態を想定

### ファイルハンドル管理
- `fopen()`でデバイスファイルを開く

- `fopen()` でデバイスファイルを開く
- ブロッキング/ノンブロッキングモードの制御
- 確実な`fclose()`実行(デストラクタでも保証)
- 確実な `fclose()` 実行(デストラクタでも保証)

### プラットフォーム判定
- `PHP_OS_FAMILY`定数を使用(Windows/Linux/Darwin)

- `PHP_OS_FAMILY` 定数を使用(Windows/Linux/Darwin)
- 各プラットフォームで異なるデバイスパス
- Linux/Mac: `/dev/ttyUSB0`, `/dev/tty.usbserial-*`
- Windows: `COM1`, `COM2`等
- Windows: `COM1`, `COM2` 等

### エラーハンドリング

- デバイスが見つからない場合は例外をスロー
- 設定値の範囲外チェック
- ポートが開いていない状態での操作を防ぐ

### PHP 8.5固有機能の活用

- Named Arguments
- Constructor Property Promotion
- Match式
- Union Types、Nullsafe演算子
- PHP 8.5の新機能も積極的に活用
- FFI(Foreign Function Interface): Windows APIの直接呼び出し
- Match 式
- Union Types、Nullsafe 演算子
- PHP 8.5 の新機能も積極的に活用
- FFI(Foreign Function Interface): Windows API の直接呼び出し

### Windows FFI の重要性
- Windows環境でボーレートを正確に設定するには FFI が必須

- Windows 環境でボーレートを正確に設定するには FFI が必須
- `php.ini` で `extension=ffi` と `ffi.enable=true` を設定
- FFI 無効時は従来の Windows クラスにフォールバック(機能制限あり)
- 詳細は `docs/WINDOWS_FFI_SETUP.md` を参照

## 参考にした既存実装

- **Xowap/PHP-Serial**: 元祖PHP Serial、設計思想を参考
- **sanchescom/php-serial**: PHP 7リファクタ版、モダンな実装
- **PySerial**: Python実装、APIデザインの参考
- **Xowap/PHP-Serial**: 元祖 PHP Serial、設計思想を参考
- **sanchescom/php-serial**: PHP 7 リファクタ版、モダンな実装
- **PySerial**: Python 実装、API デザインの参考

## ドキュメントの文体

- `README.md` と `docs/` は利用者向けの手引きのため「ですます調」・句点「。」で書く.textlint の該当ルールはファイル先頭のコメントで無効化する.
- Markdown の句読点は「、。」で統一する。
- 利用者・開発者向けの手引き(`README.md`、`docs/`、`CONTRIBUTING.md`、`examples/**/README.md`)は「ですます調」で書く。
- 規律やガイドライン(`CLAUDE.md`、`PHPDEV.md`)は「である調」で書く。
- 中央テンプレの textlint は「である調」と句点「.」を求める。上記と食い違うルールは、各ファイル先頭のコメントで無効化する。

## 開発の進め方

1. 最小限の機能で動作させる(open/close/read/write)
2. Windows環境で先行実装・テスト(開発環境)
3. Linux、macOSへの対応を追加
2. Windows 環境で先行実装・テスト(開発環境)
3. Linux、macOS への対応を追加
4. エラーハンドリングの充実
5. パフォーマンス改善(必要に応じてC拡張検討)
5. パフォーマンス改善(必要に応じて C 拡張検討)
44 changes: 25 additions & 19 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,17 +1,23 @@
# 開発ガイド

<!-- 本ファイルは開発者向けの手引きのため「ですます調」で書く.句点は他の文書と同じく「。」で統一している. -->
<!-- textlint-disable ja-technical-writing/no-mix-dearu-desumasu, ja-technical-writing/ja-no-mixed-period -->

## 目次

- [開発環境のセットアップ](#開発環境のセットアップ)
- [品質確認手順](#品質確認手順)
- [テストの実行](#テストの実行)
- [PSR 準拠](#psr-準拠)
- [コミット前の確認](#コミット前の確認)
- [GitHub Actions](#github-actions)
- [コントリビューション](#コントリビューション)
- [トラブルシューティング](#トラブルシューティング)

## 開発環境のセットアップ

### 必要な環境

- PHP 8.1以上
- PHP 8.1 以上
- Composer
- Git

Expand All @@ -35,7 +41,7 @@ composer qa

このコマンドは以下を順番に実行します。

1. PHP_CodeSniffer (PSR-12準拠チェック)
1. PHP_CodeSniffer (PSR-12 準拠チェック)
2. PHP-CS-Fixer (コードスタイルチェック)
3. PHPStan (静的解析)
4. PHPUnit (テスト)
Expand Down Expand Up @@ -72,7 +78,7 @@ composer cs:fixer:fix

#### 3. 静的解析 (PHPStan)

型安全性とバグのチェック (レベル8):
型安全性とバグのチェック (レベル 8):

```bash
composer stan
Expand All @@ -90,9 +96,9 @@ composer test
composer test:coverage
```

## PSR準拠
## PSR 準拠

このプロジェクトは以下のPSRに準拠しています。
このプロジェクトは以下の PSR に準拠しています。

### PSR-4 (オートロード)

Expand All @@ -104,7 +110,7 @@ composer validate --strict

### PSR-12 (コーディング規約)

上記の`composer cs:check`で確認できます。
上記の `composer cs:check` で確認できます。

## コミット前の確認

Expand All @@ -118,43 +124,43 @@ composer qa

## GitHub Actions

プルリクエストやpush時に自動で以下が実行されます。
Pull Request の作成時と push 時に、以下が自動で実行されます。

- PHP 8.1, 8.2, 8.3, 8.4, 8.5での動作確認
- Windows, Linux, macOSでの動作確認
- PHP 8.1〜8.5 での動作確認
- Windows, Linux, macOS での動作確認
- コード品質チェック (PSR-12, PHPStan)
- テスト実行

詳細は[.github/workflows/ci.yml](.github/workflows/ci.yml)を参照してください。
詳細は [.github/workflows/ci.yml](.github/workflows/ci.yml) を参照してください。

## コントリビューション

1. このリポジトリをフォーク
2. フィーチャーブランチを作成 (`git checkout -b feature/amazing-feature`)
3. 変更をコミット (`git commit -m 'Add amazing feature'`)
4. ブランチにプッシュ (`git push origin feature/amazing-feature`)
5. プルリクエストを作成
5. Pull Request を作成

### プルリクエストの要件
### Pull Request の要件

- すべての品質チェックがパス (`composer qa`)
- 新機能にはテストを追加
- PSR-12, PSR-4に準拠
- PHPStan レベル8でエラーなし
- PSR-12, PSR-4 に準拠
- PHPStan レベル 8 でエラーなし

## トラブルシューティング

### PHPStanでFFI関連のエラーが出る

FFI関連のエラーは`phpstan.neon`で適切に無視設定されています。
FFI 関連のエラーは `phpstan.neon` で適切に無視設定されています。
新たなエラーが出た場合は、以下を確認してください。

- FFIのメソッドは動的に追加されるため、静的解析では検出できません
- FFI\CDataのプロパティも実行時に決定されます
- FFI のメソッドは動的に追加されるため、静的解析では検出できません
- FFI\CData のプロパティも実行時に決定されます

これらは正常な動作です。

### PHP-CS-Fixerでバージョン警告が出る

開発環境のPHPバージョンが8.1より新しい場合、警告が表示されることがあります。
開発環境の PHP が 8.1 より新しいと、PHP-CS-Fixer は警告を表示することがあります。
これは情報提供のみで、エラーではありません。
Loading
Loading