Sic.Framework-Nanjing-Baishi/MECF.Framework.RT.Equipment.../Core/DeviceLockerManager.cs

164 lines
6.8 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.

// /************************************************************************
// * @file DeviceLockerManager.cs
// * @author Su Liang
// * @date 2022/11/18
// *
// * @copyright &copy Sicentury Inc.
// *
// * @brief 设备锁定控制类。
// *
// * @details 系统中的某些设备会被多个模块共同使用例如Pump2被LoadLock和UnLoad共用这类设备
// * 无法同时被使用;为提高设备利用率,并解决设备冲突竞争问题,请使用该类对设备进行锁定。
// *
// * *****************************************************************************/
using System;
using System.Collections.Generic;
using System.Threading;
using Aitex.Core.Util;
using MECF.Framework.RT.EquipmentLibrary.Core.Exceptions;
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));
}
/// <summary>
/// 获取指定名称的锁。
/// <para>通常一个锁对应一个设备,系统中可用的锁放在列表中,锁名称使用<see cref="LockerNames"/>枚举定义。</para>
/// </summary>
/// <param name="lockerNames"></param>
/// <returns></returns>
public DeviceLocker GetLocker(LockerNames lockerNames)
{
if (_lockerCollection.ContainsKey(lockerNames.ToString()) == false)
return null;
return _lockerCollection[lockerNames.ToString()];
}
/// <summary>
/// 锁定指定的设备锁。
/// </summary>
/// <param name="lockerName">锁名称</param>
/// <param name="occupier">占用者名称,当前锁被谁占用。</param>
/// <param name="reason">锁定失败后的错误信息。</param>
/// <param name="ct">终止等待锁定。<see cref="CancellationToken"/></param>
/// <param name="timeoutMillisecond">等待锁定的超时时间超过此时间后如果还未成功锁定则返回False</param>
/// <returns>True锁定成功False锁定失败</returns>
public DeviceLocker.Results TryLock(string lockerName, string occupier, out string reason, int timeoutMillisecond = 50)
{
if (_lockerCollection.ContainsKey(lockerName) == false)
throw new DeviceLockerNotFoundException(lockerName);
var locker = _lockerCollection[lockerName];
return locker.TryLock(occupier, out reason, timeoutMillisecond);
}
/// <summary>
/// 锁定指定的设备锁。
/// </summary>
/// <param name="lockerName">锁名称</param>
/// <param name="occupier">占用者名称,当前锁被谁占用。</param>
/// <param name="reason">锁定失败后的错误信息。</param>
/// <param name="ct">终止等待锁定。<see cref="CancellationToken"/></param>
/// <param name="timeoutMillisecond">等待锁定的超时时间超过此时间后如果还未成功锁定则返回False</param>
/// <returns>True锁定成功False锁定失败</returns>
public DeviceLocker.Results TryLock(LockerNames lockerName, string occupier, out string reason, int timeoutMillisecond = 50)
{
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>
public DeviceLocker.Results TryUnLock(string lockerName, string occupier, out string reason)
{
if (_lockerCollection.ContainsKey(lockerName) == false)
throw new DeviceLockerNotFoundException(lockerName);
var locker = _lockerCollection[lockerName];
return locker.TryUnlock(occupier, out reason);
}
/// <summary>
/// 解除设备锁定。
/// </summary>
/// <param name="lockerName">锁名称</param>
/// <param name="occupier">占用者名称,当前锁被谁解锁。</param>
/// <para>注意:只能解锁被自己锁定的设备锁!</para>
/// <param name="reason">解锁失败后的错误信息</param>
/// <returns>True解锁成功False解锁失败</returns>
public DeviceLocker.Results TryUnLock(LockerNames lockerName, string occupier, out string reason)
{
return TryUnLock(lockerName.ToString(), occupier, out reason);
}
/// <summary>
/// 取消等待可用的锁。
/// </summary>
/// <param name="lockerName">锁名称</param>
/// <exception cref="DeviceLockerNotFoundException"></exception>
public void CancelLockWaiting(string lockerName)
{
if (_lockerCollection.ContainsKey(lockerName) == false)
throw new DeviceLockerNotFoundException(lockerName);
var locker = _lockerCollection[lockerName];
locker.CancelLockWaiting();
}
/// <summary>
/// 复位设备锁。
/// </summary>
/// <param name="lockerName">锁名称</param>
/// <param name="reason">复位失败原因</param>
/// <returns>True复位成功False复位失败</returns>
public DeviceLocker.Results Reset(string lockerName, out string reason)
{
if (_lockerCollection.ContainsKey(lockerName) == false)
throw new DeviceLockerNotFoundException(lockerName);
reason = "";
var locker = _lockerCollection[lockerName];
locker.Reset();
return DeviceLocker.Results.Ok;
}
/// <summary>
/// 复位设备锁。
/// </summary>
/// <param name="lockerName">锁名称</param>
/// <param name="reason">复位失败原因</param>
/// <returns>True复位成功False复位失败</returns>
public DeviceLocker.Results Reset(LockerNames lockerName, out string reason)
{
return Reset(lockerName.ToString(), out reason);
}
}
}