2026-01-26 14:51:28 +09:00

255 lines
10 KiB
C#

/*
* Copyright (c) 2025 LG Electronics Inc.
* SPDX-License-Identifier: LicenseRef-LGE-Proprietary
*/
using Aurora;
using System.Reactive.Linq;
using System;
using System.Windows;
using Aurora.Api;
using System.Collections.ObjectModel;
using System.Windows.Input;
using Aurora.View;
using VisionCommon;
using VisionSequence.Setup;
using VisionCommonUI;
using VisionCommonUI.Resources;
using Aurora.Util.HislogPlus;
using System.Collections.Generic;
namespace VisionUI.Setup {
/// <summary>
/// 오토 포커스 뷰 모델
/// </summary>
public class AutoFocusViewModel : Aurora.View.NotifyPropertyChangedBase, IUpdateRecipe {
private Logger _Logger;
private ISequence _Seq;
private FovInfo _FovInfo;
private FovRecipe _FovRecipe;
private CsvManager _CsvManager = new CsvManager();
#region Binding Properties
/// <summary>오토포커스 로그 아이템 컬렉션</summary>
public ObservableCollection<AutoFocusLog> AutoFocusLogItems { get; set; } = new ObservableCollection<AutoFocusLog>();
/// <summary>오토포커스 로그 아이템 컬렉션(Roughly)</summary>
public ObservableCollection<AutoFocusLog> AutoFocusLogItems_Roughly { get; set; } = new ObservableCollection<AutoFocusLog>();
/// <summary>오토포커스 로그 아이템 컬렉션(Delicately)</summary>
public ObservableCollection<AutoFocusLog> AutoFocusLogItems_Delicately { get; set; } = new ObservableCollection<AutoFocusLog>();
private AutoFocusRecipe _AutoFocusRecipe;
/// <summary>오토포커스 레시피</summary>
public AutoFocusRecipe AutoFocusRecipe { get => _AutoFocusRecipe; set => SetProperty(ref _AutoFocusRecipe, value); }
private DateTime selectedDate;
/// <summary>선택된 날짜</summary>
public DateTime SelectedDate { get => selectedDate; set { SetProperty(ref selectedDate, value); CalendarChanged(value); } }
#endregion
#region Button Commands
public ICommand ButtonCommandSetFindRoi { get; set; }
public ICommand ButtonCommandStart { get; set; }
public ICommand ButtonCommandCancel { get; set; }
public ICommand ButtonCommandSaveParams { get; set; }
#endregion
/// <summary>
/// 생성자
/// </summary>
/// <param name="fovInfo">Fov 정보</param>
public AutoFocusViewModel(FovInfo fovInfo) {
_FovInfo = fovInfo;
_FovRecipe = VisionRecipeManager.GetFovRecipe(_FovInfo);
_Logger = new Logger(string.Format("AutoFocusViewModel[{0}]", fovInfo.SubSysName));
ButtonCommandSetFindRoi = new DelegateCommand(new Action<object>(DoSetFindRoi));
ButtonCommandStart = new DelegateCommand(new Action<object>(DoStart));
ButtonCommandCancel = new DelegateCommand(new Action<object>(DoCancel));
ButtonCommandSaveParams = new DelegateCommand(new Action<object>(DoSaveParams));
SelectedDate = DateTime.Now.Date;
UpdateRecipeFromFile();
SetObservable();
}
private void SetObservable() {
var disposable_1 = VisionEnv.AuroraEnv.EventObservable.AsObservable(VisionEventId.CLEAR_AUTO_FOCUS_LOG).
Where(x => x.From == _FovInfo.GetKey()).Subscribe(_ => ClearAutoFocusLog());
DisposableManager.AddDisposable(eDpsGroupKey.SubMenu_AutoFocus, disposable_1);
var disposable_2 = VisionEnv.AuroraEnv.EventObservable.AsObservable(VisionEventId.UPDATE_AUTO_FOCUS_LOG).
Where(x => x.From == _FovInfo.GetKey()).Subscribe(autoFocusLog => UpdateAutoFocusLog(autoFocusLog));
DisposableManager.AddDisposable(eDpsGroupKey.SubMenu_AutoFocus, disposable_2);
}
/// <summary>
/// 오토포커스 로그 클리어
/// </summary>
public void ClearAutoFocusLog() {
Application.Current.Dispatcher.BeginInvoke(
new Action(() => {
AutoFocusLogItems.Clear();
AutoFocusLogItems_Roughly.Clear();
AutoFocusLogItems_Delicately.Clear();
}));
}
/// <summary>
/// 오토포커스 로그 업데이트
/// </summary>
/// <param name="msg">이벤트 메세지</param>
public void UpdateAutoFocusLog(EventMessage msg) {
Application.Current.Dispatcher.BeginInvoke(
new Action(() => {
var log = msg.Param as AutoFocusLog;
AutoFocusLogItems.Add(log);
if(log.Mode == eFocusMode.Roughly.ToString()) {
AutoFocusLogItems_Roughly.Add(log);
}
else if(log.Mode == eFocusMode.Delicately.ToString()) {
AutoFocusLogItems_Delicately.Add(log);
}
}));
}
/// <summary>
/// 찾는 ROI 등록
/// </summary>
/// <param name="display">null</param>
public void DoSetFindRoi(object display = null) {
AddSharpnessROI();
}
/// <summary>
/// 오토포커스 시퀀스 시작
/// </summary>
/// <param name="display">null</param>
public void DoStart(object display = null) {
if (AutoFocusRecipe == null) {
MessageBoxUtil.ShowMessageBoxError(
string.Format(StrTokens.MSG_E_AutoFocusRecipeIsNull));
return;
}
AutoFocusLogItems.Clear();
AutoFocusLogItems_Roughly.Clear();
AutoFocusLogItems_Delicately.Clear();
SetSharpnessRoi();
_Seq = Application.Current.AuroraEnv().SequenceEntry[VisionKeys.AutoFocusSeqKey];
_Seq?.Start(new SetupSeqParams_AutoFocus(_FovInfo, AutoFocusRecipe), OnCompleted);
}
/// <summary>
/// 선명도 ROI 추가
/// </summary>
public void AddSharpnessROI() {
try {
if (AutoFocusRecipe == null) {
_Logger.FuncW("AutoFocusRecipe is null.");
return;
}
var cameraDisplay = CameraDisplayManager.GetDisplay(_FovInfo, eDisplayType.AutoFocus);
cameraDisplay.AddFindRoi(AutoFocusRecipe.SharpnessRoi, false);
}
catch (Exception e) {
_Logger.FuncE("{0}", e.Message);
}
}
private void UpdateSharpnessRoi() {
var cameraDisplay = CameraDisplayManager.GetDisplay(_FovInfo, eDisplayType.AutoFocus);
AutoFocusRecipe.SharpnessRoi = cameraDisplay.GetFindRoi();
AutoFocusRecipe.SharpnessRoi.RoiColor = eColor.Orange;
if (AutoFocusRecipe.SharpnessRoi.Width == 0 && AutoFocusRecipe.SharpnessRoi.Height == 0) {
AutoFocusRecipe.SharpnessRoi.CenterX = 1000;
AutoFocusRecipe.SharpnessRoi.CenterY = 1000;
AutoFocusRecipe.SharpnessRoi.Width = 200;
AutoFocusRecipe.SharpnessRoi.Height = 300;
}
var autoFocusRecipe = VisionRecipeManager.GetAutoFocusRecipe(_FovInfo);
AutoFocusRecipe.CopyTo(autoFocusRecipe);
}
private void SetSharpnessRoi() {
var cameraDisplay = CameraDisplayManager.GetDisplay(_FovInfo, eDisplayType.AutoFocus);
if (!ROI.IsNullOrEmpty(cameraDisplay.GetFindRoi())) {
AutoFocusRecipe.SharpnessRoi = cameraDisplay.GetFindRoi();
}
}
/// <summary>
/// 오토포커스 시퀀스 완료후 작업내용 이벤트 핸들러
/// </summary>
/// <param name="seqResult">오토포커스 시퀀스 완료 결과</param>
private void OnCompleted(SequenceActionResult seqResult) {
UpdateAutoFocusParams(seqResult.Param as SetupSeqResultParams_AutoFocus);
}
/// <summary>
/// 시퀀스 정지
/// </summary>
/// <param name="display"></param>
public void DoCancel(object display = null) {
_Seq?.Stop();
//CancelSequence.Invoke(this, new EventArgs());
}
/// <summary>
/// 세이브 파라미터
/// </summary>
/// <param name="display">null</param>
public void DoSaveParams(object display = null) {
UpdateRecipeFromUI();
RecipeFileManager.SaveVisionRecipe();
}
/// <summary>
/// 오토포커스 파라미터들 업데이트
/// 최적의 Step | Sharpness | BestPosZ
/// </summary>
/// <param name="autoFocusResult">오토포커스 셋업 시퀀스 결과 파라미터</param>
public void UpdateAutoFocusParams(SetupSeqResultParams_AutoFocus autoFocusResult) {
AutoFocusRecipe.BestStep = autoFocusResult.BestStep;
AutoFocusRecipe.BestSharpness = autoFocusResult.BestSharpness;
AutoFocusRecipe.BestPos = autoFocusResult.BestPosZ;
}
/// <summary>
/// 현재 시간 기준으로 CSV 불러오기
/// </summary>
public void LoadCsvNow() {
DateTime dateTime = DateTime.Now;
LoadCsv(dateTime);
}
private void CalendarChanged(DateTime dateTime) {
LoadCsv(dateTime);
}
private void LoadCsv(DateTime dateTime) {
try {
AutoFocusLogItems.Clear();
AutoFocusLogItems_Roughly.Clear();
AutoFocusLogItems_Delicately.Clear();
List<AutoFocusLog> items = _CsvManager.LoadCsv<AutoFocusLog>(_FovInfo.ToSubSysInfo(), dateTime, eSaveDataType.AutoFocus);
if (items != null) {
foreach (AutoFocusLog item in items) {
AutoFocusLogItems.Add(item);
}
}
}
catch (Exception e) {
_Logger.FuncE(e.Message);
}
}
public void RefreshVisionRecipes() {
_FovRecipe = VisionRecipeManager.GetFovRecipe(_FovInfo);
UpdateRecipeFromFile();
}
public void UpdateRecipeFromFile() {
var autoFocusRecipe = VisionRecipeManager.GetAutoFocusRecipe(_FovInfo);
AutoFocusRecipe = autoFocusRecipe.Clone();
}
public void UpdateRecipeFromUI() {
UpdateSharpnessRoi();
}
}
}