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

366 lines
17 KiB
C#

using Aurora;
using Aurora.Api;
using Aurora.Api.Manager;
using Aurora.View;
using AuroraChiller;
using AuroraIO;
using AuroraLaser;
using AuroraLaserScanner;
using AuroraLight;
using AuroraLight.View;
using AuroraPLC;
using DB;
using Hermes;
using System;
using System.Collections.Generic;
using System.Reactive.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using WeldingCommon.Alarm;
using WeldingCommon.Recipes;
using WeldingCommon.Sequences;
using WeldingCommon.Settings;
using WeldingCommon.Views;
using WeldingCommon.Views.DoorInterlock;
using WeldingCommon.Vision.Common;
using WeldingCommon.Vision.Factory;
namespace WeldingCommon
{
public abstract class CommonEquipmentSetup
{
protected static Logger Log = new Logger("EquipmentSetup");
protected UCRecipe _UCRecipe;
protected ResourceDictionary IconDictionary;
public IAuroraEnvironment AuroraEnv { get; set; }
public virtual void BuildMainStatusView(MainStatusBuilder builder)
{
builder
.AddLanguage("en-US", "ko-KR")
.AddDeviceActiveStatus(CommonDeviceIds.Scanner)
.AddDeviceActiveStatus(CommonDeviceIds.Laser)
.AddDeviceActiveStatus(CommonDeviceIds.IODevice)
.AddDeviceActiveStatus(CommonDeviceIds.PLCDevice)
//.AddDeviceActiveStatus(CommonDeviceIds.Light)
.AddDeviceActiveStatus(CommonDeviceIds.SmcChiller);
}
public bool CanShutDown()
{
return true;
}
public virtual string GetEquipmentName()
{
return "ILSOS";
}
public void OnResetAlarm(List<int> codeList)
{
}
public void OnSetAlarm(int code, bool isHeavy)
{
//if (isHeavy) {
// AlarmManager.StopSequenceByAlarm(code);
//}
}
public void OnShutDown()
{
var devices = AuroraEnv.DeviceManager.GetDevices();
foreach (var device in devices) {
if (device.Deactivate() != E1.OK) {
Log.E($"{device.DeviceId} connect fail.");
}
}
}
private void TestSystemEvents()
{
Observable.Merge(
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_EQUIPMENT_LOADED),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_MENU_CHANGED),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_ALARM_SET_ALARM),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_ALARM_RESET_ALARM),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_ALARM_RESET_ALL_ALARM),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_ALARM_DESCRIPTIONS_RELOADED),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_PERMISSION_CHANGED),
//AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_REQ_MAIN_PROGRESS),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_REQ_SCREEN_INTERLOCK),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_REQ_MAIN_LOCK),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_REQ_MAIN_LAMP),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_REQ_MENU_CHANGE),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_REQ_MAIN_MENU_ENABLE),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_REQ_WINDOW_MODE),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_REQ_WINDOW_FULL_SCREEN),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_REQ_MANUAL_BACKUP_START),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_REQ_TOAST_MESSAGE),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_REQ_TOAST_MESSAGE_CLEAR),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_MAIN_ALARM),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_REQ_CHANGE_LANGUAGE),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_CORE_ERROR_OCCURED),
//AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_INGREDIENT_RELOADED),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_EQUIPMENT_LOAD_FAILED),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_SHUTDOWN),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_SETTING_CHANGED),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_DEVICE_ACTIVATED),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_DEVICE_DEACTIVATED),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_DEVICE_IS_COMM_ERROR),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_RECIPE_ACTIVATED),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_RECIPE_ENTRY_CHANGED),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_RECIPE_RELOADED),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_RECIPE_ITEM_CHANGED),
//AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_MODEL_CHANGED),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_ACTIVATED_RECIPE_MODEL_CHANGED),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_MODEL_ACTIVATED),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_MODEL_RELOADED),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_MODEL_ITEM_CHANGED),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_MODEL_NAME_CHANGED),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_MODEL_ENTRY_CHAGNED),
//AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_INGREDIENT_ENTRY_CHAGNED),
//AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_INGREDIENT_ITEM_CHAGNED),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_LANGUAGE_CHANGED),
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_REQ_MODEL_EDITING_CHANGE)
).ObserveOnDispatcher()
.Subscribe(x => {
Log.V($"{x.Subject} :: Param[{x.Param?.ToString()}] From[{x.From}]");
});
}
public async Task ActivateDevices()
{
await System.Threading.Tasks.Task.Run(() => {
try {
var devices = AuroraEnv.DeviceManager.GetDevices();
foreach (var device in devices) {
if (device.Activate() != E1.OK) {
Log.E($"{device.DeviceId} connect fail.");
if (device.DeviceId.Equals("Laser")) {
//Laser 연결 실패시 알람 발생
//AuroraEnv.AlarmService.SetAlarm(3);
}
}
}
} catch (Exception e) {
Log.E($"An error occurred OnStartUp : {e.Message}");
}
});
}
public virtual async void OnStartUp()
{
int value = 9999;
Log.I($"{ApplicationExt.CurLang}");
Log.I($"{ApplicationExt.IsSimulation}");
Log.I($"value = {value}");
Status.AuroraEnv = AuroraEnv;
await Task.Run(() => ConnectDevices()).ContinueWith(x => StartProcess());
AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_SETTING_CHANGED)
.Select(msg => msg.Param as string)
.Where(param => param == CommonSettingIds.Sequence)
.Subscribe(_ => UpdateSequenceState());
#region Event
AuroraEnv.EventObservable.AsObservable(CommonEventIds.EVENT_DOOR_INTERLOCK)
.Subscribe(x => {
if (x.Param != null && x.Param is bool isOpen) {
if (isOpen) {
Application.Current.Dispatcher.Invoke(delegate {
DoorInterlockPopup.GetInstance().PopupMaint(CommonSettingIds.DoorInterlock);
});
} else {
Application.Current.Dispatcher.Invoke(delegate {
DoorInterlockPopup.GetInstance().PopupMaintClose();
});
}
}
});
#endregion
//AlarmMonitroing Seq Start
AuroraEnv.SequenceEntry[CommonSequenceIds.AlarmMonitor].Start();
AuroraEnv?.EventPublisher?.Publish(new EventMessage("", EquipEvent.BOOT_COMPLETED));
Status.BOOT_COMPLETED = true;
// Test, 발생 Event 확인용
TestSystemEvents();
}
private void ConnectDevices()
{
var equipSetting = AuroraEnv.SettingEntry[AuroraSettings.Equipment] as EquipmentInfo;
if (!equipSetting.AutomaticallyConnectDevices) {
return;
}
var devMngr = AuroraEnv.DeviceManager;
foreach (var device in devMngr.GetDevices()) {
device.Activate();
}
}
private void StartProcess()
{
UpdateSequenceState();
}
private void UpdateSequenceState()
{
SequenceManager.Instance.UpdateSequenceStatus(AuroraEnv.SettingEntry[CommonSettingIds.Sequence] as SequenceSetting
, AuroraEnv.SequenceEntry);
}
public virtual void RegisterDevices(IDeviceRegistry registry)
{
var equipSetting = AuroraEnv.SettingEntry[AuroraSettings.Equipment] as EquipmentInfo;
var isSimul = ApplicationExt.IsSimulation;
var setting = AuroraEnv.SettingEntry[AuroraSettings.Equipment] as EquipmentInfo;
var systemParameterILSOS = AuroraEnv.SettingEntry[CommonSettingIds.SystemParameter] as SystemParameter;
//IODevice는 AjinIO가 아니라 IOUnit으로 받아오는것으로 수정해야 함
//registry.Register(CommonDeviceIds.IODevice, () => new IODevice(AuroraEnv, CommonDeviceIds.IODevice, isSimul), new IOUnitConfig());
//registry.Register(CommonDeviceIds.Laser, () => new Laser(CommonDeviceIds.Laser, isSimul), new LaserConfig(),
// device => new UCLaserDevice() { DataContext = new UCLaserDeviceViewModel(AuroraEnv, CommonDeviceIds.Laser) });
registry.Register(CommonDeviceIds.Scanner, () => new Scanner(CommonDeviceIds.Scanner), new ScannerConfig());
//registry.Register(CommonDeviceIds.SmcChiller, () => new SmcChiller(CommonDeviceIds.SmcChiller, 0, isSimul), new SmcChiller.Config(),
// device => new UCSMCChillerDevice() { DataContext = new UCSMCChillerDeviceViewModel(AuroraEnv, CommonDeviceIds.SmcChiller) });
registry.Register(CommonDeviceIds.SmcChiller, () => new SmcChiller(CommonDeviceIds.SmcChiller), new SmcChillerConfig(),
device => new UCChiller(AuroraEnv, CommonDeviceIds.SmcChiller));
//PRIBAT은 PLC안씀???
//PLC-> 각자 장비 프로젝트가 등록하도록 Commom에서 각 장비 EquipmentSetup으로 이동 (각 PLC 마다 주소값이 다르고, API가 다른 부분이 존재해서 따로 관리하는 게 맞아보임)
//var _plc = new PLCController(CommonDeviceIds.PLCDevice, ePLCNetType.MXComponent, ApplicationExt.IsSimulation, PLCMMapFileType.CSV, AuroraEnv);
//registry.Register(CommonDeviceIds.PLCDevice,
// () => _plc, PLCMxComponentConfig.GetDefaultConfig(),
// device => new UCPLCDevice() { DataContext = new UCPLCDeviceViewModel(AuroraEnv, _plc) });
//VisionFactory.RegisterDevices(registry);
VisionFactory.RegisterDevices(registry);
//registry.Register(CommonDeviceIds.Light, () => new LightDevice(CommonDeviceIds.Light, eLight.ERI), new LightConfig(),
// device => new UCLight() { DataContext = new UCLightViewModel(AuroraEnv, CommonDeviceIds.Light) });
// TODO: SystemParameterManager.Initialize 할 위치 찾자. 여기는 조금....
SystemParameterManager.Initialize(AuroraEnv);
AlarmManager.Init(AuroraEnv);
}
public virtual void RegisterModels(ModelRegister register)
{
VisionFactory.RegisterModel(register);
// Simulation Mode, Equipment Name 등 기본 세팅 load
Status.Init(AuroraEnv);
}
public virtual void RegisterRecipes(RecipeRegister register)
{
//LASA 초기화 작업
GUI.Program.dao = new Dao();
GUI.Program.dao.Initialize();
//register(RecipeIds.Laser, new LaserRecipe());
//register(CommonRecipeIds.LaserScannerTeaching, new LaserScannerTeachingRecipe(),
// (recipe, item) => new LaserScannerTeaching() {
// DataContext = new LaserScannerTeachingViewModel(AuroraEnv, new LaserScannerTeachingToolboxViewModel(AuroraEnv))
// });
VisionFactory.RegisterRecipe(register);
}
public virtual void RegisterSequences(SequenceRegister register)
{
// Common Sequences
SequenceManager.RegisterSequence(AuroraEnv, register);
VisionFactory.RegisterSequences(AuroraEnv, register);
}
//public virtual void RegisterServices(IServiceRegistry register)
//{
//}
public virtual void RegisterSettings(SettingRegister register)
{
register(CommonSettingIds.SystemParameter, new SystemParameter());
register(CommonSettingIds.LaserPowerCalParam, new LaserPowerCalParam());
register(CommonSettingIds.Sequence, new SequenceSetting());
register(CommonSettingIds.DataLogPath, new DataLogPathSetting());
register(CommonSettingIds.DoorInterlock, new DoorInterlockSetting());
VisionFactory.RegisterSetting(AuroraEnv, register);
}
public virtual void RegisterViews(IViewManager manager)
{
if (ApplicationExt.Theme_Color.Contains("Light")) {
Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary {
// Light Theme
Source = new Uri("pack://application:,,,/AuroraUIComponent;component/Style/GenericLightSG.xaml")
//Source = new Uri("pack://application:,,,/AuroraUIComponent;component/Style/GenericLight.xaml")
});
} else {
Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary {
// Dark Theme
Source = new Uri("pack://application:,,,/AuroraUIComponent;component/Style/Generic.xaml")
});
}
IconDictionary = new ResourceDictionary();
IconDictionary.Source = new Uri("pack://application:,,,/AuroraUIComponent;component/Resources/IconsDic.xaml");
// Vision Theme Set
if (ApplicationExt.Theme_Color.Contains("Light")) {
Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary {
// Light Theme
//Source = new Uri("pack://application:,,,/VisionCommonUI;component/Styles/Theme/VisionLight.xaml")
Source = new Uri("pack://application:,,,/VisionCommonUI;component/Styles/Theme/VisionLightSG.xaml")
});
} else {
Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary {
// Dark Theme
Source = new Uri("pack://application:,,,/VisionCommonUI;component/Styles/Theme/VisionDark.xaml")
});
}
// Vision Theme 적용
Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary {
Source = new Uri("pack://application:,,,/VisionCommonUI;component/Styles/VisionResources.xaml")
});
VisionEventManager.Instance.Init();
}
public void RegisterIngredients(IngredientsRegister register)
{
VisionFactory.RegisterIngredient(register);
}
public void RegisterLanguageResource(LangResourceRegister register)
{
VisionFactory.RegisterLanguageResource(register);
}
public void RegisterShortcuts(ShortcutRegister register)
{
register(CommonShortcutIds.StartMain, "Start Main Desc", ModifierKeys.Alt, Key.S);
register(CommonShortcutIds.ScreenCapture, "Screen Capture", ModifierKeys.Alt, Key.C);
}
}
}