from typing import List, Optional from pydantic import BaseModel, Field from .config import MAX_COEFFICIENTS class DesignParams(BaseModel): filter_type: str fs: float = Field(gt=0) lp_fc: float = Field(default=1000.0, gt=0) lp_order: int = Field(default=1, ge=1, le=8) hp_fc: float = Field(default=1000.0, gt=0) hp_order: int = Field(default=1, ge=1, le=8) bp_f_low: float = Field(default=500.0, gt=0) bp_f_high: float = Field(default=2000.0, gt=0) bp_order: int = Field(default=1, ge=1, le=8) notch_f0: float = Field(default=120.0, gt=0) notch_q: float = Field(default=1.0, gt=0) opoz_fz: float = Field(default=15000.0, gt=0) opoz_fp: float = Field(default=10.0, gt=0) tp1z_fz: float = Field(default=200.0, gt=0) tp1z_fp1: float = Field(default=10.0, gt=0) tp1z_fp2: float = Field(default=5000.0, gt=0) tptz_fz1: float = Field(default=200.0, gt=0) tptz_fz2: float = Field(default=25000.0, gt=0) tptz_fp1: float = Field(default=10.0, gt=0) tptz_fp2: float = Field(default=5000.0, gt=0) pid_kp: float = 0.003 pid_ki: float = 10.0 pid_kd: float = 0.000016 sogi_f0: float = Field(default=60.0, gt=0) sogi_k: float = Field(default=1.414, gt=0) class BodeParams(BaseModel): b: List[float] = Field(min_length=1, max_length=MAX_COEFFICIENTS) a: List[float] = Field(min_length=1, max_length=MAX_COEFFICIENTS) fs: float = Field(gt=0) class BodeCompareParams(BaseModel): ideal: BodeParams fixed: BodeParams class MCUWriteParams(BaseModel): command: str = Field(min_length=1, max_length=128) port: Optional[str] = Field(default=None, max_length=256)