using System;
namespace IvfTl.Hardware
{
///
/// 单 COM 口的唯一持有者。封装 SerialPort 打开/独占 + 同步请求-响应收发。
/// 蓝本:autofocustool SerialMotor + HouseMotor + Protocol(最权威),
/// 并补回 control/operate 的温压门 / 写EEPROM / 气阀 能力。
/// 所有方法同步阻塞到下位机回复;内部对该口的收发用实例锁串行化(一个 COM 口同一时刻一条在途指令)。
/// 接口签名权威:13 文档 §3.2。返回值约定:位置/计数失败 -1,温压失败 -1m,布尔操作失败 false。
///
public interface ISerialChannel : IDisposable
{
string PortName { get; }
bool IsOpen { get; }
Action Log { get; set; }
// ── 生命周期 ──
/// 打开串口(含 DiscardIn/OutBuffer)。已开返回 true。独占失败返回 false。
bool Open();
void Close();
// ── 读超时策略(按命令类型分超时,13 §3.5/3;属性化,禁止写死单一超时)──
/// 移动类命令(0x05)读超时(ms),需覆盖最大行程开环回复,默认 12000。
int MoveReadTimeoutMs { get; set; }
/// 查询类命令读超时(ms),下位机立即回复,默认 3000。
int QueryReadTimeoutMs { get; set; }
/// 电机到位后默认稳定延时(ms),移动后等机械停稳再抓图,默认 1500(真机标定)。
int MotorSettleMs { get; set; }
// ── 通用收发(底层)──
/// 发送完整命令帧(含校验),按命令码定长阻塞收帧并校验。extraWaitMs:收到回复后额外等待。失败返回 null。
byte[] SendWait(byte[] frame, int extraWaitMs = 0);
// ── 握手 / 自检 ──
/// 握手,返回下位机自报 houseSn。失败 -1。
int ShakeHandsWait();
// ── EEPROM ──
/// 读本舱相机序列号 CCDSN(EEPROM int)。失败 -1。
int ReadCcdSnWait();
/// 读 EEPROM 灯光亮度(只读)。失败 -1。
int ReadLightBrightnessWait();
/// 读第 well(1-16) 的水平电机位置脉冲(EEPROM)。失败 -1。
int ReadWellHorizontalPosWait(int well);
/// 读第 well(1-16) 的 Z 对焦零点脉冲(EEPROM)。失败 -1。
int ReadWellFocusZeroWait(int well);
/// 读垂直电机扫描间隔脉冲(每层 Z 步距,EEPROM)。失败 -1。
int ReadScanStepWait();
/// 写第 well(1-16) 的水平电机位置脉冲(命令码 0x12)。
/// ⚠ 需真机验证:写命令字节序/地址表须按 control Commander.cs 复核(13 §⑤ V1)。
bool WriteWellHorizontalPosWait(int well, int pulseValue);
// ── 写E方调试动作(M1-B2,operate 调试页接入 lease 后走这些;底层 control ComBin builder 已逐字节核实)──
// ⚠ 待真机 V-010:写E方为破坏性操作,回包"成功判定"语义待真机核对(发送字节已核实一致)。
/// 写E方→垂直电机扫描间隔脉冲。成功 true(control 写命令无显式成功出口,发出即视为已下发)。
bool WriteScanStepWait(int pulseValue);
/// 写E方→舱室进气阀打开时间。isBuffer=true 写缓冲瓶进气阀时间。
bool WriteOpenIntakeTimeWait(int newValue, bool isBuffer = false);
/// 写E方→舱室排气阀打开时间。control Commander 暂缺该 builder → 返回 false(调试页保留旧路径/待真机)。
bool WriteOpenVentTimeWait(int newValue);
/// 读E方→舱室排气阀打开时间。control Commander 暂缺该 builder → 返回 -1(待真机)。
int ReadOpenVentTimeWait();
/// 写E方→灯光亮度。control Commander 暂缺写 builder → 返回 false(调试页保留旧路径/待真机)。
bool WriteLightBrightnessWait(int newValue);
// ── 电机:垂直(Z=对焦轴)/ 水平(皿孔定位)──
/// Z 绝对运动到脉冲,delayMs 缺省用 MotorSettleMs;扫描小步可传短延时提速。失败 false。
bool VerticalMoveToWait(int pulse, int delayMs = -1);
bool VerticalForwardWait(int pulse, int delayMs = -1);
bool VerticalBackwardWait(int pulse, int delayMs = -1);
bool VerticalResetWait(int delayMs = -1);
/// 读 Z 当前位置脉冲。失败 -1。
int ReadVerticalPositionWait();
bool HorizontalMoveToWait(int pulse, int delayMs = -1);
bool HorizontalForwardWait(int pulse, int delayMs = -1);
bool HorizontalBackwardWait(int pulse, int delayMs = -1);
bool HorizontalResetWait(int delayMs = -1);
int ReadHorizontalPositionWait();
// ── 环境量(温压门,control/operate 有,af 无)──
/// 下盖板温度(℃),失败 -1m。
decimal TemperatureWait();
decimal ShangTemperatureWait(); // 上盖板
decimal BoLiTemperatureWait(); // 玻璃片下方
decimal PressureWait(); // 舱内气压
(decimal pressure, decimal t1, decimal t2) BufferBottleStateWait(); // 缓冲瓶
/// 仓门状态。失败返回 未知。
DoorState DoorStatusWait();
// ── IO / LED / 气阀(control/operate 全,af 仅 LED)──
bool OpenLedWait();
bool CloseLedWait();
bool OpenIntakeValveWait();
bool CloseIntakeValveWait();
bool OpenExhaustValveWait();
bool CloseExhaustValveWait();
bool HouseAerationWait(); // 舱室补气
bool HouseVentWait(); // 舱室排气
bool BufferBottleAerationWait(); // 缓冲瓶补气
/// 自动气体交换开/关(对应 operate AutoWait)。
bool AutoAirSwapWait(bool on);
// ── 直通底层 ComBin(迁移期过渡:调试/采集若需要 ComBin 上 HAL 接口未覆盖的方法可暂取裸实例)──
/// 桥接对象:返回内部包装的具体 ComBin(object 以避免 HAL 接口耦合具体类型)。
/// 仅供迁移期老调用方过渡使用,新代码应只用本接口方法。
object RawComBin { get; }
}
/// 仓门状态(对应 control State 枚举的 未知/打开/关闭 子集)。
public enum DoorState { 未知, 打开, 关闭 }
}