/*
* Copyright (c) 2025 LG Electronics Inc.
* SPDX-License-Identifier: LicenseRef-LGE-Proprietary
*/
using System;
using System.Collections.Generic;
using System.Linq;
using VisionCommon;
namespace VisionSequence.Setup {
///
/// 캘리브레이션 플랜
///
public class CalPlan {
private const int FIRST_STEP = 0;
private const int SECOND_STEP = 1;
private const int BACKLASH_STEP = 2;
/// X, Y축 수평 이동 횟수
public int _MoveCalStep { get; private set; }
/// T축 회전 이동 횟수
public int _MoveThetaStep { get; private set; }
/// 현재까지 이동 횟수
public int _CurrentStep { get; private set; }
/// X, Y축으로 1회 이동 거리
public double _AxisCalLength { get; private set; }
/// T축으로 1회 회전 각도(Degree)
public double _ThetaCalDegree { get; private set; }
private int _CalXaxisStep { get; set; }
private int _CalYaxisStep { get; set; }
private int _CalTaxisStep { get; set; }
private Dictionary Plan = new Dictionary();
///
/// 생성자
///
/// X, Y축 수평 이동 횟수
/// X, Y축으로 1회 이동 거리
/// T축 회전 이동 횟수
/// T축으로 1회 회전 각도(Degree)
public CalPlan(int moveStep, double axisLength, int thetaStep, double thetaDegree) {
_MoveCalStep = moveStep;
_MoveThetaStep = thetaStep;
_AxisCalLength = axisLength;
_ThetaCalDegree = thetaDegree;
_CalXaxisStep = moveStep + BACKLASH_STEP;
_CalYaxisStep = moveStep + BACKLASH_STEP;
_CalTaxisStep = thetaStep + BACKLASH_STEP;
_CurrentStep = 1;
}
private void MakeXaxisCalPlan(string axis, string actionType) {
if (_CalXaxisStep == BACKLASH_STEP) {
return;
}
else {
MakeAxisCalPlan(_CalXaxisStep, _AxisCalLength, axis, actionType);
}
}
private void MakeYaxisCalPlan(string axis, string actionType) {
if (_CalYaxisStep == BACKLASH_STEP) {
return;
}
else {
MakeAxisCalPlan(_CalYaxisStep, _AxisCalLength, axis, actionType);
}
}
private void MakeTaxisCalPlan(string axis, string actionType) {
if (_CalTaxisStep == BACKLASH_STEP) {
return;
}
MakeAxisCalPlan(_CalTaxisStep, _ThetaCalDegree, axis, actionType);
}
private void MakeAxisCalPlan(int calAxisStep, double calAxisLength, string moveAxis, string actionType) {
string MoveAxis = moveAxis.Remove(1);
double CalAxisLength = calAxisLength;
double BackLash = -calAxisLength;
try {
for (int i = 0; i <= calAxisStep; i++) {
Dictionary CalDistance = new Dictionary();
Dictionary CalMove = new Dictionary();
Dictionary CalAction = new Dictionary();
Dictionary CalAxis = new Dictionary();
if (i == FIRST_STEP) {
if (MoveAxis == Constants.X) {
double startPosition = CalculateStartPosition(_MoveCalStep, CalAxisLength) + BackLash;
CalDistance.Add(Constants.X, startPosition.ToString());
CalDistance.Add(Constants.Y, "0");
CalDistance.Add(Constants.T, "0");
}
else if (MoveAxis == Constants.Y) {
double startPosition = CalculateStartPosition(_MoveCalStep, CalAxisLength) + BackLash;
CalDistance.Add(Constants.X, "0");
CalDistance.Add(Constants.Y, startPosition.ToString());
CalDistance.Add(Constants.T, "0");
}
else if (MoveAxis == Constants.T) {
double startPosition = CalculateStartPosition(_MoveThetaStep, CalAxisLength) + BackLash;
CalDistance.Add(Constants.X, "0");
CalDistance.Add(Constants.Y, "0");
CalDistance.Add(Constants.T, startPosition.ToString());
}
else {
Console.WriteLine("Axis Error");
}
CalMove.Add(Constants.BACKLASH, CalDistance);
CalAxis.Add(moveAxis, CalMove);
CalAction.Add(actionType, CalAxis);
Plan.Add(_CurrentStep.ToString(), CalAction);
}
else if (i == SECOND_STEP) {
if (MoveAxis == Constants.X) {
CalDistance.Add(Constants.X, (-BackLash).ToString());
CalDistance.Add(Constants.Y, "0");
CalDistance.Add(Constants.T, "0");
}
else if (MoveAxis == Constants.Y) {
CalDistance.Add(Constants.X, "0");
CalDistance.Add(Constants.Y, (-BackLash).ToString());
CalDistance.Add(Constants.T, "0");
}
else if (MoveAxis == Constants.T) {
CalDistance.Add(Constants.X, "0");
CalDistance.Add(Constants.Y, "0");
CalDistance.Add(Constants.T, (-BackLash).ToString());
}
else {
Console.WriteLine("Axis Error");
}
CalMove.Add(Constants.MOVE, CalDistance);
CalAxis.Add(moveAxis, CalMove);
CalAction.Add(actionType, CalAxis);
Plan.Add(_CurrentStep.ToString(), CalAction);
}
else if (i == calAxisStep) {
if (MoveAxis == Constants.X) {
double measurePosition = CalculateMeasurePosition(_MoveCalStep, CalAxisLength);
CalDistance.Add(Constants.X, measurePosition.ToString());
CalDistance.Add(Constants.Y, "0");
CalDistance.Add(Constants.T, "0");
}
else if (MoveAxis == Constants.Y) {
double measurePosition = CalculateMeasurePosition(_MoveCalStep, CalAxisLength);
CalDistance.Add(Constants.X, "0");
CalDistance.Add(Constants.Y, measurePosition.ToString());
CalDistance.Add(Constants.T, "0");
}
else if (MoveAxis == Constants.T) {
double measurePosition = CalculateMeasurePosition(_MoveThetaStep, CalAxisLength);
CalDistance.Add(Constants.X, "0");
CalDistance.Add(Constants.Y, "0");
CalDistance.Add(Constants.T, measurePosition.ToString());
}
else {
Console.WriteLine("Axis Error");
}
CalMove.Add(Constants.CALCULATION, CalDistance);
CalAxis.Add(moveAxis, CalMove);
CalAction.Add(actionType, CalAxis);
Plan.Add(_CurrentStep.ToString(), CalAction);
}
else {
if (MoveAxis == Constants.X) {
CalDistance.Add(Constants.X, CalAxisLength.ToString());
CalDistance.Add(Constants.Y, "0");
CalDistance.Add(Constants.T, "0");
}
else if (MoveAxis == Constants.Y) {
CalDistance.Add(Constants.X, "0");
CalDistance.Add(Constants.Y, CalAxisLength.ToString());
CalDistance.Add(Constants.T, "0");
}
else if (MoveAxis == Constants.T) {
CalDistance.Add(Constants.X, "0");
CalDistance.Add(Constants.Y, "0");
CalDistance.Add(Constants.T, CalAxisLength.ToString());
}
else {
Console.WriteLine("Axis Error");
}
CalMove.Add(Constants.MOVE, CalDistance);
CalAxis.Add(moveAxis, CalMove);
CalAction.Add(actionType, CalAxis);
Plan.Add(_CurrentStep.ToString(), CalAction);
}
_CurrentStep++;
}
}
catch (Exception e) {
Console.WriteLine(e.ToString());
}
}
private double CalculateStartPosition(int calAxisStep, double calAxisLength) {
int stepsToStartPos = (calAxisStep + 1) / 2;
int directionToStartPos = -1;
return (calAxisLength * stepsToStartPos * directionToStartPos);
}
private double CalculateMeasurePosition(int calAxisStep, double calAxisLength) {
int stepsToMeasurePos = calAxisStep / 2;
return (stepsToMeasurePos * calAxisLength * (-1));
}
///
/// 캘리브레이션 플랜을 생성한다.
///
/// 픽셀 사이즈 측정 플래그
/// X축 캘리브레이션 사용 플래그
/// Y축 캘리브레이션 사용 플래그
/// T축 캘리브레이션 사용 플래그
///
public Dictionary MakeCalPlan(bool isCalPixelExist, bool isX, bool isY, bool isT) {
if (isCalPixelExist) {
if (isX) {
MakeXaxisCalPlan(Constants.X_PLUS, Constants.X_CAL);
}
if (isY) {
MakeYaxisCalPlan(Constants.Y_PLUS, Constants.Y_CAL);
}
}
if (isT) {
MakeTaxisCalPlan(Constants.T_PLUS, Constants.THETA_CAL);
}
return Plan;
}
}
}