using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
namespace KinematicsBase
{
#region BaseClass
#region Data Define
///
/// 传感器类型
///
[Serializable]
public enum SensorType
{
///
/// 姿态传感器
///
Pose,
///
/// 关节距离传感器
///
Distance,
///
/// 关节传感器
/// 判断关节位置
///
Joint,
///
/// 接近传感器
///
Near,
///
/// 光电传感器
///
PhotoElectric,
///
/// 属性传感器
///
Attribution,
///
/// Joint的值变化 ture
/// 不变化 false
///
IsRun
}
///
/// 信号触发方式
///
/// [Serializable]
public enum TrigerType
{
Pulse,
Limit,
StepBegin,
StepEnd
}
[Serializable]
public enum SensorDataType
{
INT,
DINT,
FLOAT,
DOUBLE
}
#endregion
///
/// 姿态传感器
///
[Serializable]
public class Sensor
{
/////
///// 向外部发出传感器信号
/////
//public static event Action OnDataChange = null;
///
/// string ModeId, string PoseId, string JointId, string Id, object Value
///
public static event Action OnDataChange;
//public static event Action OnDataChangeBool;
//public static event Action OnDataChangeInt;
//public static event Action OnDataChangeFloat;
public string Id { get; set; }
public string Name { get; set; }
public string ModelId { get; set; }
public bool I = false;
public SensorType SensorType { get; set; }
public TrigerType TrigerType { get; set; }
public string PoseId { get; set; } = "";
///
/// PoseId =0和姿态距离传感器用
///
public string JointId { get; set; } = "";
public UnitType UnitType { get; set; }
public SensorDataType SensorDataType { get; set; }
///
/// 传感器是否启用
///
public bool IsEnable { get; set; }
/////
///// PLC 变量代码
/////
//public string SignalViewer_Id;
///
/// 姿态传感器 光电传感器
/// 触发后返回值 0,1
/// 或伺服值
///
public object Tagvalue { get; set; }
///
/// 触发值测试误差值上限
///
public double LimitUpValue { get; set; } = 2f;
///
/// 触发值测试误差值下限
///
public double LimitDownValue { get; set; } = -2f;
///
/// 光电传感器 检测长度用
///
public double Length { get; set; }
public double ValueFactor { get; set; } = 1;
public Sensor()
{
this.Id = Guid.NewGuid().ToString("D").ToUpper();
}
public void Setup()
{
switch (SensorType)
{
case SensorType.Pose:
SetupPose();
break;
case SensorType.Distance:
SetupDistance();
break;
case SensorType.Joint:
SetupJoint();
break;
}
}
private void SetupJoint()
{
bool isTriger = false;
//Kinematics k = DataBaseJson.dataBaseJson.KinematicsList.FirstOrDefault(t => t.ModelId == ModelId);
var k = PP.ModelCodeFindModelAttribute(ModelId).KinematicsData;
if (k == null) return;
var val = k.JointList.FirstOrDefault(t => t.Id == JointId).ValueCurrent;
var jValue = k.PoseList.FirstOrDefault(t => t.Id == PoseId).PoseInfo[JointId];
if ((val >= jValue + LimitDownValue) && (val <= jValue + LimitDownValue))
{
isTriger = true;
}
else
{
isTriger = false;
}
I = isTriger;
DataChange(ModelId, PoseId, JointId, Id, I);
}
private void SetupDistance()
{
// Kinematics k = DataBaseJson.dataBaseJson.KinematicsList.FirstOrDefault(t => t.ModelId == ModelId);
var k = PP.ModelCodeFindModelAttribute(ModelId).KinematicsData;
if (k == null) return;
double val = k.JointList.FirstOrDefault(t => t.Id == JointId).ValueCurrent;
object value;
switch (SensorDataType)
{
case SensorDataType.INT:
value = Convert.ToInt32(val);
DataChange(ModelId, PoseId, JointId, Id, value);
break;
case SensorDataType.DINT:
value = (long)val;
DataChange(ModelId, PoseId, JointId, Id, value);
break;
case SensorDataType.FLOAT:
value = (double)val;
DataChange(ModelId, PoseId, JointId, Id, value);
break;
case SensorDataType.DOUBLE:
value = (double)val;
DataChange(ModelId, PoseId, JointId, Id, value);
break;
}
}
private void SetupPose()
{
//double val = (double)vale;
bool isTriger = false;
bool isTrigerJoint;
int index = 0;
//Kinematics k = DataBaseJson.dataBaseJson.KinematicsList.FirstOrDefault(t => t.ModelId == ModelId);
var k = PP.ModelCodeFindModelAttribute(ModelId).KinematicsData;
if (k == null) return;
//监控POSE的全部姿态
var pose = k.PoseList.FirstOrDefault(t => t.Id == PoseId);
if (pose == null) return;
foreach (var item in pose.PoseInfo)
{
double currentValue = k.JointList.FirstOrDefault(t => t.Id == item.Key).ValueCurrent;
if ((currentValue >= item.Value + LimitDownValue) && (currentValue <= item.Value + LimitUpValue))
{
isTrigerJoint = true;
}
else
{
isTrigerJoint = false;
}
if (!isTrigerJoint)
{
isTriger = false;
break;
}
else
{
if (index == 0)
{
isTriger = isTrigerJoint;
}
else
{
isTriger = isTriger && isTrigerJoint;
}
if (isTriger == false)
{
break;
}
}
index++;
}
I = isTriger;
DataChange(ModelId, PoseId, JointId, Id, I);
}
public Sensor(SensorType SensorType)
{
this.Id = Guid.NewGuid().ToString("D").ToUpper();
Tagvalue = 0;
switch (SensorType)
{
case SensorType.IsRun:
Joint.OnDataChangeJointIsRun -= Joint_OnDataChangeJointIsRun;
Joint.OnDataChangeJointIsRun += Joint_OnDataChangeJointIsRun;
break;
default:
Joint.OnDataChange -= Joint_OnDataChange;
Joint.OnDataChange += Joint_OnDataChange;
break;
}
}
public void Joint_OnDataChangeJointIsRun(string modelId, string jointId, bool val)
{
if (this.ModelId == modelId && this.JointId == jointId)
{
I = val;
DataChange(ModelId, PoseId, JointId, Id, I);
}
}
public string CreateSensorPose(string modelId, string poseId)
{
this.Id = Guid.NewGuid().ToString("D").ToUpper();
Joint.OnDataChange -= Joint_OnDataChange;
Joint.OnDataChange += Joint_OnDataChange;
Tagvalue = 0;
this.IsEnable = true;
this.PoseId = poseId;
var kTemp = Kinematics.GetKinematicsByModelId(modelId);
{
this.Name = kTemp.ModelName + "_PS_Logical_1";
this.SensorType = SensorType.Pose;
}
this.ModelId = modelId;
this.LimitUpValue = 2;
this.LimitDownValue = -2;
kTemp.SensorList.Add(this);
// Kinematics.SaveToModel(kTemp);
if (GlobalEventInterface.E_Transmit_SaveToModel != null)
{
GlobalEventInterface.E_Transmit_SaveToModel(kTemp);
}
return Id;
}
public string CreateSensorJoint(string modelId, string poseId, string jointId)
{
this.Id = Guid.NewGuid().ToString("D").ToUpper();
Joint.OnDataChange -= Joint_OnDataChange;
Joint.OnDataChange += Joint_OnDataChange;
Tagvalue = 0;
this.IsEnable = true;
this.PoseId = poseId;
this.JointId = jointId;
var kTemp = Kinematics.GetKinematicsByModelId(modelId);
this.Name = kTemp.ModelName + "_PJ_Logical_1";
this.SensorType = SensorType.Joint;
this.ModelId = modelId;
this.LimitUpValue = 2;
this.LimitDownValue = -2;
kTemp.SensorList.Add(this);
// Kinematics.SaveToModel(kTemp);
if (GlobalEventInterface.E_Transmit_SaveToModel != null)
{
GlobalEventInterface.E_Transmit_SaveToModel(kTemp);
}
return Id;
}
public string CreateSensorJointIsRun(string modelId, string jointId)
{
this.Id = Guid.NewGuid().ToString("D").ToUpper();
Joint.OnDataChangeJointIsRun -= Joint_OnDataChangeJointIsRun;
Joint.OnDataChangeJointIsRun += Joint_OnDataChangeJointIsRun;
Tagvalue = 0;
this.IsEnable = true;
this.JointId = jointId;
var kTemp = Kinematics.GetKinematicsByModelId(modelId);
this.Name = kTemp.ModelName + "_Run_Logical_1";
this.SensorType = SensorType.IsRun;
this.ModelId = modelId;
kTemp.SensorList.Add(this);
// Kinematics.SaveToModel(kTemp);
if (GlobalEventInterface.E_Transmit_SaveToModel != null)
{
GlobalEventInterface.E_Transmit_SaveToModel(kTemp);
}
return Id;
}
public string CreateSensorPoseDistance(string modelId, string jointId, SensorDataType sensorDataType)
{
this.Id = Guid.NewGuid().ToString("D").ToUpper();
Joint.OnDataChange -= Joint_OnDataChange;
Joint.OnDataChange += Joint_OnDataChange;
Tagvalue = 0;
var kTemp = Kinematics.GetKinematicsByModelId(modelId);
this.IsEnable = true;
this.JointId = jointId;
this.SensorType = SensorType.Distance;
this.Name = kTemp.ModelName + "_JD_Logical_1";
this.ModelId = modelId;
this.SensorDataType = sensorDataType;
this.LimitUpValue = 2;
this.LimitDownValue = -2;
kTemp.SensorList.Add(this);
// Kinematics.SaveToModel(kTemp);
if (GlobalEventInterface.E_Transmit_SaveToModel != null)
{
GlobalEventInterface.E_Transmit_SaveToModel(kTemp);
}
return Id;
}
public static void DataChange(string ModeId, string PoseId, string JointId, string Id, object Value)
{
if (OnDataChange != null)
{
OnDataChange.Invoke(ModeId, PoseId, JointId, Id, Value);
}
}
public void Joint_OnDataChange(string modeId, string jointID, object val)
{
//if (this.Id == null) return;
if (this.ModelId == modeId)
{
Triger(jointID, val);
}
}
///
/// 根据Joint姿态的值,触发传感器信号
///
///
public void Triger(string jointID, object val)
{
switch (SensorType)
{
case SensorType.Pose:
TrigerPose(val);
break;
case SensorType.Distance:
TrigerDistance(jointID, val);
break;
case SensorType.Joint:
TrigerJoint(jointID, val);
break;
case SensorType.PhotoElectric:
break;
case SensorType.Near:
break;
case SensorType.Attribution:
break;
}
}
///
/// 回写关节当前值(距离)
/// 可以订阅SensorDistanceDataChange事件
///
///
public void TrigerDistance(string jointID, object val)
{
if (this.JointId != jointID) return;
object value;
switch (SensorDataType)
{
case SensorDataType.INT:
value = Convert.ToInt32(val);
DataChange(ModelId, PoseId, JointId, Id, value);
break;
case SensorDataType.DINT:
value = (long)val;
DataChange(ModelId, PoseId, JointId, Id, value);
break;
case SensorDataType.FLOAT:
value = (double)val;
DataChange(ModelId, PoseId, JointId, Id, value);
break;
case SensorDataType.DOUBLE:
value = (double)val;
DataChange(ModelId, PoseId, JointId, Id, value);
break;
}
}
///
/// 判断姿态位置
///
///
public void TrigerPose(object vale)
{
double val = (double)vale;
bool isTriger = false;
bool isTrigerJoint;
int index = 0;
//Kinematics k = DataBaseJson.dataBaseJson.KinematicsList.FirstOrDefault(t => t.ModelId == ModelId);
var k = PP.ModelCodeFindModelAttribute(ModelId).KinematicsData;
if (k == null) return;
//监控POSE的全部姿态
var pose = k.PoseList.FirstOrDefault(t => t.Id == PoseId);
if (pose == null) return;
foreach (var item in pose.PoseInfo)
{
double currentValue = k.JointList.FirstOrDefault(t => t.Id == item.Key).ValueCurrent;
if ((currentValue >= item.Value + LimitDownValue) && (currentValue <= item.Value + LimitUpValue))
{
isTrigerJoint = true;
}
else
{
isTrigerJoint = false;
}
if (!isTrigerJoint)
{
isTriger = false;
break;
}
else
{
if (index == 0)
{
isTriger = isTrigerJoint;
}
else
{
isTriger = isTriger && isTrigerJoint;
}
if (isTriger == false)
{
break;
}
}
index++;
}
if (I != isTriger)
{
I = isTriger;
DataChange(ModelId, PoseId, JointId, Id, I);
//DataChangeBool(ModelId, PoseId, JointId, Id, I);
}
}
///
/// 关节传感器
/// 判断关节位置
///
///
///
public void TrigerJoint(string jointID, object vale)
{
if (this.JointId != jointID) return;
double val = (double)vale;
bool isTriger = false;
// Kinematics k = DataBaseJson.dataBaseJson.KinematicsList.FirstOrDefault(t => t.ModelId == ModelId);
var k = PP.ModelCodeFindModelAttribute(ModelId).KinematicsData;
if (k == null) return;
var jValue = k.PoseList.FirstOrDefault(t => t.Id == PoseId).PoseInfo[jointID];
if ((val >= jValue + LimitDownValue) && (val <= jValue + LimitDownValue))
{
isTriger = true;
}
else
{
isTriger = false;
}
if (I != isTriger)
{
I = isTriger;
DataChange(ModelId, PoseId, JointId, Id, I);
//DataChangeBool(ModelId, PoseId, JointId, Id, I);
}
}
}
//
#endregion
}