#if HWTEST
namespace TIASshot {

    /// <summary>
    /// カメラの設定値（露光・ゲイン）の現在値と設定可能な範囲（HWTEST 限定）．
    /// 単位は機種ごとの SDK の値そのまま（Lucam: 露光 ms・ゲイン倍率，IScam: VCDAbsoluteValueProperty の絶対値（露光は秒．ゲインは絶対値が無い機種では VCDRangeProperty の整数値））．
    /// 元の値へ正確に戻せるよう，丸めの無い（または機種の分解能どおりの）値で読み書きする．
    /// </summary>
    internal struct HwTestSetting {
        public double Value;
        public double Min;
        public double Max;

        public HwTestSetting(double value, double min, double max) {
            Value = value;
            Min = min;
            Max = max;
        }

        public override string ToString() {
            return $"{Value:G6}（範囲 {Min:G6}〜{Max:G6}）";
        }
    }

    /// <summary>
    /// 設定値の種類（HWTEST 限定）．検査で値を 1 段動かすときの動かし方を決める．
    /// 推測で判定せず，機種ごとのアダプタ（Lucam.HwTest・IScam.HwTest）で明示する．
    /// </summary>
    internal enum HwTestValueScale {
        /// <summary>線形の量（値が時間などの量そのもの．1 段 = 現在値の ×0.5 / ×2．きりのよい段には合わせない）</summary>
        Linear,
        /// <summary>
        /// 値は時間などの線形の量だが，検査では 2^n のきりのよい段で動かす（基準探しの前に最も近い 2^n に合わせ，1 段 = 2^(n±1) = 時間で 2 倍・半分）．
        /// 元の値への復元は段ではなく元の値そのもので行う
        /// </summary>
        Log2Step,
    }

    /// <summary>
    /// 実機テストで露光・ゲインを読み書きする口（HWTEST 限定．Lucam・IScam の HwTest 部分で実装する）．
    /// 書き込みは SDK を呼ぶだけの薄い処理とし，試す値の決定や判定は HwTestJudge（純粋関数）が行う．
    /// </summary>
    internal interface IHwTestAdjustable {
        /// <summary>露光の値の単位の説明（結果ファイルに出す）</summary>
        string HwTestExposureUnit { get; }

        /// <summary>露光の値の種類（線形の量か対数の段か）．検査で露光を 1 段動かすときの動かし方に使う</summary>
        HwTestValueScale HwTestExposureScale { get; }

        /// <summary>ゲインの値の単位の説明（結果ファイルに出す）</summary>
        string HwTestGainUnit { get; }

        /// <summary>露光の現在値（カメラから読む）と範囲</summary>
        HwTestSetting HwTestGetExposure();

        /// <summary>露光を設定する（範囲外は範囲内に収める）</summary>
        void HwTestSetExposure(double value);

        /// <summary>ゲインの現在値（カメラから読む）と範囲</summary>
        HwTestSetting HwTestGetGain();

        /// <summary>ゲインを設定する（範囲外は範囲内に収める）</summary>
        void HwTestSetGain(double value);
    }
}
#endif
