#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