|
@@ -39,7 +39,7 @@ namespace IvfTl.ControlHost.Debug
|
|
|
{
|
|
{
|
|
|
if (sid != null && _sessions.TryRemove(sid, out var s))
|
|
if (sid != null && _sessions.TryRemove(sid, out var s))
|
|
|
{
|
|
{
|
|
|
- try { s.Lease.Dispose(); } catch { }
|
|
|
|
|
|
|
+ try { s.Lease.Dispose(); } catch (Exception ex) { _log($"[debug] dispose 异常 sid={sid} 舱{s.HouseSn}: {ex.Message}"); }
|
|
|
_log($"[debug] release sid={sid} 舱{s.HouseSn}");
|
|
_log($"[debug] release sid={sid} 舱{s.HouseSn}");
|
|
|
}
|
|
}
|
|
|
return DebugCommandResult.Okay();
|
|
return DebugCommandResult.Okay();
|
|
@@ -54,7 +54,7 @@ namespace IvfTl.ControlHost.Debug
|
|
|
{
|
|
{
|
|
|
if (_sessions.TryRemove(kv.Key, out var s))
|
|
if (_sessions.TryRemove(kv.Key, out var s))
|
|
|
{
|
|
{
|
|
|
- try { s.Lease.Dispose(); } catch { }
|
|
|
|
|
|
|
+ try { s.Lease.Dispose(); } catch (Exception ex) { _log($"[debug] dispose 异常 sid={kv.Key} 舱{s.HouseSn}: {ex.Message}"); }
|
|
|
_log($"[debug] 会话超时自动回收 sid={kv.Key} 舱{s.HouseSn}");
|
|
_log($"[debug] 会话超时自动回收 sid={kv.Key} 舱{s.HouseSn}");
|
|
|
n++;
|
|
n++;
|
|
|
}
|
|
}
|
|
@@ -97,10 +97,10 @@ namespace IvfTl.ControlHost.Debug
|
|
|
private DebugCommandResult ExecuteMotorOrEeprom(DebugSession s, IvfTl.Hardware.ISerialChannel ser, string op, JObject args)
|
|
private DebugCommandResult ExecuteMotorOrEeprom(DebugSession s, IvfTl.Hardware.ISerialChannel ser, string op, JObject args)
|
|
|
{
|
|
{
|
|
|
int Arg(string k, int def = 0) => args?[k] != null ? args[k].Value<int>() : def;
|
|
int Arg(string k, int def = 0) => args?[k] != null ? args[k].Value<int>() : def;
|
|
|
- int delay = -1;
|
|
|
|
|
|
|
+ int delay = Arg("motorDelay", -1);
|
|
|
switch (op)
|
|
switch (op)
|
|
|
{
|
|
{
|
|
|
- case "VerticalReset": { bool ok = ser.VerticalResetWait(delay); s.CurrentVer = 0; return DebugCommandResult.Okay(ok); }
|
|
|
|
|
|
|
+ case "VerticalReset": { bool ok = ser.VerticalResetWait(delay); if (ok) s.CurrentVer = 0; return DebugCommandResult.Okay(ok); }
|
|
|
case "VerticalMoveTo":
|
|
case "VerticalMoveTo":
|
|
|
{
|
|
{
|
|
|
int pos = Arg("pos");
|
|
int pos = Arg("pos");
|
|
@@ -110,14 +110,15 @@ namespace IvfTl.ControlHost.Debug
|
|
|
case "VerticalForward":
|
|
case "VerticalForward":
|
|
|
case "VerticalBackward":
|
|
case "VerticalBackward":
|
|
|
{
|
|
{
|
|
|
|
|
+ // 红线钳位必须基于回读的真实物理位,不信任会话跟踪位(防真机已在高位时相对运动越红线)。
|
|
|
|
|
+ int basePos = ser.ReadVerticalPositionWait();
|
|
|
int delta = Arg("value") * (op == "VerticalBackward" ? -1 : 1);
|
|
int delta = Arg("value") * (op == "VerticalBackward" ? -1 : 1);
|
|
|
- int basePos = s.CurrentVer < 0 ? 0 : s.CurrentVer;
|
|
|
|
|
int target = MotorClamp.RelativeTarget(basePos, delta);
|
|
int target = MotorClamp.RelativeTarget(basePos, delta);
|
|
|
if (!MotorClamp.IsVerticalInRange(target)) return DebugCommandResult.Fail("OUT_OF_RANGE", $"垂直目标{target}越界");
|
|
if (!MotorClamp.IsVerticalInRange(target)) return DebugCommandResult.Fail("OUT_OF_RANGE", $"垂直目标{target}越界");
|
|
|
bool ok = op == "VerticalBackward" ? ser.VerticalBackwardWait(Arg("value"), delay) : ser.VerticalForwardWait(Arg("value"), delay);
|
|
bool ok = op == "VerticalBackward" ? ser.VerticalBackwardWait(Arg("value"), delay) : ser.VerticalForwardWait(Arg("value"), delay);
|
|
|
- if (ok) s.CurrentVer = target; return DebugCommandResult.Okay(ok);
|
|
|
|
|
|
|
+ if (ok) s.CurrentVer = ser.ReadVerticalPositionWait(); return DebugCommandResult.Okay(ok);
|
|
|
}
|
|
}
|
|
|
- case "HorizontalReset": { bool ok = ser.HorizontalResetWait(delay); s.CurrentHor = 0; return DebugCommandResult.Okay(ok); }
|
|
|
|
|
|
|
+ case "HorizontalReset": { bool ok = ser.HorizontalResetWait(delay); if (ok) s.CurrentHor = 0; return DebugCommandResult.Okay(ok); }
|
|
|
case "HorizontalMoveTo":
|
|
case "HorizontalMoveTo":
|
|
|
{
|
|
{
|
|
|
int pos = Arg("pos");
|
|
int pos = Arg("pos");
|
|
@@ -127,12 +128,13 @@ namespace IvfTl.ControlHost.Debug
|
|
|
case "HorizontalForward":
|
|
case "HorizontalForward":
|
|
|
case "HorizontalBackward":
|
|
case "HorizontalBackward":
|
|
|
{
|
|
{
|
|
|
|
|
+ // 红线钳位必须基于回读的真实物理位,不信任会话跟踪位。
|
|
|
|
|
+ int basePos = ser.ReadHorizontalPositionWait();
|
|
|
int delta = Arg("value") * (op == "HorizontalBackward" ? -1 : 1);
|
|
int delta = Arg("value") * (op == "HorizontalBackward" ? -1 : 1);
|
|
|
- int basePos = s.CurrentHor < 0 ? 0 : s.CurrentHor;
|
|
|
|
|
int target = MotorClamp.RelativeTarget(basePos, delta);
|
|
int target = MotorClamp.RelativeTarget(basePos, delta);
|
|
|
if (!MotorClamp.IsHorizontalInRange(target)) return DebugCommandResult.Fail("OUT_OF_RANGE", $"水平目标{target}越界");
|
|
if (!MotorClamp.IsHorizontalInRange(target)) return DebugCommandResult.Fail("OUT_OF_RANGE", $"水平目标{target}越界");
|
|
|
bool ok = op == "HorizontalBackward" ? ser.HorizontalBackwardWait(Arg("value"), delay) : ser.HorizontalForwardWait(Arg("value"), delay);
|
|
bool ok = op == "HorizontalBackward" ? ser.HorizontalBackwardWait(Arg("value"), delay) : ser.HorizontalForwardWait(Arg("value"), delay);
|
|
|
- if (ok) s.CurrentHor = target; return DebugCommandResult.Okay(ok);
|
|
|
|
|
|
|
+ if (ok) s.CurrentHor = ser.ReadHorizontalPositionWait(); return DebugCommandResult.Okay(ok);
|
|
|
}
|
|
}
|
|
|
case "WriteScanStep": return DebugCommandResult.Okay(ser.WriteScanStepWait(Arg("value")));
|
|
case "WriteScanStep": return DebugCommandResult.Okay(ser.WriteScanStepWait(Arg("value")));
|
|
|
case "WriteOpenIntakeTime": return DebugCommandResult.Okay(ser.WriteOpenIntakeTimeWait(Arg("value")));
|
|
case "WriteOpenIntakeTime": return DebugCommandResult.Okay(ser.WriteOpenIntakeTimeWait(Arg("value")));
|