2022-11-18 12:22:48 +08:00
|
|
|
|
// /************************************************************************
|
|
|
|
|
// * @file DeviceLockerManager.cs
|
|
|
|
|
// * @author Su Liang
|
|
|
|
|
// * @date 2022/11/18
|
|
|
|
|
// *
|
|
|
|
|
// * @copyright © Sicentury Inc.
|
|
|
|
|
// *
|
|
|
|
|
// * @brief 设备锁定控制类。
|
|
|
|
|
// *
|
|
|
|
|
// * @details 系统中的某些设备会被多个模块共同使用,例如Pump2被LoadLock和UnLoad共用,这类设备
|
|
|
|
|
// * 无法同时被使用;为提高设备利用率,并解决设备冲突竞争问题,请使用该类对设备进行锁定。
|
|
|
|
|
// *
|
|
|
|
|
// * *****************************************************************************/
|
|
|
|
|
|
2022-11-18 15:07:11 +08:00
|
|
|
|
using System;
|
2022-11-18 12:22:48 +08:00
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using Aitex.Core.Util;
|
2022-11-18 15:07:11 +08:00
|
|
|
|
using MECF.Framework.RT.EquipmentLibrary.Core.Exceptions;
|
2022-11-18 12:22:48 +08:00
|
|
|
|
using Sicentury.Core;
|
|
|
|
|
|
|
|
|
|
namespace MECF.Framework.RT.EquipmentLibrary.Core
|
|
|
|
|
{
|
|
|
|
|
public class DeviceLockerManager : Singleton<DeviceLockerManager>
|
|
|
|
|
{
|
|
|
|
|
public enum LockerNames
|
|
|
|
|
{
|
|
|
|
|
Pump2
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private readonly Dictionary<string, DeviceLocker> _lockerCollection;
|
|
|
|
|
|
|
|
|
|
public DeviceLockerManager()
|
|
|
|
|
{
|
|
|
|
|
_lockerCollection = new Dictionary<string, DeviceLocker>();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Initialize()
|
|
|
|
|
{
|
|
|
|
|
_lockerCollection.Add(LockerNames.Pump2.ToString(), new DeviceLocker(LockerNames.Pump2.ToString(), 1));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public DeviceLocker GetLocker(LockerNames lockerNames)
|
|
|
|
|
{
|
|
|
|
|
if (_lockerCollection.ContainsKey(lockerNames.ToString()) == false)
|
|
|
|
|
return null;
|
|
|
|
|
|
|
|
|
|
return _lockerCollection[lockerNames.ToString()];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2022-11-18 15:07:11 +08:00
|
|
|
|
/// <summary>
|
2022-11-18 12:22:48 +08:00
|
|
|
|
/// 锁定指定的设备锁。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="lockerName">锁名称</param>
|
|
|
|
|
/// <param name="occupier">占用者名称,当前锁被谁占用。</param>
|
|
|
|
|
/// <param name="reason">锁定失败后的错误信息。</param>
|
|
|
|
|
/// <param name="timeoutMillisecond">等待锁定的超时时间,超过此时间后如果还未成功锁定,则返回False</param>
|
|
|
|
|
/// <returns>True:锁定成功;False:锁定失败</returns>
|
2022-11-18 15:07:11 +08:00
|
|
|
|
public DeviceLocker.Results TryLock(string lockerName, string occupier, out string reason, int timeoutMillisecond = 50)
|
2022-11-18 12:22:48 +08:00
|
|
|
|
{
|
|
|
|
|
if (_lockerCollection.ContainsKey(lockerName) == false)
|
2022-11-18 15:07:11 +08:00
|
|
|
|
throw new DeviceLockerNotFoundException(lockerName);
|
2022-11-18 12:22:48 +08:00
|
|
|
|
|
|
|
|
|
var locker = _lockerCollection[lockerName];
|
2022-11-18 15:07:11 +08:00
|
|
|
|
return locker.TryLock(occupier, out reason, timeoutMillisecond);
|
2022-11-18 12:22:48 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 锁定指定的设备锁。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="lockerName">锁名称</param>
|
|
|
|
|
/// <param name="occupier">占用者名称,当前锁被谁占用。</param>
|
|
|
|
|
/// <param name="reason">锁定失败后的错误信息。</param>
|
|
|
|
|
/// <param name="timeoutMillisecond">等待锁定的超时时间,超过此时间后如果还未成功锁定,则返回False</param>
|
|
|
|
|
/// <returns>True:锁定成功;False:锁定失败</returns>
|
2022-11-18 15:07:11 +08:00
|
|
|
|
public DeviceLocker.Results TryLock(LockerNames lockerName, string occupier, out string reason, int timeoutMillisecond = 50)
|
2022-11-18 12:22:48 +08:00
|
|
|
|
{
|
|
|
|
|
return TryLock(lockerName.ToString(), occupier, out reason, timeoutMillisecond);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 解除设备锁定。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="lockerName">锁名称</param>
|
|
|
|
|
/// <param name="occupier">占用者名称,当前锁被谁解锁。</param>
|
|
|
|
|
/// <para>注意:只能解锁被自己锁定的设备锁!</para>
|
|
|
|
|
/// <param name="reason">解锁失败后的错误信息</param>
|
|
|
|
|
/// <returns>True:解锁成功;False:解锁失败</returns>
|
2022-11-18 15:07:11 +08:00
|
|
|
|
public DeviceLocker.Results TryUnLock(string lockerName, string occupier, out string reason)
|
2022-11-18 12:22:48 +08:00
|
|
|
|
{
|
|
|
|
|
if (_lockerCollection.ContainsKey(lockerName) == false)
|
2022-11-18 15:07:11 +08:00
|
|
|
|
throw new DeviceLockerNotFoundException(lockerName);
|
2022-11-18 12:22:48 +08:00
|
|
|
|
|
|
|
|
|
var locker = _lockerCollection[lockerName];
|
2022-11-18 15:07:11 +08:00
|
|
|
|
return locker.TryUnlock(occupier, out reason);
|
2022-11-18 12:22:48 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 解除设备锁定。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="lockerName">锁名称</param>
|
|
|
|
|
/// <param name="occupier">占用者名称,当前锁被谁解锁。</param>
|
|
|
|
|
/// <para>注意:只能解锁被自己锁定的设备锁!</para>
|
|
|
|
|
/// <param name="reason">解锁失败后的错误信息</param>
|
|
|
|
|
/// <returns>True:解锁成功;False:解锁失败</returns>
|
2022-11-18 15:07:11 +08:00
|
|
|
|
public DeviceLocker.Results TryUnLock(LockerNames lockerName, string occupier, out string reason)
|
2022-11-18 12:22:48 +08:00
|
|
|
|
{
|
|
|
|
|
return TryUnLock(lockerName.ToString(), occupier, out reason);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 复位设备锁。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="lockerName">锁名称</param>
|
|
|
|
|
/// <param name="reason">复位失败原因</param>
|
|
|
|
|
/// <returns>True:复位成功;False:复位失败</returns>
|
2022-11-18 15:07:11 +08:00
|
|
|
|
public DeviceLocker.Results Reset(string lockerName, out string reason)
|
2022-11-18 12:22:48 +08:00
|
|
|
|
{
|
|
|
|
|
if (_lockerCollection.ContainsKey(lockerName) == false)
|
2022-11-18 15:07:11 +08:00
|
|
|
|
throw new DeviceLockerNotFoundException(lockerName);
|
2022-11-18 12:22:48 +08:00
|
|
|
|
|
|
|
|
|
reason = "";
|
|
|
|
|
var locker = _lockerCollection[lockerName];
|
|
|
|
|
locker.Reset();
|
2022-11-18 15:07:11 +08:00
|
|
|
|
return DeviceLocker.Results.Ok;
|
2022-11-18 12:22:48 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 复位设备锁。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="lockerName">锁名称</param>
|
|
|
|
|
/// <param name="reason">复位失败原因</param>
|
|
|
|
|
/// <returns>True:复位成功;False:复位失败</returns>
|
2022-11-18 15:07:11 +08:00
|
|
|
|
public DeviceLocker.Results Reset(LockerNames lockerName, out string reason)
|
2022-11-18 12:22:48 +08:00
|
|
|
|
{
|
|
|
|
|
return Reset(lockerName.ToString(), out reason);
|
2022-11-18 15:07:11 +08:00
|
|
|
|
}
|
2022-11-18 12:22:48 +08:00
|
|
|
|
}
|
|
|
|
|
}
|