2026-06-05 13:44:39 +09:00

251 lines
7.1 KiB
C#

using Aurora.Api;
using Aurora.Api.Devices;
using AuroraHeightSensor.Keyence;
using AuroraHeightSensor.MicroEpsilon;
using Hermes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Input;
using static AuroraHeightSensor.HeightSensor;
namespace AuroraHeightSensor
{
public enum eHeightSensor
{
KeyenceLKG85,
KeyenceCL3000,
KeyenceIXH,
KeyenceIL,
MicroEpsilon
}
public enum eChannel
{
CH0 = 0,
CH1 = 1,
CH2 = 2,
CH3 = 3,
}
public interface IHeightSensor
{
int Measure(eChannel channel, out double value);
int MeasureAll(out List<double> value);
int SetZero(eChannel channel, bool isSet = true);
int SetZeroShift(eChannel channel);
int SetZeroShiftReset(eChannel channel);
int Reset(eChannel channel);
//int Connect(IConnConfig config);
//int Disconnect();
bool CheckConnected();
int SetLed(bool isOn);
int Activate(IConnConfig Config);
int Deactivate();
int StartStopAutoTransmit(bool isOn, ICommand callback);
}
public class HeightSensor : Device
{
Logger Log = new Logger("HeightSensor");
private IHeightSensor _HeightSensor;
public double Height { get; private set; }
private double _MinValue;
private double _MaxValue;
protected bool _isSimulBySetting;
private eHeightSensor _SensorType;
public HeightSensor(string deviceId, eHeightSensor sensor, bool isSimul)
{
_SensorType = sensor;
_isSimulBySetting = isSimul;
}
protected override int DoActivate(IDeviceConfig config)
{
var heightSensorConfig = config as HeightSensorConfig;
IsSimul = heightSensorConfig.IsDeviceSimulationOn || _isSimulBySetting;
if (IsSimul) {
_HeightSensor = new HeightSensorMock();
} else {
switch (_SensorType) {
case eHeightSensor.KeyenceLKG85:
_HeightSensor = new HeightSensorLKG85(DeviceId);
break;
case eHeightSensor.MicroEpsilon:
_HeightSensor = new HeightSensorME();
break;
case eHeightSensor.KeyenceCL3000:
_HeightSensor = new HeightSensorCL3000(DeviceId);
break;
case eHeightSensor.KeyenceIXH:
_HeightSensor = new HeightSensorIXH(DeviceId, IsSimul);
break;
case eHeightSensor.KeyenceIL:
_HeightSensor = new HeightSensorIL(DeviceId, IsSimul);
break;
default:
return E1.RESOURCE;
}
}
//var res = _HeightSensor?.Connect(heightSensorConfig.ConnConfig) ?? E1.GENERIC;
var res = _HeightSensor?.Activate(heightSensorConfig.ConnConfig) ?? E1.GENERIC;
if (res != E1.OK) {
return res;
}
_MinValue = heightSensorConfig.Limit.Min;
_MaxValue = heightSensorConfig.Limit.Max;
if (_HeightSensor is HeightSensorMock) {
(_HeightSensor as HeightSensorMock).SetRange(heightSensorConfig.Simulation.Min, heightSensorConfig.Simulation.Max);
}
return E1.OK;
}
protected override int DoDeactivate()
{
//return _HeightSensor.Disconnect();
return _HeightSensor.Deactivate();
}
public bool IsConnected()
{
if (!IsActivated) {
return false;
}
IsCommError = !_HeightSensor.CheckConnected();
return IsCommError == false;
}
// 현재까진 Channel 0만 쓰는 것으로 보인다. 나중에 필요시 두채널을 고려하자.
public int Measure(out double value)
{
value = 0;
if (!IsActivated) {
return E2.NOT_CONNECTED;
}
if (_HeightSensor.Measure(eChannel.CH0, out value) == E1.OK) {
Height = value;
}
if (value < _MinValue || value > _MaxValue) {
Log.E($"Over meaure range : {value}");
return E2.UNAVAILABLE;
}
return E1.OK;
}
public int MeasureAll(out List<double> Sensorvalue)
{
if(IsSimul) {
Sensorvalue = new List<double>();
var rand = new Random();
Sensorvalue.Add(rand.NextDouble());
Sensorvalue.Add(rand.NextDouble());
Sensorvalue.Add(rand.NextDouble());
Sensorvalue.Add(rand.NextDouble());
return E1.OK;
}
Sensorvalue = null;
if (!IsActivated)
{
return E2.NOT_CONNECTED;
}
if (_HeightSensor.MeasureAll(out Sensorvalue) == E1.OK)
{
//Height = value;
}
if (Sensorvalue is null){
Log.E("Sensor not measure");
return E2.ABORTED;
}
//if (value < _MinValue || value > _MaxValue)
//{
// Log.E($"Over meaure range : {value}");
// return E2.UNAVAILABLE;
//}
return E1.OK;
}
public void Update()
{
if (!IsConnected()) {
return;
}
if (_HeightSensor.Measure(eChannel.CH0, out double value) == E1.OK) {
Height = value;
}
}
public int SetZeroShift(eChannel ch)
{
if (_HeightSensor.SetZeroShift(ch) == E1.OK) {
return E1.OK;
}
else {
return E2.UNKNOWN;
}
}
public int SetZeroShiftReset(eChannel ch)
{
if (_HeightSensor.SetZeroShiftReset(ch) == E1.OK){
return E1.OK;
}
else{
return E2.UNKNOWN;
}
}
public int Reset()
{
_HeightSensor.Reset(eChannel.CH0);
Thread.Sleep(100);
_HeightSensor.Reset(eChannel.CH1);
Thread.Sleep(100);
_HeightSensor.Reset(eChannel.CH2);
Thread.Sleep(100);
_HeightSensor.Reset(eChannel.CH3);
return E1.OK;
}
public int SetLed(bool isOn)
{
if (!IsActivated) {
return E2.NOT_CONNECTED;
}
return _HeightSensor.SetLed(isOn);
}
public int StartStopAutoTransmit(bool isOn, ICommand callback)
{
if (!IsActivated) {
return E2.NOT_CONNECTED;
}
return _HeightSensor.StartStopAutoTransmit(isOn, callback);
}
}
}