2026-01-26 18:56:53 +09:00

129 lines
4.2 KiB
C#

/*
* Copyright (c) 2025 LG Electronics Inc.
* SPDX-License-Identifier: LicenseRef-LGE-Proprietary
*/
using Aurora.Api;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VisionCommon;
namespace VisionInspector {
/// <summary>
/// 부착검사
/// </summary>
public class AttachInspector {
private Logger _Logger;
private SubSysInfo _SubSysInfo;
private InspRecipe _InspRecipe;
/// <summary>
/// 생성자
/// </summary>
/// <param name="subSysInfo">서브시스템 정보</param>
public AttachInspector(SubSysInfo subSysInfo) {
_SubSysInfo = subSysInfo;
_InspRecipe = VisionRecipeManager.GetInspRecipe(_SubSysInfo);
_Logger = new Logger(string.Format($"{typeof(AttachInspector).Name}[{_SubSysInfo.SubSysName}]"));
}
/// <summary>
/// 캘리퍼 측정 결과로 부착검사 수행
/// </summary>
/// <param name="fovInfo">FOV 정보</param>
/// <param name="displayType">디스플레이 타입</param>
/// <param name="caliperResult_H">수직(Height) 캘리퍼 측정 결과</param>
/// <param name="caliperResult_W">수평(Width) 캘리퍼 측정 결과</param>
/// <returns>부착검사 결과</returns>
public AttachInspResult InspectDistances(
FovInfo fovInfo,
eDisplayType displayType,
CaliperResult caliperResult_H,
CaliperResult caliperResult_W) {
var attachInspParam = _InspRecipe.AttachInspRecipe.AttachInspParams[(int)fovInfo.FovId];
var inspStatus = InspStatus.NONE;
var results = new List<InspStatus>();
if (caliperResult_H != null) {
if (IsSpecOverDistance(caliperResult_H.WidthMm, attachInspParam.SpecH, attachInspParam.ErrRangeH)) {
results.Add(InspStatus.OK);
}
else {
results.Add(InspStatus.NG);
}
}
else {
caliperResult_H = new CaliperResult();
results.Add(InspStatus.NG);
}
if (caliperResult_W != null) {
if (IsSpecOverDistance(caliperResult_W.WidthMm, attachInspParam.SpecW, attachInspParam.ErrRangeW)) {
results.Add(InspStatus.OK);
}
else {
results.Add(InspStatus.NG);
}
}
else {
caliperResult_W = new CaliperResult();
results.Add(InspStatus.NG);
}
bool ngFlag = false;
foreach (InspStatus status in results) {
if (status == InspStatus.NG) {
inspStatus = InspStatus.NG;
ngFlag = true;
break;
}
}
if (!ngFlag) {
inspStatus = InspStatus.OK;
}
var attachInspResult = GetAttachInspResult(
fovInfo,
displayType,
attachInspParam,
caliperResult_W.WidthMm,
caliperResult_H.WidthMm,
inspStatus);
return attachInspResult;
}
private bool IsSpecOverDistance(double distance, double spec, double errRange) {
if (Math.Abs(Math.Abs(distance) - Math.Abs(spec)) < errRange) {
return true;
}
else {
_Logger.FuncE($"Spec Over NG!! [distance : {distance:F3} / specY : {spec} / errRange : {errRange}]");
return false;
}
}
private AttachInspResult GetAttachInspResult(
FovInfo fovInfo,
eDisplayType displayType,
AttachInspParam attachInspParam,
double MeasureW,
double MeasureH,
InspStatus inspStatus) {
return new AttachInspResult(
displayType,
fovInfo.FovId,
MeasureW,
attachInspParam.SpecW,
MeasureH,
attachInspParam.SpecH,
inspStatus
);
}
}
}