using SimpleCore.Compiler;
using SimpleCore.PropType;
using StandardScene.CarTypes;
namespace StandardScene.Coders
{
///
/// 通用(导航无关)轨道 coder 基类。
///
/// 背景:避障/IO/纠偏等 coder 原以 [TemplateTrackCoderSettings] 内联重复在各车型上。
/// 这里把它们抽离为单一可复用实现,各车型改用 [ProgramTrackCoderSettings] 按各自 priority 引用。
///
/// 等价性:内部仍走内核 Template 机制(ProgramCoderHelper.PrepareTrackEngine + Topaz 求值),
/// useVerb / templateString 与原模板逐字一致;这些 coder 仅引用 Basic 字段,故统一用 BasicXxxFields,
/// 与原先传车型 Fields 在“模板所引用字段”上行为一致。priority 由引用方车型特性指定,执行顺序不变。
///
public abstract class CommonTemplateTrackCoder : ITrackCoder
{
protected abstract string UseVerb { get; }
protected abstract string TemplateString { get; }
// 默认仅用 Basic 字段袋;个别 coder(如避障含 ChangeAvoidanceParam 标志位)可覆写站点字段袋。
protected virtual System.Type SiteFieldsType => typeof(BasicSiteFields);
public virtual bool toBlock() => false;
public bool Code(SegmentPlan plan, Track track, Site src, Site dst, int i)
{
var engine = ProgramCoderHelper.PrepareTrackEngine(plan, track, src, dst, i,
carFields: typeof(BasicCarFields),
siteFields: SiteFieldsType,
trackFields: typeof(BasicTrackFields),
planFields: typeof(BasicPlanFields));
if (!(engine.ExecuteExpression(UseVerb) is bool ok) || !ok)
return false;
plan.codeArr[i] += (string)engine.ExecuteExpression("`" + TemplateString + "`");
return false;
}
}
// 原 useVerb: track.LidarArea != -2
public class LidarAreaSwitchCoder : CommonTemplateTrackCoder
{
protected override string UseVerb => "track.LidarArea != -2";
protected override string TemplateString =>
"agv.Queue(()=>{},()=>{ agv.SwitchLidarArea(${track.LidarArea}); });";
}
// 原无 useVerb(等价 true,每段执行)
public class AvoidanceDistanceCoder : CommonTemplateTrackCoder
{
protected override string UseVerb => "true";
protected override string TemplateString =>
"agv.Queue(()=>{},()=>{ agv.ChangeAvoidanceDistance(${track.StopDistance},${track.SlowDistance}); });";
}
// 原 useVerb: track.IOArea != -1
public class IoAreaSwitchCoder : CommonTemplateTrackCoder
{
protected override string UseVerb => "track.IOArea != -1";
protected override string TemplateString =>
"agv.Queue(()=>{},()=>{ agv.SwitchIoArea(${track.IOArea}); });";
}
// 原 useVerb: track.BiasAlarmThresh >0 || track.DthAlarmThresh > 0
public class TrackingErrThreshCoder : CommonTemplateTrackCoder
{
protected override string UseVerb => "track.BiasAlarmThresh >0 || track.DthAlarmThresh > 0";
protected override string TemplateString =>
"agv.Queue(()=>{},()=>{ agv.ChangeTrackingErrThresh(${track.BiasAlarmThresh},${track.DthAlarmThresh}); });";
}
// 避障区尺寸切换(4 参,含中心点)站点字段袋:在 Basic 基础上补 ChangeAvoidanceParam 标志位。
// 等价于 MWL/MultiVehicle 原用的 MultiWheelLifterSiteFields 中本 coder 实际引用到的字段。
internal class AvoidanceParamSiteFields : BasicSiteFields
{
public bool ChangeAvoidanceParam = false;
}
///
/// 避障区尺寸切换 coder(4 参,含中心点)。
/// 合并自 MultiWheelLifterCar 与 MultiVehicleCar 两份**逐字相同**的内联模板(零行为变更):
/// useVerb=dst.ChangeAvoidanceParam==true;模板=ChangeAvoidanceParam(L,W,CenterX,CenterY)。
/// 注:Kiva / Forklift 的 2 参变体见同文件 AvoidanceParamLWCoder(方案 B:4 参 flag 版 + 2 参 L,W 版)。
///
public class AvoidanceParamCoder : CommonTemplateTrackCoder
{
protected override System.Type SiteFieldsType => typeof(AvoidanceParamSiteFields);
protected override string UseVerb => "dst.ChangeAvoidanceParam==true";
protected override string TemplateString =>
"agv.Queue(()=>{},()=>{ agv.ChangeAvoidanceParam(${dst.CarLength},${dst.CarWidth},${dst.CarCenterX},${dst.CarCenterY}); });";
}
///
/// 避障区尺寸切换 coder(2 参,无中心点)。
/// 合并自 Kiva 与 Forklift 两份**逐字相同**的 2 参内联模板。
/// 触发条件统一取 Forklift 的「已配置车体长宽」(dst.CarLength!=-1 && dst.CarWidth!=-1):
/// - Forklift:useVerb/模板逐字一致,行为不变;
/// - Kiva:原为无条件触发,统一后当站点未配置长宽(=-1)时不再下发 ChangeAvoidanceParam(-1,-1),
/// 属预期内的安全收敛(方案 B,见 StandardScene拆分计划.md §11.4-2)。
/// 仅引用 Basic 字段(CarLength/CarWidth 已在 BasicSiteFields),故用默认 BasicSiteFields。
///
public class AvoidanceParamLWCoder : CommonTemplateTrackCoder
{
protected override string UseVerb => "dst.CarLength != -1 && dst.CarWidth != -1";
protected override string TemplateString =>
"agv.Queue(()=>{},()=>{ agv.ChangeAvoidanceParam(${dst.CarLength},${dst.CarWidth}); });";
}
}