using System;
using System.Threading;
using SHJX.Service.Common.Extend;
using SHJX.Service.Common.ReadXML;
using SHJX.Service.Model.Control;
using SHJX.Service.ServerClient.Interface;
using SHJX.Service.ServerClient.TempController;
using SHJX.Service.Common.Logging;
using Microsoft.Extensions.Logging;
namespace SHJX.Service.ServerClient.RS485Control
{
///
/// MotorZ通信
///
public class MotorZPort : SerialPortImp, PortControlImp
{
private static readonly ILogger logger = LogFactory.BuildLogger(typeof(MotorZPort));
///
/// Z轴
///
/// 日志
/// 配置
public MotorZPort( ReadConfigUtil config)
: base( config)
{
config.GetSpeed.ForEach(item => {
if (item.NodeName == "MotorZ")
speedZ = item.Speed;
});
}
private double speedZ = 0;
public object Read(PortArgs args)
{
object res = args.ReadWay switch
{
"OriginalPosition" => GetOriginalPosition(args),
_ => JudgeStorage(args.NodeId),
};
return res;
}
public object GetOriginalPosition(PortArgs args)
{
var res = JudgeStorage(args.NodeId);
if (res is null or { Length: 0 }) return false;
return res[2].Equals('0');
}
public bool Write(PortArgs args)
{
//var portArgs = new PortArgs
//{
// TypeName = "Mani",
// NodeId = 3,
// ReadWay = "Judge"
//};
long distance = args.Distance;
//var resbool = GetJudge(portArgs);
//if (resbool)
//{
// distance /= 2;//通过判断抓手状态决定Z轴运行距离
//}
var res = args.WriteWay switch
{
WriteWay.Move => zmove(args),
WriteWay.GoBack => MotorGoBack(args.NodeId, 3),
WriteWay.Stop => MotorStop(args.NodeId),
WriteWay.Speed => MotorSpeed(args.NodeId, args.Distance),
WriteWay.AcSpeed => MotorAcSpeed(args.NodeId, args.Distance),
WriteWay.DeSpeed => MotorDeSpeed(args.NodeId, args.Distance),
_ => throw new ArgumentNullException(args.WriteWay.GetEnumDesc()),
};
return res;
}
private bool zmove(PortArgs args)
{
string res1 = "";
while (res1 != "0009\r" && res1 != "0209\r")
{
var storageRes = JudgeXYZMove(1);//Z轴动之前x轴要静止
if (storageRes.Equals("")) return false;
res1 = storageRes;
Thread.Sleep(300);
}
res1 = "";
while (res1 != "0009\r" && res1 != "0209\r")
{
var storageRes = JudgeXYZMove(2);//Z轴动之前Y轴要静止
if (storageRes.Equals("")) return false;
res1 = storageRes;
Thread.Sleep(300);
}
return Move(args.NodeId, args.Distance, 50, speedZ);
}
}
}