"""
config
プロジェクト共通の設定値を管理するモジュール
環境固有の値は .env ファイルから読み込む
"""
import os
from pathlib import Path
from dotenv import load_dotenv
# .env ファイルの読み込み
# config.py から上方向に .env を探索する
_search_dir = Path(__file__).resolve().parent
_env_path = _search_dir / ".env"
while not _env_path.exists() and _search_dir != _search_dir.parent:
_search_dir = _search_dir.parent
_env_path = _search_dir / ".env"
load_dotenv(_env_path)
# ── テレメトリプロトコル ──────────────────────────────────────
# テレメトリメッセージのプロトコルバージョン
# Pi/PC 間でこの値が一致しないと正しくパースできない
TELEMETRY_VERSION: int = 2
# ── ネットワーク設定(.env から読み込み) ──────────────────────
# PC の IP アドレス
PC_IP: str = os.getenv("PC_IP", "127.0.0.1")
# 画像送信ポート(Pi → PC)
IMAGE_PORT: int = int(os.getenv("IMAGE_PORT", "5555"))
# 操舵量送信ポート(PC → Pi)
CONTROL_PORT: int = int(os.getenv("CONTROL_PORT", "5556"))
# ── 画像設定 ──────────────────────────────────────────────
# カメラ撮影時の幅 (px)
CAPTURE_WIDTH: int = 320
# カメラ撮影時の高さ (px)
CAPTURE_HEIGHT: int = 240
# 処理・送信時の幅 (px)(撮影後に縮小)
FRAME_WIDTH: int = 40
# 処理・送信時の高さ (px)(撮影後に縮小)
FRAME_HEIGHT: int = 30
# JPEG 圧縮品質 (0-100)
JPEG_QUALITY: int = 55
# 二値画像の JPEG 圧縮品質 (0-100)
JPEG_QUALITY_BINARY: int = 80
# ── 表示設定 ──────────────────────────────────────────────
# GUI 表示倍率(FRAME_WIDTH/HEIGHT → 表示サイズ)
DISPLAY_SCALE: float = 16.0
# ── Pi 側ログ設定 ─────────────────────────────────────────
# FPS ログの出力間隔(秒)
LOG_INTERVAL_SEC: float = 3.0
# ── 通信設定 ──────────────────────────────────────────────
# 操舵量の送信頻度 (Hz)
CONTROL_PUBLISH_HZ: float = 20.0
# 操舵量の受信タイムアウト (秒),超過でモーター停止
CONTROL_TIMEOUT_SEC: float = 0.5
# ── モーター設定(GPIO ピン番号,BOARD モード) ───────────
# モーター A(左)
MA_IN1: int = 19
MA_IN2: int = 21
MA_PWM: int = 23
# モーター B(右)
MB_IN1: int = 15
MB_IN2: int = 13
MB_PWM: int = 11
# モーター PWM 周波数 (Hz)
MOTOR_PWM_FREQ: int = 100
# モーター極性反転フラグ
MOTOR_LEFT_REVERSED: bool = True
MOTOR_RIGHT_REVERSED: bool = True
# ステアリング方向反転フラグ
STEER_REVERSED: bool = False
# ── アドレス生成ヘルパー ──────────────────────────────────
def image_bind_address() -> str:
"""画像受信側(PC)のバインドアドレスを返す"""
return f"tcp://*:{IMAGE_PORT}"
def image_connect_address() -> str:
"""画像送信側(Pi)の接続先アドレスを返す"""
return f"tcp://{PC_IP}:{IMAGE_PORT}"
def control_bind_address() -> str:
"""操舵量送信側(PC)のバインドアドレスを返す"""
return f"tcp://*:{CONTROL_PORT}"
def control_connect_address() -> str:
"""操舵量受信側(Pi)の接続先アドレスを返す"""
return f"tcp://{PC_IP}:{CONTROL_PORT}"