Newer
Older
TIASShot / TIASshot / HwTest / IHwTestAdjustable.cs
#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