Files
test_demo/MX-PD-盘古 - new/PanGu.DieBonderApp/MainShell/Hardware/HardwareManager.cs
Shi.Ji e31d3560bb 添加 MX-PD-盘古 项目文件
将 MX-PD-盘古 - new 目录下的所有文件添加到主仓库
2026-05-18 11:43:09 +08:00

1202 lines
44 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using MainShell.Common;
using MaxwellControl.Controls;
using MaxwellFramework.Core.Attributes;
using MwFramework.Controls.UIControl.Lighter;
using MwFramework.Device;
using MwFramework.Device.Delta;
using MwFramework.Device.DeviceInterface;
using MwFramework.Device.Drivers;
using MwFramework.ManagerService;
using StyletIoC;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MainShell.Hardware
{
public static class AxisName
{
public const string Axis_SZ = "SZ"; //刺晶头 音圈电机
public const string Axis_PHS_X1 = "PHS-X1"; //PHS龙门
public const string Axis_PHS_X2 = "PHS-X2"; //PHS龙门
public const string Axis_PHS_Y1 = "PHS-Y1"; //PHS龙门Y轴
public const string Axis_WS_X3 = "WS-X3"; //WS龙门
public const string Axis_WS_R = "WS-R"; //WS旋转轴
public const string Axis_Stage_Y3 = "Stage-Y3"; //Stage平台Y3轴
public const string Axis_PHS_Z1 = "PHS-Z1"; //刺晶头Z轴
public const string Axis_PHS_Z3 = "PHS-Z3"; //相机Z轴
public const string Axis_PHS_Z4 = "PHS-Z4";
public const string Axis_PHS_Z5 = "PHS-Z5";
public const string Axis_PHS_Z6 = "PHS-Z6";
public const string Axis_Stage_Z7 = "Stage-Z7";
public const string Axis_Stage_Z8 = "Stage-Z8";
public const string Axis_Stage_Z9 = "Stage-Z9";
public const string Axis_Stage_Z10 = "Stage-Z10";
public const string Axis_Stage_CV_Y4 = "Stage-CV-Y4";
public const string Axis_Stage_CV_Y5 = "Stage-CV-Y5";
public const string Axis_WEU_Z11 = "WEU-Z11";
public const string Axis_WEU_Z12 = "WEU-Z12";
public const string Axis_WEU_Y6 = "WEU-Y6";
public const string Axis_CV_Z13 = "CV-Z13";
public const string Axis_CV_Y7 = "CV-Y7";
public const string Axis_CV_Y8 = "CV-Y8";
public const string Axis_CV_Y9 = "CV-Y9";
public const string Axis_CV_Y10 = "CV-Y10";
}
[Singleton]
public class HardwareManager
{
private const ushort DeltaDefaultNode = 0;
private const ushort DeltaDefaultSlot = 0;
private readonly List<DeviceIoPointDefinition> _ioPointDefinitions = new List<DeviceIoPointDefinition>();
private readonly Dictionary<string, List<DeviceIoPointDefinition>> _ioPointDefinitionsByModule = new Dictionary<string, List<DeviceIoPointDefinition>>(StringComparer.OrdinalIgnoreCase);
private readonly Dictionary<string, bool> _simulatedIoStates = new Dictionary<string, bool>(StringComparer.OrdinalIgnoreCase);
private const string DeviceIoConfigFileName = "DeviceIoPoints.csv";
public IReadOnlyList<DeviceIoPointDefinition> IoPointDefinitions => _ioPointDefinitions;
public IReadOnlyDictionary<string, List<DeviceIoPointDefinition>> IoPointDefinitionsByModule => _ioPointDefinitionsByModule;
#region//内部类
public class CameraAxisDevicesManager
{
//public List<HardwareDevice> TopPositionCameraAxisDevices { get; set; } = new List<HardwareDevice>();
//public List<HardwareDevice> TopVirtualCameraAxisDevices { get; set; } = new List<HardwareDevice>();
//public List<HardwareDevice> MapCameraAxisDevices { get; set; } = new List<HardwareDevice>();
//public List<HardwareDevice> TopWideCameraAxisDevices { get; set; } = new List<HardwareDevice>();
public List<HardwareDevice> TopPositionAndWideCameraAxisDevices { get; set;} = new List<HardwareDevice>();
//public List<HardwareDevice> BottomCalibCameraAxisDevices { get; set; } = new List<HardwareDevice>();
//public List<HardwareDevice> WSCalibCameraAxisDevices { get; set; } = new List<HardwareDevice>();
//public List<HardwareDevice> PadCalibCameraAxisDevices { get; set; } = new List<HardwareDevice>();
//public List<HardwareDevice> WSCalibWideCameraAxisDevices { get; set; } = new List<HardwareDevice>();
//public List<HardwareDevice> PadCalibWideCameraAxisDevices { get; set; } = new List<HardwareDevice>();
//上相机拍Pad运动轴X1、Y2
public List<HardwareDevice> TopCameraAxisDevices { get; set; } = new List<HardwareDevice>();
//上相机拍WS运动轴X2、Y1
public List<HardwareDevice> TopCameraWsAxisDevices { get; set; } = new List<HardwareDevice>();
//广角相机拍Pad、运动轴X1、Y2
public List<HardwareDevice> WideCameraAxisDevices { get; set; } = new List<HardwareDevice>();
//广角相机拍ws、运动轴X2、Y1
public List<HardwareDevice> WideCameraWsAxisDevices { get; set; } = new List<HardwareDevice>();
//下相机拍WS运动轴X2、Y2
public List<HardwareDevice> BottomCameraAxisDevices { get; set; } = new List<HardwareDevice>();
}
#endregion
#region
public IAxis Axis_PHS_X1 => GetAxisInternal(AxisName.Axis_PHS_X1);
public IAxis Axis_PHS_X2 => GetAxisInternal(AxisName.Axis_PHS_X2);
public IAxis Axis_PHS_Y1 => GetAxisInternal(AxisName.Axis_PHS_Y1);
//public IAxis Axis_PHS_Y2 => GetAxisInternal(AxisName.Axis_Stage_Y3);
public IAxis Axis_WS_X3 => GetAxisInternal(AxisName.Axis_WS_X3);
public IAxis Axis_WS_R => GetAxisInternal(AxisName.Axis_WS_R);
public IAxis Axis_Stage_Y3 => GetAxisInternal(AxisName.Axis_Stage_Y3);
public IAxis Axis_Stage_Z7 => GetAxisInternal(AxisName.Axis_Stage_Z7);
public IAxis Axis_Stage_Z8 => GetAxisInternal(AxisName.Axis_Stage_Z8);
public IAxis Axis_Stage_Z9 => GetAxisInternal(AxisName.Axis_Stage_Z9);
public IAxis Axis_Stage_Z10 => GetAxisInternal(AxisName.Axis_Stage_Z10);
public IAxis Axis_Stage_CV_Y4 => GetAxisInternal(AxisName.Axis_Stage_CV_Y4);
public IAxis Axis_Stage_CV_Y5 => GetAxisInternal(AxisName.Axis_Stage_CV_Y5);
public IAxis Axis_PHS_Z1 => GetAxisInternal(AxisName.Axis_PHS_Z1);
public IAxis Axis_PHS_Z3 => GetAxisInternal(AxisName.Axis_PHS_Z3);
public IAxis Axis_PHS_Z4 => GetAxisInternal(AxisName.Axis_PHS_Z4);
public IAxis Axis_PHS_Z5 => GetAxisInternal(AxisName.Axis_PHS_Z5);
public IAxis Axis_PHS_Z6 => GetAxisInternal(AxisName.Axis_PHS_Z6);
public IAxis Axis_WEU_Z11 => GetAxisInternal(AxisName.Axis_WEU_Z11);
public IAxis Axis_WEU_Z12 => GetAxisInternal(AxisName.Axis_WEU_Z12);
public IAxis Axis_WEU_Y6 => GetAxisInternal(AxisName.Axis_WEU_Y6);
public IAxis Axis_CV_Z13 => GetAxisInternal(AxisName.Axis_CV_Z13);
public IAxis Axis_CV_Y7 => GetAxisInternal(AxisName.Axis_CV_Y7);
public IAxis Axis_CV_Y8 => GetAxisInternal(AxisName.Axis_CV_Y8);
public IAxis Axis_CV_Y9 => GetAxisInternal(AxisName.Axis_CV_Y9);
public IAxis Axis_CV_Y10 => GetAxisInternal(AxisName.Axis_CV_Y10);
public IAxis Axis_SZ => GetAxisInternal(AxisName.Axis_SZ);
public IAxis Axis_X1 => Axis_PHS_X1;
public IAxis Axis_X2 => Axis_PHS_X2;
public IAxis Axis_Y1 => Axis_PHS_Y1;
public IAxis Axis_Y2 => Axis_Stage_Y3;
public IAxis Axis_Z1 => Axis_PHS_Z1;
public IAxis Axis_Z3 => Axis_PHS_Z3;
#endregion
private readonly string _topCameraName = "TopPositionCamera";
private readonly string _topWsCameraName = "TopWsCamera";
private readonly string _topWideCameraName = "TopWideCamera";
private readonly string _topWideWsCameraName = "TopWideWsCamera";
private readonly string _bottomCameraName = "MapCamera";
//private readonly string _topVirtualCameraName = "TopVirtualCamera";
/// <summary>
/// 相机轴参数对象
/// </summary>
public CameraAxisDevicesManager CameraAxisManager { get; protected set; } = new CameraAxisDevicesManager();
/// <summary>
/// 当前设备的所有轴
/// </summary>
public Dictionary<string,IAxis> AxesDic { get; protected set; } = new Dictionary<string, IAxis>(StringComparer.Ordinal);
/// <summary>
/// Acs卡对象
/// </summary>
public MwCard AcsCard { get; protected set; }
/// <summary>
/// 台达卡对象
/// </summary>
public MwCard TdCard { get; protected set; }
private MwCamera _topCamera;
/// <summary>
/// 上相机
/// </summary>
public MwCameraExtend TopCameraExtend { get; protected set; }
/// <summary>
/// 虚拟相机(上相机)
/// </summary>
public MwCameraExtend TopVirtualCameraExtend { get; protected set; }
/// <summary>
/// 上相机(虚拟相机)
/// </summary>
public MwCameraExtend TopWsCameraExtend { get; protected set; }
private MwCamera _bottomCamera;
/// <summary>
/// 下相机
/// </summary>
public MwCameraExtend BottomCameraExtend { get; protected set; }
private MwCamera _topWideCamera;
/// <summary>
/// 大视野上相机
/// </summary>
public MwCameraExtend TopWideCameraExtend { get; protected set; }
/// <summary>
/// 大视野上相机(虚拟相机)
/// </summary>
public MwCameraExtend TopWideWsCameraExtend { get; protected set; }
/// <summary>
/// 光源控制器1
/// </summary>
public MwLamp LightControl1 { get; protected set; }
/// <summary>
/// 光源控制器2
/// </summary>
public MwLamp LightControl2 { get; protected set; }
#region//光源通道
public MwLight Up_PointRedLight { get; protected set; }
public MwLight Up_RingRedLight { get; protected set; }
public MwLight Up_PointBlueLight { get; protected set; }
public MwLight Up_RingBlueLight { get; protected set; }
public MwLight Up_RedBackLight { get; protected set; }
public MwLight Down_PointRedLight { get; protected set; }
public MwLight Down_RingRedLight { get; protected set; }
public MwLight Down_PointBlueLight { get; protected set; }
public MwLight Down_RingBlueLight { get; protected set; }
public MwLight Map_RedLight { get; protected set; }
public MwLight Map_BlueLight { get; protected set; }
#endregion
/// <summary>
/// 激光测距仪
/// </summary>
public IDiastimeter Diastimeter { get; protected set; }
public IFFU FFU { get; protected set; }
[Inject]
public IDeviceManager DeviceManager { get; set; }
public HardwareManager()
{
}
private IAxis GetAxisInternal(string axisName)
{
if (string.IsNullOrWhiteSpace(axisName) || AxesDic == null)
{
return null;
}
IAxis axis;
return AxesDic.TryGetValue(axisName, out axis) ? axis : null;
}
public void Tesrt()
{
Debug.WriteLine("HardwareManager Test");
}
public void Initialize()
{
if (DeviceManager is IDeviceList devices)
{
//初始化硬件设备
AcsCard=devices.GetDevice<MwCard>("AcsCard");
TdCard=devices.GetDevice<MwCard>("Delta");
_topCamera=devices.GetDevice<MwCamera>("TopPositionCamera");
_bottomCamera = devices.GetDevice<MwCamera>("MapCamera");
_topWideCamera= devices.GetDevice<MwCamera>("TopWideCamera");
Diastimeter = devices.GetDevice<IDiastimeter>("GPACON");
LightControl1= devices.GetDevice<MwLamp>("LightControllor1");
LightControl2= devices.GetDevice<MwLamp>("LightControllor2");
#region //光源通道初始化
Up_PointRedLight = new MwLight("点红光", LightControl1, 0);
Up_PointBlueLight=new MwLight("点蓝光", LightControl1, 3);
Up_RingRedLight=new MwLight("环红光", LightControl1, 1);
Up_RingBlueLight=new MwLight("环蓝光", LightControl1, 2);
Up_RedBackLight=new MwLight("红背光", LightControl1, 4);
Down_PointRedLight=new MwLight("点红光", LightControl2, 0);
Down_PointBlueLight=new MwLight("点蓝光", LightControl2, 3);
Down_RingRedLight=new MwLight("环红光",LightControl2, 1);
Down_RingBlueLight=new MwLight("环蓝光", LightControl2, 2);
Map_RedLight=new MwLight("平面红光", LightControl2, 4);
Map_BlueLight=new MwLight("平面蓝光", LightControl2, 5);
#endregion
TopCameraExtend = new MwCameraExtend(_topCamera, _topCameraName, _topCameraName);
TopWsCameraExtend = new MwCameraExtend(_topCamera, _topWsCameraName, _topWsCameraName);
TopWideCameraExtend = new MwCameraExtend(_topWideCamera, _topWideCameraName, _topWideCameraName);
TopWideWsCameraExtend = new MwCameraExtend(_topWideCamera, _topWideWsCameraName, _topWideWsCameraName);
BottomCameraExtend = new MwCameraExtend(_bottomCamera, _bottomCameraName, _bottomCameraName);
//TopVirtualCameraExtend = new MwCameraExtend(_topCamera, _topVirtualCameraName, _topVirtualCameraName);
AxesDic = GetAxes();
//初始化相机轴集合
//CameraAxisManager.TopPositionCameraAxisDevices.Add(new HardwareDevice
//{
// AxisX = Axis_PHS_X1,
// AxisY = Axis_Y1,
// AxisZ = Axis_PHS_Z3,
// Camera = TopCameraExtend,
//});
//CameraAxisManager.TopVirtualCameraAxisDevices.Add(new HardwareDevice
//{
// AxisX = Axis_PHS_X1,
// AxisY = Axis_Y1,
// AxisZ = Axis_PHS_Z3,
// Camera = TopCameraExtend,
//});
//标定用相机轴组集合
CameraAxisManager.TopCameraAxisDevices.Add(new HardwareDevice
{
AxisX = Axis_X1,
AxisY = Axis_Y2,
AxisZ = Axis_PHS_Z3,
Camera = TopCameraExtend,
});
CameraAxisManager.TopCameraWsAxisDevices.Add(new HardwareDevice
{
AxisX = Axis_X2,
AxisY = Axis_Y1,
AxisZ = Axis_PHS_Z3,
Camera = TopWsCameraExtend,
});
CameraAxisManager.WideCameraAxisDevices.Add(new HardwareDevice
{
AxisX = Axis_X2,
AxisY = Axis_Y1,
AxisZ = Axis_PHS_Z3,
Camera = TopWideCameraExtend,
});
CameraAxisManager.WideCameraWsAxisDevices.Add(new HardwareDevice
{
AxisX = Axis_X1,
AxisY = Axis_Y2,
AxisZ = Axis_PHS_Z3,
Camera = TopWideWsCameraExtend,
});
CameraAxisManager.BottomCameraAxisDevices.Add(new HardwareDevice
{
AxisX = Axis_X2,
AxisY = Axis_Y2,
AxisZ = Axis_PHS_Z3,
Camera = BottomCameraExtend,
});
CameraAxisManager.TopPositionAndWideCameraAxisDevices.Add(CameraAxisManager.TopCameraAxisDevices.FirstOrDefault());
CameraAxisManager.TopPositionAndWideCameraAxisDevices.Add(CameraAxisManager.WideCameraAxisDevices.FirstOrDefault());
}
}
private Dictionary<string, IAxis> GetAxes()
{
// 收集所有轴到列表,先做空检查以免抛出 null 引用
var allAxes = new List<IAxis>();
if (AcsCard?.Axises != null)
{
allAxes.AddRange(AcsCard.Axises);
}
if (TdCard?.Axises != null)
{
allAxes.AddRange(TdCard.Axises);
}
var dict = new Dictionary<string, IAxis>(allAxes.Count , StringComparer.Ordinal);
foreach (var axis in allAxes)
{
if (axis == null) continue;
var name = axis.Name;
if (string.IsNullOrEmpty(name)) continue;
dict[name] = axis;
}
return dict;
}
public IAxis GetAxisByName(string axisName)
{
return GetAxisInternal(axisName);
}
public bool TryGetDeltaIoExtend(out IDeltaIoExtend deltaIoExtend)
{
deltaIoExtend = TdCard.Controller as IDeltaIoExtend;
return deltaIoExtend != null;
}
public bool TryReadLogisticsIoSnapshot(out DeviceIoSnapshot snapshot)
{
snapshot = new DeviceIoSnapshot
{
IsValid = false
};
if (TdCard == null)
{
return false;
}
return false;
}
public IReadOnlyList<DeviceIoPointDefinition> GetIoDefinitionsByModule(string module)
{
if (string.IsNullOrWhiteSpace(module))
{
return new List<DeviceIoPointDefinition>();
}
List<DeviceIoPointDefinition> list;
if (_ioPointDefinitionsByModule.TryGetValue(module, out list))
{
return list;
}
return new List<DeviceIoPointDefinition>();
}
private void LoadIoPointDefinitions()
{
_ioPointDefinitions.Clear();
_ioPointDefinitionsByModule.Clear();
var pointKeys = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
var names = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
var path = ResolveIoConfigPath();
if (string.IsNullOrWhiteSpace(path) || !File.Exists(path))
{
return;
}
var lines = File.ReadAllLines(path, Encoding.UTF8);
for (var i = 0; i < lines.Length; i++)
{
var raw = lines[i];
if (string.IsNullOrWhiteSpace(raw))
{
continue;
}
var line = raw.Trim();
if (line.StartsWith("#"))
{
continue;
}
if (i == 0 && line.IndexOf("Id", StringComparison.OrdinalIgnoreCase) >= 0)
{
continue;
}
var cols = line.Split(',');
if (cols.Length < 9)
{
continue;
}
int id;
if (!int.TryParse(cols[0].Trim(), out id))
{
continue;
}
var hasModuleColumn = cols.Length >= 10;
var moduleIndex = hasModuleColumn ? 1 : -1;
var nameIndex = hasModuleColumn ? 2 : 1;
var typeIndex = hasModuleColumn ? 3 : 2;
var cardIndex = hasModuleColumn ? 4 : 3;
var stationIndex = hasModuleColumn ? 5 : -1;
var lineNoIndex = hasModuleColumn ? 6 : -1;
var enabledIndex = hasModuleColumn ? 7 : 4;
var defaultValueIndex = hasModuleColumn ? 8 : 5;
var isInverseIndex = hasModuleColumn && cols.Length >= 11 ? 9 : -1;
var descriptionIndex = hasModuleColumn ? (isInverseIndex >= 0 ? 10 : 9) : 6;
var name = cols[nameIndex].Trim();
if (string.IsNullOrWhiteSpace(name))
{
continue;
}
var module = hasModuleColumn ? cols[moduleIndex].Trim() : ResolveModuleFromName(name);
if (string.IsNullOrWhiteSpace(module))
{
module = "Default";
}
var type = ParseIoPointType(cols[typeIndex]);
var card = ParseIoCardType(cols[cardIndex]);
var stationNo = stationIndex >= 0 ? ParseInt(cols[stationIndex]) : 0;
var lineNo = lineNoIndex >= 0 ? cols[lineNoIndex].Trim() : string.Empty;
var pointKey = DeviceIoPointDefinition.BuildPointKey(type, card, stationNo, lineNo);
if (!pointKeys.Add(pointKey))
{
continue;
}
if (!names.Add(name))
{
continue;
}
var definition = new DeviceIoPointDefinition
{
Id = id,
PointKey = pointKey,
Module = module,
Name = name,
Type = type,
Card = card,
StationNo = stationNo,
LineNo = lineNo,
Enabled = ParseBoolean(cols[enabledIndex], true),
DefaultValue = ParseBoolean(cols[defaultValueIndex], false),
IsInverse = isInverseIndex >= 0 && isInverseIndex < cols.Length && ParseBoolean(cols[isInverseIndex], false),
Description = cols.Length > descriptionIndex ? string.Join(",", cols.Skip(descriptionIndex)).Trim() : string.Empty
};
_ioPointDefinitions.Add(definition);
List<DeviceIoPointDefinition> moduleDefinitions;
if (!_ioPointDefinitionsByModule.TryGetValue(module, out moduleDefinitions))
{
moduleDefinitions = new List<DeviceIoPointDefinition>();
_ioPointDefinitionsByModule[module] = moduleDefinitions;
}
moduleDefinitions.Add(definition);
}
}
private static string ResolveModuleFromName(string name)
{
if (string.IsNullOrWhiteSpace(name))
{
return "Default";
}
var parts = name.Split('.');
if (parts.Length >= 2)
{
return parts[1];
}
return "Default";
}
private static IoPointType ParseIoPointType(string raw)
{
if (string.IsNullOrWhiteSpace(raw))
{
return IoPointType.Input;
}
var text = raw.Trim();
if (string.Equals(text, "Output", StringComparison.OrdinalIgnoreCase) ||
string.Equals(text, "OUT", StringComparison.OrdinalIgnoreCase) ||
string.Equals(text, "DO", StringComparison.OrdinalIgnoreCase) ||
string.Equals(text, "O", StringComparison.OrdinalIgnoreCase))
{
return IoPointType.Output;
}
return IoPointType.Input;
}
private static IoCardType ParseIoCardType(string raw)
{
if (string.IsNullOrWhiteSpace(raw))
{
return IoCardType.Td;
}
var text = raw.Trim();
if (string.Equals(text, "Acs", StringComparison.OrdinalIgnoreCase) ||
string.Equals(text, "ACS", StringComparison.OrdinalIgnoreCase))
{
return IoCardType.Acs;
}
return IoCardType.Td;
}
private static bool ParseBoolean(string raw, bool defaultValue)
{
if (string.IsNullOrWhiteSpace(raw))
{
return defaultValue;
}
var text = raw.Trim();
if (string.Equals(text, "1", StringComparison.OrdinalIgnoreCase) ||
string.Equals(text, "true", StringComparison.OrdinalIgnoreCase) ||
string.Equals(text, "yes", StringComparison.OrdinalIgnoreCase) ||
string.Equals(text, "y", StringComparison.OrdinalIgnoreCase))
{
return true;
}
if (string.Equals(text, "0", StringComparison.OrdinalIgnoreCase) ||
string.Equals(text, "false", StringComparison.OrdinalIgnoreCase) ||
string.Equals(text, "no", StringComparison.OrdinalIgnoreCase) ||
string.Equals(text, "n", StringComparison.OrdinalIgnoreCase))
{
return false;
}
return defaultValue;
}
private static int ParseInt(string raw)
{
int value;
return int.TryParse((raw ?? string.Empty).Trim(), out value) ? value : 0;
}
internal bool TryReadIoPointValues(IReadOnlyList<DeviceIoPointDefinition> definitions, out Dictionary<string, bool> values)
{
values = new Dictionary<string, bool>(StringComparer.OrdinalIgnoreCase);
if (definitions == null || definitions.Count == 0)
{
return false;
}
bool hasAnyValue = false;
IDeltaIoExtend deltaIoExtend;
bool canReadDelta = TryGetDeltaIoExtend(out deltaIoExtend);
List<DeviceIoPointDefinition> deltaDefinitions = new List<DeviceIoPointDefinition>();
foreach (DeviceIoPointDefinition definition in definitions)
{
if (definition == null)
{
continue;
}
bool simulatedValue;
if (!string.IsNullOrWhiteSpace(definition.PointKey) && _simulatedIoStates.TryGetValue(definition.PointKey, out simulatedValue))
{
values[definition.PointKey] = simulatedValue;
hasAnyValue = true;
continue;
}
if (definition.Card == IoCardType.Td && canReadDelta)
{
deltaDefinitions.Add(definition);
continue;
}
bool singleValue;
if (TryReadIoPointValue(definition, out singleValue))
{
values[definition.PointKey] = singleValue;
hasAnyValue = true;
}
}
IEnumerable<IGrouping<string, DeviceIoPointDefinition>> groups = deltaDefinitions.GroupBy(BuildDeltaReadGroupKey);
foreach (IGrouping<string, DeviceIoPointDefinition> group in groups)
{
if (TryReadDeltaIoPointGroup(group, deltaIoExtend, values))
{
hasAnyValue = true;
continue;
}
foreach (DeviceIoPointDefinition definition in group)
{
bool singleValue;
if (TryReadDeltaIoPoint(definition, deltaIoExtend, out singleValue))
{
values[definition.PointKey] = singleValue;
hasAnyValue = true;
}
}
}
return hasAnyValue;
}
internal bool TryReadIoPointValue(DeviceIoPointDefinition definition, out bool value)
{
value = false;
if (definition == null)
{
return false;
}
if (!string.IsNullOrWhiteSpace(definition.PointKey) && _simulatedIoStates.TryGetValue(definition.PointKey, out value))
{
return true;
}
var card = definition.Card == IoCardType.Acs ? AcsCard : TdCard;
if (card == null)
{
return false;
}
if (definition.Card == IoCardType.Td)
{
IDeltaIoExtend deltaIoExtend;
if (!TryGetDeltaIoExtend(out deltaIoExtend))
{
return false;
}
return TryReadDeltaIoPoint(definition, deltaIoExtend, out value);
}
return false;
}
private bool TryReadDeltaIoPoint(DeviceIoPointDefinition definition, IDeltaIoExtend deltaIoExtend, out bool value)
{
value = false;
if (definition == null || deltaIoExtend == null)
{
return false;
}
ushort cardNo;
ushort node;
ushort slot;
ushort index;
ushort subIndex;
byte bitNo;
ushort ioType;
if (!TryGetDeltaIoReadParameters(definition, out cardNo, out node, out slot, out index, out subIndex, out bitNo, out ioType))
{
return false;
}
bool rawValue;
ushort result = deltaIoExtend.ReadBit(cardNo, node, slot, index, subIndex, bitNo, out rawValue, ioType);
if (result != 0)
{
return false;
}
value = definition.IsInverse ? !rawValue : rawValue;
return true;
}
private bool TryReadDeltaIoPointGroup(IGrouping<string, DeviceIoPointDefinition> group, IDeltaIoExtend deltaIoExtend, IDictionary<string, bool> values)
{
if (group == null || deltaIoExtend == null || values == null)
{
return false;
}
DeviceIoPointDefinition firstDefinition = group.FirstOrDefault();
if (firstDefinition == null)
{
return false;
}
ushort cardNo;
ushort node;
ushort slot;
ushort ioType;
if (!TryGetDeltaGroupParameters(firstDefinition, out cardNo, out node, out slot, out ioType))
{
return false;
}
List<BitItem> points = new List<BitItem>();
Dictionary<string, DeviceIoPointDefinition> definitionsByPointKey = new Dictionary<string, DeviceIoPointDefinition>(StringComparer.OrdinalIgnoreCase);
foreach (DeviceIoPointDefinition definition in group)
{
ushort index;
ushort subIndex;
byte bitNo;
if (!TryGetDeltaPointAddress(definition, out index, out subIndex, out bitNo))
{
return false;
}
BitItem point = new BitItem();
point.Name = definition.PointKey;
point.Index = index;
point.SubIndex = subIndex;
point.BitNo = bitNo;
points.Add(point);
definitionsByPointKey[definition.PointKey] = definition;
}
ushort result = deltaIoExtend.ReadBits(cardNo, node, slot, points, ioType);
if (result != 0)
{
return false;
}
foreach (BitItem point in points)
{
DeviceIoPointDefinition definition;
if (!definitionsByPointKey.TryGetValue(point.Name ?? string.Empty, out definition))
{
continue;
}
values[definition.PointKey] = definition.IsInverse ? !point.Value : point.Value;
}
return true;
}
private bool TryGetDeltaIoReadParameters(DeviceIoPointDefinition definition, out ushort cardNo, out ushort node, out ushort slot, out ushort index, out ushort subIndex, out byte bitNo, out ushort ioType)
{
cardNo = 0;
node = 0;
slot = 0;
index = 0;
subIndex = 0;
bitNo = 0;
ioType = 0;
if (!TryGetDeltaGroupParameters(definition, out cardNo, out node, out slot, out ioType))
{
return false;
}
return TryGetDeltaPointAddress(definition, out index, out subIndex, out bitNo);
}
private bool TryGetDeltaIoWriteParameters(DeviceIoPointDefinition definition, out ushort cardNo, out ushort node, out ushort slot, out ushort index, out ushort subIndex, out byte bitNo, out ushort readIoType)
{
cardNo = 0;
node = 0;
slot = 0;
index = 0;
subIndex = 0;
bitNo = 0;
readIoType = 0;
if (!TryGetDeltaGroupParameters(definition, out cardNo, out node, out slot, out readIoType))
{
return false;
}
return TryGetDeltaPointAddress(definition, out index, out subIndex, out bitNo);
}
private bool TryGetDeltaGroupParameters(DeviceIoPointDefinition definition, out ushort cardNo, out ushort node, out ushort slot, out ushort ioType)
{
cardNo = 0;
node = 0;
slot = 0;
ioType = 0;
if (definition == null)
{
return false;
}
if (!TryConvertToUShort(definition.StationNo, out cardNo))
{
return false;
}
node = DeltaDefaultNode;
slot = DeltaDefaultSlot;
ioType = definition.Type == IoPointType.Output ? (ushort)1 : (ushort)0;
return true;
}
private bool TryGetDeltaPointAddress(DeviceIoPointDefinition definition, out ushort index, out ushort subIndex, out byte bitNo)
{
index = 0;
subIndex = 0;
bitNo = 0;
if (definition == null)
{
return false;
}
if (!TryConvertHexIntToUShort(definition.Index, out index) ||
!TryConvertHexIntToUShort(definition.SubIndex, out subIndex) ||
!TryResolveBitNo(definition, out bitNo))
{
return false;
}
return true;
}
private static bool TryConvertHexIntToUShort(int value, out ushort ushortValue)
{
ushortValue = 0;
string hexText = value.ToString(CultureInfo.InvariantCulture);
return ushort.TryParse(hexText, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out ushortValue);
}
private static bool TryResolveBitNo(DeviceIoPointDefinition definition, out byte bitNo)
{
bitNo = 0;
if (definition == null)
{
return false;
}
int lineNoBitIndex;
if (TryParseBitIndexFromLineNo(definition.LineNo, out lineNoBitIndex))
{
bitNo = (byte)(lineNoBitIndex % 8);
return true;
}
if (definition.Id < 0)
{
return false;
}
bitNo = (byte)(definition.Id % 8);
return true;
}
private static bool TryParseBitIndexFromLineNo(string lineNo, out int bitIndex)
{
bitIndex = 0;
if (string.IsNullOrWhiteSpace(lineNo))
{
return false;
}
string text = lineNo.Trim();
if (text.Length < 2)
{
return false;
}
string suffix = text.Substring(text.Length - 2, 2);
return int.TryParse(suffix, out bitIndex);
}
private static bool TryConvertToUShort(int value, out ushort ushortValue)
{
ushortValue = 0;
if (value < ushort.MinValue || value > ushort.MaxValue)
{
return false;
}
ushortValue = (ushort)value;
return true;
}
private static string BuildDeltaReadGroupKey(DeviceIoPointDefinition definition)
{
if (definition == null)
{
return string.Empty;
}
return string.Format(
"{0}:{1}:{2}:{3}:{4}",
definition.Card,
definition.StationNo,
definition.Type,
definition.Index,
definition.SubIndex);
}
internal bool TryWriteIoPointValue(DeviceIoPointDefinition definition, bool outputOn)
{
if (definition == null)
{
return false;
}
if (!string.IsNullOrWhiteSpace(definition.PointKey))
{
_simulatedIoStates[definition.PointKey] = outputOn;
}
var card = definition.Card == IoCardType.Acs ? AcsCard : TdCard;
if (card == null)
{
return true;
}
bool rawOutput = definition.IsInverse ? !outputOn : outputOn;
if (definition.Card == IoCardType.Td)
{
IDeltaIoExtend deltaIoExtend;
if (!TryGetDeltaIoExtend(out deltaIoExtend))
{
return false;
}
ushort cardNo;
ushort node;
ushort slot;
ushort index;
ushort subIndex;
byte bitNo;
ushort readIoType;
if (!TryGetDeltaIoWriteParameters(definition, out cardNo, out node, out slot, out index, out subIndex, out bitNo, out readIoType))
{
return false;
}
ushort result = deltaIoExtend.WriteBit(cardNo, node, slot, index, subIndex, bitNo, rawOutput, readIoType);
return result == 0;
}
return false;
}
private static string ResolveIoConfigPath()
{
var baseDir = AppDomain.CurrentDomain.BaseDirectory;
var localPath = Path.Combine(baseDir, "Configuration", DeviceIoConfigFileName);
var sourcePath = ResolveRootConfigPath(baseDir, DeviceIoConfigFileName);
if (TrySyncConfigToLocal(sourcePath, localPath))
{
return localPath;
}
return File.Exists(localPath) ? localPath : null;
}
private static string ResolveRootConfigPath(string baseDir, string fileName)
{
var current = new DirectoryInfo(baseDir);
while (current != null)
{
var rootConfigDir = Path.Combine(current.FullName, "Configuration");
if (Directory.Exists(rootConfigDir) && Directory.Exists(Path.Combine(current.FullName, "MainShell")))
{
var path = Path.Combine(rootConfigDir, fileName);
if (File.Exists(path))
{
return path;
}
}
current = current.Parent;
}
return null;
}
private static bool TrySyncConfigToLocal(string sourcePath, string localPath)
{
if (string.IsNullOrWhiteSpace(sourcePath) || !File.Exists(sourcePath))
{
return false;
}
if (!string.Equals(Path.GetFullPath(sourcePath), Path.GetFullPath(localPath), StringComparison.OrdinalIgnoreCase))
{
var localDir = Path.GetDirectoryName(localPath);
if (!string.IsNullOrWhiteSpace(localDir))
{
Directory.CreateDirectory(localDir);
}
if (!File.Exists(localPath) || File.GetLastWriteTimeUtc(localPath) < File.GetLastWriteTimeUtc(sourcePath))
{
File.Copy(sourcePath, localPath, true);
}
}
return true;
}
#region // 获取相机
public MwCameraExtend GetCamera(CameraType cameraType)
{
switch (cameraType)
{
case CameraType.MapCamera:
return BottomCameraExtend;
case CameraType.TopWideCamera:
return TopWideCameraExtend;
case CameraType.TopPositionCamera:
return TopCameraExtend;
case CameraType.TopWideWsCamera:
return TopWideWsCameraExtend;
case CameraType.TopWsCamera:
return TopWsCameraExtend;
}
throw new Exception("未知的相机类型,请检查相机类型参数");
}
public string GetCameraName(CameraType cameraType)
{
var cameraExtend = GetCamera(cameraType);
return cameraExtend != null ? cameraExtend.Name : throw new Exception("未知的相机类型,请检查相机类型参数");
}
#endregion
#region //设置光源强度
private void SetLightIntensity(MwLight light, int intensity)
{
if (light != null)
{
light.Intensity = intensity;
}
}
private int GetLightIntensity(MwLight light)
{
if (light != null)
{
return light.Intensity;
}
return 0;
}
public void SetUpPointRedLightIntensity(int intensity)
{
SetLightIntensity(Up_PointRedLight, intensity);
}
public void SetUpRingRedLightIntensity(int intensity)
{
SetLightIntensity(Up_RingRedLight, intensity);
}
public void SetUpPointBlueLightIntensity(int intensity)
{
SetLightIntensity(Up_PointBlueLight, intensity);
}
public void SetUpRingBlueLightIntensity(int intensity)
{
SetLightIntensity(Up_RingBlueLight, intensity);
}
public void SetDownPointRedLightIntensity(int intensity)
{
SetLightIntensity(Down_PointRedLight, intensity);
}
public void SetDownRingRedLightIntensity(int intensity)
{
SetLightIntensity(Down_RingRedLight, intensity);
}
public void SetDownPointBlueLightIntensity(int intensity)
{
SetLightIntensity(Down_PointBlueLight, intensity);
}
public void SetDownRingBlueLightIntensity(int intensity)
{
SetLightIntensity(Down_RingBlueLight, intensity);
}
public void SetMapRedLightIntensity(int intensity)
{
SetLightIntensity(Map_RedLight, intensity);
}
public void SetMapBlueLightIntensity(int intensity)
{
SetLightIntensity(Map_BlueLight, intensity);
}
public void SetUpRedBackLightIntensity(int intensity)
{
SetLightIntensity(Up_RedBackLight, intensity);
}
public int GetUpPointRedLightIntensity()
{
return GetLightIntensity(Up_PointRedLight);
}
public int GetUpRingRedLightIntensity()
{
return GetLightIntensity(Up_RingRedLight);
}
public int GetUpPointBlueLightIntensity()
{
return GetLightIntensity(Up_PointBlueLight);
}
public int GetUpRingBlueLightIntensity()
{
return GetLightIntensity(Up_RingBlueLight);
}
public int GetDownPointRedLightIntensity()
{
return GetLightIntensity(Down_PointRedLight);
}
public int GetDownRingRedLightIntensity()
{
return GetLightIntensity(Down_RingRedLight);
}
public int GetDownPointBlueLightIntensity()
{
return GetLightIntensity(Down_PointBlueLight);
}
public int GetDownRingBlueLightIntensity()
{
return GetLightIntensity(Down_RingBlueLight);
}
public int GetMapRedLightIntensity()
{
return GetLightIntensity(Map_RedLight);
}
public int GetMapBlueLightIntensity()
{
return GetLightIntensity(Map_BlueLight);
}
public int GetUpRedBackLightIntensity()
{
return GetLightIntensity(Up_RedBackLight);
}
#endregion
}
}