using Aurora; using Aurora.Api; using Aurora.Api.Manager; using Aurora.Api.Services; using Aurora.View; using Aurora.View.Alarm; using Aurora.View.AutoBackup; using AuroraCellTracker; using AuroraCellTracker.Views; using AuroraIO; using AuroraIO.View; using AuroraLaser; using AuroraLBAD; using AuroraLBAD.Services; using AuroraOCT; using AuroraOCT.Views; using AuroraPLC; using AuroraPLC.Views; using CoreUnit.Scanner.UserControl.ScannerCanvas; using DB; using DB.Recipe; using GUI; using ILSOS_PrismaticScanner.Alarm; using ILSOS_PrismaticScanner.Device; using ILSOS_PrismaticScanner.Device.IO; using ILSOS_PrismaticScanner.Models; using ILSOS_PrismaticScanner.Recipes; using ILSOS_PrismaticScanner.Sequences; using ILSOS_PrismaticScanner.Settings; using ILSOS_PrismaticScanner.Views; using System; using System.Linq; using System.Reactive.Concurrency; using System.Reactive.Linq; using System.Threading; using System.Threading.Tasks; using System.Windows.Controls; using System.Windows.Threading; using WeldingCommon; using WeldingCommon.Alarm; using WeldingCommon.Devices.ACS; using WeldingCommon.Recipes; using WeldingCommon.Sequences; using WeldingCommon.Settings; using WeldingCommon.Utils; using WeldingCommon.Views; using WeldingCommon.Views.Manual; using WeldingCommon.Views.Recipes.History; using WeldingCommon.Vision.Factory; using static WeldingCommon.Vision.Factory.VisionFactory; // 26.04.06 using AuroraACS; using AuroraACS.Views; using AuroraMotor; using WeldingCommon.Views.ACS; namespace ILSOS_PrismaticScanner { internal class EquipmentSetup : CommonEquipmentSetup, IEquipmentSetup { private SequenceBuilder _SeqAutoRunPrismaticScanner_Builder; private SequenceBuilder _SeqAutoRunComponentWeld_Builder; private SequenceBuilder _SeqAlarmMonitor_Builder; #region 26.04.09 NDY - ACS MOTF AutoRun Sequence Builder private SequenceBuilder _SeqAutoRunPrismaticScannerACS_Builder; #endregion public override void BuildMainStatusView(MainStatusBuilder builder) { base.BuildMainStatusView(builder); builder.AddDeviceActiveStatus(CommonDeviceIds.CellTracker) .AddDeviceActiveStatus(CommonDeviceIds.OCT); } public override string GetEquipmentName() { return "ILSOS PrismaticScanner"; } public void OnSetAlarm(int code, bool isHeavy) { base.OnSetAlarm(code, isHeavy); if (isHeavy) { AlarmManager_PrismaticScanner.StopSequenceByAlarm(code); } } public override async void OnStartUp() { var equipSetting = AuroraEnv.SettingEntry[AuroraSettings.Equipment] as EquipmentInfo; if (equipSetting.AutomaticallyConnectDevices) { await ActivateDevices(); } //AuroraEx.RegisterRmsHandler(); //AuroraEnv.RecipeManager.RmsHandler().RegistryDeviceHandler(AuroraEnv); //AuroraEnv.RecipeManager.RmsHandler().Start(); // [Singleton Instance] Recipe Change History //AuroraEnv.RecipeManager.RchHandler().RegistryDeviceHandler(AuroraEnv); //AlarmMonitroing Seq Start //AuroraEnv.SequenceEntry[SequenceIds.SeqAlarmMonitor].Start(); //AuroraEnv.SequenceEntry[SequenceIds.SeqStatusMonitor].Start(); //AuroraEnv.SequenceEntry[CommonSequenceIds.PLCMonitor].Start(); base.OnStartUp(); } public override void OnShutDown() { // 모니터링 시퀀스 먼저 종료 //AuroraEnv.SequenceEntry[SequenceIds.SeqAlarmMonitor].Stop(); //AuroraEnv.SequenceEntry[SequenceIds.SeqStatusMonitor].Stop(); //AuroraEnv.SequenceEntry[CommonSequenceIds.PLCMonitor].Stop(); Thread.Sleep(200); base.OnShutDown(); } public override void OnPostDeviceActivated(string dev) { base.OnPostDeviceActivated(dev); switch (dev) { case DeviceIds.IODevice: var io = AuroraEnv.DeviceManager[dev] as IODevice; io._iOUnit.WriteDoBit((int)PAIX_PrismaticScanner.ePrismaticDOAddress.AirKnifeRegulator, true); break; case DeviceIds.PLCDevice: var plc = AuroraEnv.DeviceManager[dev] as PLCControllerPrismaticScanner; plc.WriteBit(PLCControllerPrismaticScanner.eBitOutput.PC_AUTO_STATUS, false); break; } } public override void RegisterDevices(IDeviceRegistry registry) { base.RegisterDevices(registry); var isSimul = ApplicationExt.IsSimulation; AlarmManager.Init(AuroraEnv); #region Common에 있는 Device를 등록한다. 26.04.06 // ↓ ACS 등록 추가 var ACS = new ScannerACS(isSimul); registry.Register(DeviceIds.ACS, () => ACS, new ACSDeviceConfig()); // TODO: 스테이지 X는 2 스테이지 Z는 4 확인완료 Y 사용 안함 var motorX2 = new ACSMotor(MotorIds.AxisX2, ACS, 2, (int)MotorIds.eMotorIdx.AxisX2); registry.Register(MotorIds.AxisX2, () => motorX2, new ACSMotorConfig(MotorIds.AxisX2), motor => new UCACSMotor(AuroraEnv.DeviceManager, motor.DeviceId)); var motorZ = new ACSMotor(MotorIds.AxisZ, ACS, 4, (int)MotorIds.eMotorIdx.AxisZ); registry.Register(MotorIds.AxisZ, () => motorZ, new ACSMotorConfig(MotorIds.AxisZ), motor => new UCACSMotor(AuroraEnv.DeviceManager, motor.DeviceId)); // ── 26.04.06 NDY 추가: DevGroup 적용 ────────────────────────────── foreach (var device in registry.GetDevices()) { if (device.DeviceId == DeviceIds.ACS || device.DeviceId == MotorIds.AxisX2 || //device.DeviceId == MotorIds.AxisY1 || //device.DeviceId == MotorIds.AxisY2 || device.DeviceId == MotorIds.AxisZ) { device.DevGroup = "ACS"; } } // ────────────────────────────────────────────────────────────────── #endregion } // 인터락 public override void RegisterRecipes(RecipeRegister register) { register(CommonRecipeIds.ScannerObjectTeaching, new ScannerObjectTeachingRecipe(), (id, item) => new UCScannerObjectTeaching(AuroraEnv)); base.RegisterRecipes(register); } public override void RegisterModels(ModelRegister register) { register(CommonModelIds.EquipmentSpecificModel, new EquipmentSpecificModel_PrismaticScanner(), (id, item) => new UCModelEditor(new UCModelEditorViewModel(AuroraEnv), ModelExternalDelegate.ExternalCreateEquipmentSpecificEditor)); base.RegisterModels(register); } public override void RegisterSequences(SequenceRegister register) { // Common Sequences register SequenceManager.RegisterSequence(AuroraEnv, register); base.RegisterSequences(register); var equipSetting = AuroraEnv.SettingEntry[AuroraSettings.Equipment] as EquipmentInfo; register(SequenceIds.SeqStreamTest, SeqStreamTest.Builder()); // Event Q Test 추가 var seqEventQTest = new SeqEventQTest(); register(SequenceIds.SeqEventQTest, seqEventQTest.Builder()); var seqAutoRunPrismaticScanner = new SeqAutoRunPrismaticScanner(); var seqAutoRunComponentWeld = new SeqAutoRunComponentWeld(); var seqAlarmMonitor = new SeqAlarmMonitor(); _SeqAutoRunPrismaticScanner_Builder = seqAutoRunPrismaticScanner.Builder(); _SeqAutoRunComponentWeld_Builder = seqAutoRunComponentWeld.Builder(); _SeqAlarmMonitor_Builder = seqAlarmMonitor.Builder(); register(SequenceIds.SeqAutoRun, _SeqAutoRunPrismaticScanner_Builder); register(SequenceIds.SeqAutoRunComponentWeld, _SeqAutoRunComponentWeld_Builder); register(SequenceIds.SeqAlarmMonitor, _SeqAlarmMonitor_Builder); register(SequenceIds.SeqStatusMonitor, SeqStatusMonitor.Builder()); // SequenceManager.RegisterSequence(AuroraEnv, register); #region 26.04.09 NDY - ACS MOTF AutoRun Sequence 등록 // 기존 SeqAutoRun(SeqAutoRunPrismaticScanner)은 건드리지 않고 // ACS MOTF 전용 시퀀스를 별도 Builder로 등록 var seqAutoRunPrismaticScannerACS = new SeqAutoRunPrismaticScannerACS(); _SeqAutoRunPrismaticScannerACS_Builder = seqAutoRunPrismaticScannerACS.Builder(); register(CommonSequenceIds.SeqAutoRunACS, _SeqAutoRunPrismaticScannerACS_Builder); #endregion } public override void RegisterSettings(SettingRegister register) { base.RegisterSettings(register); register(CommonSettingIds.UploadDatas, new SettingUploadDataListForScanner()); } public override void RegisterServices(IServiceRegistry register) { //Stream 사용 시에만 등록하도록 하자 var equipSetting = AuroraEnv.SettingEntry[AuroraSettings.Equipment] as EquipmentInfo; if (equipSetting.UseStream) { //LBAD register.Register(CommonServiceIds.StreamLBADClient, () => new StreamLBADClient(CommonStreamServiceNames.LBADRPC), new StreamClientConfig()); #region StreamTest //PubSub register.Register(CommonServiceIds.StreamPubTest, () => new StreamPub(CommonStreamServiceNames.PubSubTest), new StreamPubConfig()); register.Register(CommonServiceIds.StreamSubTest, () => new StreamSub(CommonStreamServiceNames.PubSubTest), new StreamSubConfig()); //RPC register.Register(CommonServiceIds.StreamServerTest, () => new StreamServer(CommonStreamServiceNames.LBADRPC), new StreamServerConfig()); register.Register(CommonServiceIds.StreamClientTest, () => new StreamClient(CommonStreamServiceNames.LBADRPC), new StreamClientConfig()); //MessageBroadcasting register.Register(CommonServiceIds.StreamBroadcastPub, () => new StreamBroadcastPub(), new StreamBroadcastPubConfig()); register.Register(CommonServiceIds.StreamBroadcastSub, () => new StreamBroadcastSub(), new StreamBroadcastSubConfig()); #endregion } } // Views는 장비별로 별도로 등록하자. public override void RegisterViews(IViewManager manager) { base.RegisterViews(manager); // Auto Run // 26.04.06 NDY: Manual 서브로 이동 - 26.04.14 주석이였으나 - 주석 해제 var MainAutoRun = new MainMenu(CommonViewIds.AutoRun, MenuIcon.GetMenuIcon(eMenuIcon.HOME), PermissionLevel.NONE, false); MainAutoRun.AddSubMenu(CommonViewIds.AutoRun, new UCMainAutoRun(new UCMainAutoRunViewModel(AuroraEnv, SequenceIds.SeqAutoRun))); manager.RegisterMainMenu(MainAutoRun); // Recipe MainMenu recipe = new MainMenu(CommonViewIds.Recipe, MenuIcon.GetMenuIcon(eMenuIcon.RECIPE), PermissionLevel.NONE, true); recipe.AddSubMenu(CommonViewIds.Recipe, new UCRecipe()); recipe.AddSubMenu(CommonViewIds.RecipeChangeHistory, new UCRecipeChangeHistory() { DataContext = new UCRecipeChangeHistoryViewModel(AuroraEnv) }); recipe.AddSubMenu(CommonViewIds.ModelEditor, new UCModel()); manager.RegisterMainMenu(recipe); AuroraEnv.EventObservable.AsObservable(CommonEventIds.EVENT_EQUIPMENT_STATUS_CHANGE) .Select(msg => (eEqpStatus)msg.Param) .ObserveOnDispatcher() .Subscribe(status => { if (status == eEqpStatus.Auto) { AuroraEnv.ViewManager.ChangeMenu(CommonViewIds.AutoRun); AuroraEnv.ViewManager.MainMenuEnable(false, CommonViewIds.Recipe); RecipeHelper.OnActiveReloaded(); } else { AuroraEnv.ViewManager.MainMenuAllEnable(true); //RecipeHelper.RollbackRecipe(); } //recipe.SubViews.Where(view => view.SubName == CommonViewIds.Recipe).First().View.IsEnabled = !isAuto; }); // Manual //var manual = new MainMenu(CommonViewIds.Manual, MenuIcon.GetMenuIcon(eMenuIcon.DEVICE), PermissionLevel.LEVEL4, true); // Level4 가 맞으나, 개발때는 None 으로 뒀다가 완료되면 풀자. var manual = new MainMenu(CommonViewIds.Manual, MenuIcon.GetMenuIcon(eMenuIcon.CAMERA), PermissionLevel.NONE, true); // 26.04.06 NDY 추가: AutoRun을 Manual 서브메뉴로 추가 //manual.AddSubMenu(CommonViewIds.AutoRun, new UCMainAutoRun(new UCMainAutoRunViewModel(AuroraEnv, SequenceIds.SeqAutoRun))); // 추가 manual.AddSubMenu(CommonViewIds.ScannerOperation, new UCManualScannerOperation(new UCManualScannerOperationViewModel(AuroraEnv, CommonDeviceIds.Scanner, false))); //manual.AddSubMenu(CommonViewIds.OCT, new UCOCTManualMotion(AuroraEnv, CommonDeviceIds.OCT)); //manual.AddSubMenu(CommonViewIds.LBAD, new UCLBADDevice(AuroraEnv, CommonDeviceIds.LBAD, CommonDeviceIds.IODevice)); //manual.AddSubMenu(CommonViewIds.ConvEdgeObject, new UCConvEdgeObject(AuroraEnv)); manual.AddSubMenu(CommonViewIds.ModelFinder, new UCManualModelFinder(new UCManualModelFinderViewModel(AuroraEnv))); #region 26.04.06 ACS 모션 스테이지 메뉴얼 추가 - 진행 예정이였으나, Gun 에 속해서 사용 애매함. View 자체를 전부 가져오지는 못함. - Gun의 view도 common에 복사 // Manual 메뉴에 추가 manual.AddSubMenu(CommonViewIds.StageManual, new UCStageManual(AuroraEnv, AuroraEnv.DeviceManager)); #endregion // Manual - For Test //manual.AddSubMenu(CommonViewIds.TestDevice, new UCTestDevice(new UCTestDeviceViewModel(AuroraEnv))); //manual.AddSubMenu(CommonViewIds.TestSequence, new UCTestSequence(new UCTestSequenceViewModel(AuroraEnv))); manager.RegisterMainMenu(manual); //Calibration var calibration = new MainMenu(CommonViewIds.Calibration, MenuIcon.GetMenuIcon(eMenuIcon.SCANNER), PermissionLevel.LEVEL3, true); calibration.AddSubMenu(CommonViewIds.Scanner, new UCScannerCalibration(new UCScannerCalibrationViewModel(AuroraEnv))); //calibration.AddSubMenu(CommonViewIds.Power, new UCPowerCalibration(AuroraEnv)); // 불필요 //calibration.AddSubMenu(CommonViewIds.PowerCalProfile, new UCPowerProfile(AuroraEnv, CommonDeviceIds.Laser)); // 불필요 calibration.AddSubMenu(CommonViewIds.PixelResolution, new UCCameraPixelResolution(new UCCameraPixelResolutionViewModel(AuroraEnv))); manager.RegisterMainMenu(calibration); // Monitoring #region 26 04 06 주석처리 PLCBitMonitoring PLCWordMonitoring IOInterfaceView (o) PLCInterfaceView (원래부터 주석처리) - 04.10 잠시 추가 - 04.13다시 해제 //var monitoring = new MainMenu(CommonViewIds.Monitoring, MenuIcon.GetMenuIcon(eMenuIcon.MONITORING), PermissionLevel.NONE, true); ////manual.AddSubMenu(CommonViewIds.PLCInterfaceView, new UCPLCInterfaceView(AuroraEnv, CommonDeviceIds.PLCDevice)); //monitoring.AddSubMenu(CommonViewIds.PLCBitMonitoring, new UCPLCBit() { DataContext = PLCStatic.GetInstanceBitVM(AuroraEnv, CommonDeviceIds.PLCDevice, ePLCNetType.MXComponent, PLCBase.ePLCDevice.M) }); //monitoring.AddSubMenu(CommonViewIds.PLCWordMonitoring, new UCPLCWord() { DataContext = PLCStatic.GetInstanceWordVM(AuroraEnv, CommonDeviceIds.PLCDevice, ePLCNetType.MXComponent, PLCBase.ePLCDevice.D) }); //monitoring.AddSubMenu(CommonViewIds.IOInterfaceView, new UCIOInterfaceView(AuroraEnv, CommonDeviceIds.IODevice)); //manager.RegisterMainMenu(monitoring); #endregion // Device var device = new MainMenu(CommonViewIds.Device, MenuIcon.GetMenuIcon(eMenuIcon.GEAR), PermissionLevel.LEVEL3, false); device.AddSubMenu(CommonViewIds.Device, new DeviceSettingView()); // "CommonViewIds.Setting" 는 EquipDef.cs 에서 정의한 ViewId manager.RegisterMainMenu(device); //Setting var setting = new MainMenu(CommonViewIds.Setting, MenuIcon.GetMenuIcon(eMenuIcon.SETTING), PermissionLevel.LEVEL1, true); setting.AddSubMenu(CommonViewIds.Setting, new EquipSettingView()); setting.AddSubMenu(CommonViewIds.LogSetting, new LogSettingView()); setting.AddSubMenu(CommonViewIds.AutoBackupView, new AutoBackupView2() { DataContext = new AutoBackupViewModel() }); manager.RegisterMainMenu(setting); // Alarm MainMenu alarm = new MainMenu(CommonViewIds.Alarm, MenuIcon.GetMenuIcon(eMenuIcon.BARCODE), PermissionLevel.NONE, true) .AddSubMenu(CommonViewIds.History, new AlarmHistoryView()) .AddSubMenu(CommonViewIds.Description, new AlarmDescView()); manager.RegisterMainMenu(alarm); var equipSetting = AuroraEnv.SettingEntry[AuroraSettings.Equipment] as EquipmentInfo; if (equipSetting.UseStream) { MainMenu service = new MainMenu(CommonViewIds.StreamDevice, MenuIcon.GetMenuIcon(eMenuIcon.DEVICE)) .AddSubMenu(CommonViewIds.StreamDevice, new UCServiceSettingView()); manager.RegisterMainMenu(service); } // Vision (미사용) //VisionFactory.RegisterViews(manager); } } }