Newer
Older
RobotCar / src / common / config.py
"""
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)

# ── ネットワーク設定(.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

# ── 通信設定 ──────────────────────────────────────────────

# 操舵量の送信頻度 (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 = True


# ── アドレス生成ヘルパー ──────────────────────────────────


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}"