| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073 | using System;using System.Collections.Generic;using System.Collections.ObjectModel;using System.Linq;using System.Windows;using System.Windows.Media;using Aitex.Core.Common;using Aitex.Core.Common.DeviceData;using Aitex.Core.Util;using Aitex.Core.Utilities;using Caliburn.Micro;using MECF.Framework.Common.DataCenter;using MECF.Framework.Common.Equipment;using MECF.Framework.Common.OperationCenter;using MECF.Framework.Common.RecipeCenter;using OpenSEMI.ClientBase;using VirgoCommon;using VirgoUI.Client.Models.Recipe;using VirgoUI.Client.Models.Sys;using Ax = Aitex.Core.Common;namespace VirgoUI.Client.Models.PMs{    public class PmOverviewViewModel : ModuleUiViewModelBase, ISupportMultipleSystem    {        private object[] _oldmfc = new object[5] { 0.0, 0.0, 0.0, 0.0, 0.0 };        //public Ax.WaferInfo PMWafer { get; set; }        //private Ax.WaferSize _PMWaferType = Ax.WaferSize.WS6;        //public Ax.WaferSize PMWaferType        //{        //    get        //    {        //        return _PMWaferType;        //    }        //    set        //    {        //        _PMWaferType = value;        //        NotifyOfPropertyChange("PMWaferType");        //    }        //}        private int _BottomPinStatus = 0;        public int BottomPinStatus        {            get            {                return _BottomPinStatus;            }            set            {                _BottomPinStatus = value;                NotifyOfPropertyChange("BottomPinStatus");            }        }        public int WaferLength1        {            get            {                Ax.WaferInfo wafer = ChamberWafer == null ? new Ax.WaferInfo() : ChamberWafer[0];                if (wafer.IsEmpty)                    return 0;                                switch (wafer.Size)                {                    case Ax.WaferSize.WS3: return 85;                    case Ax.WaferSize.WS8: return 125;                    default: return 145;                }            }        }        private int _MidPinStatus = 0;        public int MidPinStatus        {            get            {                return _MidPinStatus;            }            set            {                _MidPinStatus = value;                NotifyOfPropertyChange("MidPinStatus");            }        }        private int _TopPinStatus = 0;        public int TopPinStatus        {            get            {                return _TopPinStatus;            }            set            {                _TopPinStatus = value;                NotifyOfPropertyChange("TopPinStatus");            }        }        private int _CoverStatus = 0;        public int CoverStatus        {            get            {                return _CoverStatus;            }            set            {                _CoverStatus = value;                NotifyOfPropertyChange("CoverStatus");            }        }        //private int _ChamberStatus;        //public int ChamberStatus        //{        //    get { return _ChamberStatus; }        //    set        //    {        //        _ChamberStatus = value;        //        NotifyOfPropertyChange("ChamberStatus");        //    }        //}        private List<PMParameter> _PMParameters;        public List<PMParameter> PMParameters        {            get            {                return _PMParameters;            }            set            {                _PMParameters = value;                NotifyOfPropertyChange("PMParameters");            }        }        private List<PMParameter> _Temperatures;        public List<PMParameter> Temperatures        {            get            {                return _Temperatures;            }            set            {                _Temperatures = value;                NotifyOfPropertyChange("Temperatures");            }        }        private List<GaslineItem> _Gaslines;        public List<GaslineItem> Gaslines        {            get            {                return _Gaslines;            }            set            {                _Gaslines = value;                NotifyOfPropertyChange("Gaslines");            }        }                [Subscription("EPD.IsConnected")]        public bool IsEPDConnected        {            get;            set;        }        [Subscription("EPD.ChannelStatus")]        public string EPDStatus        {            get;            set;        }         public Visibility EPDVisibility        {            get;            set;        }        [Subscription("EnableBiasRF")]        public bool EnableBiasRF        {            get;            set;        }        [Subscription("IoThrottleValve.ThrottleValve.ProcessPressureOffset")]        public double ProcessPressureOffset        {            get;            set;        }        [Subscription("IoMfc.MfcGas1.IsEnable")]        public bool MfcGas1Enable        {            get;            set;        }        [Subscription("IoMfc.MfcGas2.IsEnable")]        public bool MfcGas2Enable        {            get;            set;        }        [Subscription("IoMfc.MfcGas3.IsEnable")]        public bool MfcGas3Enable        {            get;            set;        }        [Subscription("IoMfc.MfcGas4.IsEnable")]        public bool MfcGas4Enable        {            get;            set;        }        [Subscription("IoMfc.MfcGas5.IsEnable")]        public bool MfcGas5Enable        {            get;            set;        }        [Subscription("ModuleWaferList")]        public Ax.WaferInfo[] ChamberWafer        {            get;            set;        }        [Subscription("SlitDoor.DeviceData")]        public AITCylinderData SlitDoorData        {            get;            set;        }        [Subscription("LiftPin.DeviceData")]        public AITCylinderData LiftPinData        {            get;            set;        }        [Subscription("TriStateLiftPin.PinPosition")]        public int TriStateLiftPinPosition { get; set; }        [Subscription("TriStateLiftPin2.PinPosition")]        public int GroupTriStateLiftPinPosition { get; set; }        [Subscription("TriStateLiftPin4.PinPosition")]        public int DGroupTriStateLiftPinPosition { get; set; }        private int _PinPosition;        public int PinPosition        {            get            {                return _PinPosition;            }            set            {                _PinPosition = value;                NotifyOfPropertyChange("PinPosition");            }        }        [Subscription("TriStateLiftPin.ManualStopState")]        public bool TriStateLiftPinManualStopState { get; set; }        [Subscription("TriStateLiftPin2.ManualStopState")]        public bool GroupTriStateLiftPinManualStopState { get; set; }        [Subscription("TriStateLiftPin4.ManualStopState")]        public bool DGroupTriStateLiftPinManualStopState { get; set; }        private bool _ManualStopState;        public bool ManualStopState        {            get            {                return _ManualStopState;            }            set            {                _ManualStopState = value;                NotifyOfPropertyChange("ManualStopState");            }        }        [Subscription("TriStateLiftPin.ManualUpState")]        public bool TriStateLiftPinManualUpState { get; set; }        [Subscription("TriStateLiftPin2.ManualUpState")]        public bool GroupTriStateLiftPinManualUpState { get; set; }        [Subscription("TriStateLiftPin4.ManualUpState")]        public bool DGroupTriStateLiftPinManualUpState { get; set; }        public bool _ManualUpState;        public bool ManualUpState        {            get            {                return _ManualUpState;            }            set            {                _ManualUpState = value;                NotifyOfPropertyChange("ManualUpState");            }        }        [Subscription("TriStateLiftPin.ManualDownState")]        public bool TriStateLiftPinManualDownState { get; set; }        [Subscription("TriStateLiftPin2.ManualDownState")]        public bool GroupTriStateLiftPinManualDownState { get; set; }        [Subscription("TriStateLiftPin4.ManualDownState")]        public bool DGroupTriStateLiftPinManualDownState { get; set; }        private bool _ManualDownState;        public bool ManualDownState        {            get            {                return _ManualDownState;            }            set            {                _ManualDownState = value;                NotifyOfPropertyChange("ManualDownState");            }        }        [Subscription("SmallPin.DeviceData")]        public AITCylinderData UpperPinData        {            get;            set;        }        [Subscription("MediumPin.DeviceData")]        public AITCylinderData LowerPinData        {            get;            set;        }        [Subscription("Lid.DeviceData")]        public AITCylinderData LidData        {            get;            set;        }        [Subscription("LidLocker.DeviceData")]        public AITCylinderData LidLockerData        {            get;            set;        }        [Subscription("IsOnline")]        public bool IsOnline { get; set; }        [Subscription("LeakRate")]        public double LeakRate { get; set; }        [Subscription("IsCDAOK")]        public bool IsCDAOK { get; set; }        [Subscription("IsArmNotExtend")]        public bool IsArmNotExtend { get; set; }        [Subscription(VirgoDevice.ValveMfc1)]        public AITValveData GP1Valve        {            get;            set;        }        [Subscription(VirgoDevice.ValveMfc2)]        public AITValveData GP2Valve        {            get;            set;        }        [Subscription(VirgoDevice.ValveMfc3)]        public AITValveData GP3Valve        {            get;            set;        }        [Subscription(VirgoDevice.ValveMfc4)]        public AITValveData GP4Valve        {            get;            set;        }        [Subscription(VirgoDevice.ValveMfc5)]        public AITValveData GP5Valve        {            get;            set;        }        [Subscription(VirgoDevice.ValveChamberPurge)]        public AITValveData ChamberPurgeValve        {            get;            set;        }        [Subscription(VirgoDevice.ValveChamberPurge)]        public AITValveData SoftVentVlv { get; set; }        [Subscription(VirgoDevice.ValveFastVent)]        public AITValveData FastVentVlv { get; set; }        [Subscription(VirgoDevice.ValveSoftPumping)]        public AITValveData SoftPumpVlv { get; set; }        [Subscription(VirgoDevice.ValveFastPumping)]        public AITValveData FastPumpVlv { get; set; }        [Subscription(VirgoDevice.ValveN2Supply)]        public AITValveData N2SupplyVlv { get; set; }        [Subscription(VirgoDevice.ValveProcess)]        public AITValveData ProcessVlv { get; set; }        [Subscription("SensorATMSwitch")]        public AITSensorData SensorATMSwitch { get; set; }        [Subscription("N2PressureOk")]        public AITSensorData N2PressureOk { get; set; }        [Subscription("SensorVacSwitch")]        public AITSensorData SensorVacSwitch { get; set; }        [Subscription("SensorWaterFlowOk")]        public AITSensorData SensorWaterFlowOk { get; set; }                [Subscription("SensorCDAPressureOk")]        public AITSensorData SensorCDAPressureOk { get; set; }        [Subscription("SensorCDAPressureOk2")]        public AITSensorData SensorCDAPressureOk2 { get; set; }        [Subscription("SourceFan1")]        public AITSensorData SourceFan1 { get; set; }        [Subscription("SensorWaterLeakOk")]        public AITSensorData SensorWaterLeakOk { get; set; }        [Subscription("SensorArmNotExtend")]        public AITSensorData SensorArmNotExtend { get; set; }        [Subscription("TriStateLiftPin.CurrentValue")]        public float TriStateLiftPinCurrentValue { get; set; }        public void TriStateLiftPinStop()        {            InvokeClient.Instance.Service.DoOperation($"{SystemName}.{_servoLiftPinName}.Stop");        }        public void TriStateLiftPinUp()        {            InvokeClient.Instance.Service.DoOperation($"{SystemName}.{_servoLiftPinName}.Up");        }        public void TriStateLiftPinDown()        {            InvokeClient.Instance.Service.DoOperation($"{SystemName}.{_servoLiftPinName}.Down");        }        private AITMfcData _mfc1;        [Subscription(VirgoDevice.MfcGas1)]        public AITMfcData GP1Mfc        {            get            {                return _mfc1;            }            set            {                _mfc1 = value;                if (IsAutoMode && MfcGas1Enable)                {                    PMParameters.Find(x => x.Name == $"{SystemName}.IoMfc.MfcGas1.FeedBack").Setpoint = _mfc1.SetPoint.ToString("F1");                }            }        }        private AITMfcData _mfc2;        [Subscription(VirgoDevice.MfcGas2)]        public AITMfcData GP2Mfc        {            get            {                return _mfc2;            }            set            {                _mfc2 = value;                if (IsAutoMode && MfcGas2Enable)                {                    PMParameters.Find(x => x.Name == $"{SystemName}.IoMfc.MfcGas2.FeedBack").Setpoint = _mfc2.SetPoint.ToString("F1");                }            }        }        private AITMfcData _mfc3;        [Subscription(VirgoDevice.MfcGas3)]        public AITMfcData GP3Mfc        {            get            {                return _mfc3;            }            set            {                _mfc3 = value;                if (IsAutoMode && MfcGas3Enable/* && _Gaslines.Count > 2*/)                {                    PMParameters.Find(x => x.Name == $"{SystemName}.IoMfc.MfcGas3.FeedBack").Setpoint = _mfc3.SetPoint.ToString("F1");                }            }        }        private AITMfcData _mfc4;        [Subscription(VirgoDevice.MfcGas4)]        public AITMfcData GP4Mfc        {            get            {                return _mfc4;            }            set            {                _mfc4 = value;                if (IsAutoMode && MfcGas4Enable/* && _Gaslines.Count > 3*/)                {                    PMParameters.Find(x => x.Name == $"{SystemName}.IoMfc.MfcGas4.FeedBack").Setpoint = _mfc4.SetPoint.ToString("F1");                }            }        }        private AITMfcData _mfc5;        [Subscription(VirgoDevice.MfcGas5)]        public AITMfcData GP5Mfc        {            get            {                return _mfc5;            }            set            {                _mfc5 = value;                if (IsAutoMode && MfcGas5Enable/* && _Gaslines.Count > 4*/)                {                    PMParameters.Find(x => x.Name == $"{SystemName}.IoMfc.MfcGas5.FeedBack").Setpoint = _mfc5.SetPoint.ToString("F1");                }            }        }        [Subscription("Chiller.DeviceData")]        public AITChillerData ChillerData { get; set; }        [Subscription("HeaterChamber.DeviceData")]        public AITHeaterData HeaterChamber { get; set; }        [Subscription("ForelineHeater.DeviceData")]        public AITHeaterData ForelineHeater { get; set; }        [Subscription("WallHeater.DeviceData")]        public AITHeaterData WallHeater { get; set; }        [Subscription("GridHeater.DeviceData")]        public AITHeaterData GridHeater { get; set; }        [Subscription(VirgoDevice.ProcessGauge)]        public AITPressureMeterData ProcessGauge { get; set; }        [Subscription(VirgoDevice.PressureGauge)]        public AITPressureMeterData PressureGauge { get; set; }        [Subscription(VirgoDevice.ForelineGauge)]        public AITPressureMeterData ForelineGauge { get; set; }        private AITRfData _rf;        [Subscription("Rf.DeviceData")]        public AITRfData Rf        {            get            {                return _rf;            }            set            {                _rf = value;                if (IsAutoMode)                {                    PMParameters.Find(x => x.Name == $"{SystemName}.Rf.PowerOnTime").Setpoint = "";                    PMParameters.Find(x => x.Name == $"{SystemName}.Rf.ForwardPower").Setpoint = _rf.PowerSetPoint.ToString("F0");                    RfDutySetPoint = _rf.DutySetPoint.ToString("F0");                    NotifyOfPropertyChange("RfDutySetPoint");                    RfFrequencySetPoint = _rf.FrequencySetPoint.ToString("F0");                    NotifyOfPropertyChange("RfFrequencySetPoint");                    RfModeSetPoint = _rf.WorkMode == (int)RfMode.ContinuousWaveMode ? "Continuous" : "Pulsing";                    NotifyOfPropertyChange("RfModeSetPoint");                                   }            }        }        private AITRfData _rfBias;        [Subscription("BiasRf.DeviceData")]        public AITRfData RfBias        {            get            {                return _rfBias;            }            set            {                _rfBias = value;                if (IsAutoMode)                {                    PMParameters.Find(x => x.Name == $"{SystemName}.BiasMatch.MatchProcessMode").Setpoint = _rfBias.MatchPresetMode == (int)BiasRfMatchMode.Preset ? "Preset" : "Hold";                    PMParameters.Find(x => x.Name == $"{SystemName}.BiasMatch.C1").Setpoint = _rfBias.MatchPositionC1SetPoint.ToString("F1");                    PMParameters.Find(x => x.Name == $"{SystemName}.BiasMatch.C2").Setpoint = _rfBias.MatchPositionC2SetPoint.ToString("F1");                    PMParameters.Find(x => x.Name == $"{SystemName}.BiasRf.ForwardPower").Setpoint = _rfBias.PowerSetPoint.ToString("F0");                    RfMatchProcessModeSetPoint = _rf.TritonMatchProcessModeDisplay;                    InvokePropertyChanged("RfMatchProcessModeSetPoint");                }            }        }        private AITRfMatchData _match;        [Subscription("Match.DeviceData")]        public AITRfMatchData Match        {            get            {                return _match;            }            set            {                _match = value;                RfMatchPositionC1SetPoint = _match.TunePosition1.ToString("F0");                NotifyOfPropertyChange("RfMatchPositionC1SetPoint");                RfMatchPositionC2SetPoint = _match.TunePosition2.ToString("F0");                NotifyOfPropertyChange("RfMatchPositionC2SetPoint");            }        }        [Subscription("MainPump.DeviceData")]        public AITPumpData MainPumpData { get; set; }        private AITThrottleValveData _tv;        [Subscription(VirgoDevice.ThrottleValve)]        public AITThrottleValveData Tv        {            get            {                return _tv;            }            set            {                _tv = value;                if (IsAutoMode)                {                    PMParameters.Find(x => x.Name == $"{SystemName}.IoThrottleValve.ThrottleValve.TVMode").Setpoint = _tv.Mode == (int)PressureCtrlMode.TVPressureCtrl ? "Pressure"                                                                                                                    : _tv.Mode == (int)PressureCtrlMode.TVPositionCtrl ? "Position" : "Undefined";                    PMParameters.Find(x => x.Name == $"{SystemName}.IoThrottleValve.ThrottleValve.TVMode").Feedback = _tv.Mode == (int)PressureCtrlMode.TVPressureCtrl ? "Pressure"                                                                                                                   : _tv.Mode == (int)PressureCtrlMode.TVPositionCtrl ? "Position" : "Undefined";                    PMParameters.Find(x => x.Name == $"{SystemName}.IoThrottleValve.ThrottleValve.TVPosition").Setpoint = _tv.PositionSetPoint.ToString("F0");                    PMParameters.Find(x => x.Name == $"{SystemName}.IoThrottleValve.ThrottleValve.TVPressure").Setpoint = _tv.PressureSetPoint.ToString("F0");                    ThrottleValveModeSetPoint = _tv.TextMode;                    NotifyOfPropertyChange("ThrottleValveModeSetPoint");                    ThrottleValvePositionSetPoint = _tv.PositionSetPoint.ToString("F0");                    NotifyOfPropertyChange("ThrottleValvePositionSetPoint");                    ThrottleValvePressureSetPoint = _tv.PressureSetPoint.ToString("F0");                    NotifyOfPropertyChange("ThrottleValvePressureSetPoint");                }            }        }        public double TvHeight { get; set; }        public Visibility TvVisible { get; set; }        private AITSensorData _chamberDoorLid = new AITSensorData();        [Subscription(VirgoDevice.ChamberLid)]        public AITSensorData ChamberDoorLid        {            get            {                return _chamberDoorLid;            }            set            {                _chamberDoorLid = value;            }        }        private bool _isAutoMode;        private R_TRIG _trigChangeToAuto = new R_TRIG();        [Subscription(StateData.IsAutoMode)]        public bool IsAutoMode        {            get            {                return _isAutoMode;            }            set            {                _isAutoMode = value;                _trigChangeToAuto.CLK = _isAutoMode;                if (_trigChangeToAuto.Q)                {                    RfTimeSetPoint = "";                    NotifyOfPropertyChange("RfTimeSetPoint");                    RfModeSetPoint = "";                    NotifyOfPropertyChange("RfModeSetPoint");                    PMParameters.Find(x => x.Name == $"{SystemName}.Rf.ForwardPower").Setpoint = "";                    RfFrequencySetPoint = "";                    NotifyOfPropertyChange("RfFrequencySetPoint");                    RfDutySetPoint = "";                    NotifyOfPropertyChange("RfDutySetPoint");                    RfMatchProcessModeSetPoint = "";                    InvokePropertyChanged("RfMatchProcessModeSetPoint");                    RfMatchPositionC1SetPoint = "";                    NotifyOfPropertyChange("RfMatchPositionC1SetPoint");                    RfMatchPositionC2SetPoint = "";                    NotifyOfPropertyChange("RfMatchPositionC2SetPoint");                    for (int i = 1; i <= 5; i++)    //GasLine 跳号Enable                    {                        if ((bool)QueryDataClient.Instance.Service.GetConfig($"{SystemName}.MfcGas{i}.Enable"))                        {                            PMParameters.Find(x => x.Name == $"{SystemName}.IoMfc.MfcGas{i}.FeedBack").Setpoint = "";                        }                    }                    //PMParameters.Find(x => x.Name == $"{SystemName}.IoMfc.MfcGas1.FeedBack").Setpoint = "";                    //PMParameters.Find(x => x.Name == $"{SystemName}.IoMfc.MfcGas2.FeedBack").Setpoint = "";                    //PMParameters.Find(x => x.Name == $"{SystemName}.IoMfc.MfcGas3.FeedBack").Setpoint = "";                    //if (_Gaslines.Count > 3)                    //    PMParameters.Find(x => x.Name == $"{SystemName}.IoMfc.MfcGas4.FeedBack").Setpoint = "";                    //if (_Gaslines.Count > 4)                    //    PMParameters.Find(x => x.Name == $"{SystemName}.IoMfc.MfcGas5.FeedBack").Setpoint = "";                    ElectrodeTemperatureSetPoint = "";                    NotifyOfPropertyChange("ElectrodeTemperatureSetPoint");                    StepModeSetPoint = "";                    NotifyOfPropertyChange("StepModeSetPoint");                }            }        }        public bool IsManualMode        {            get            {                return !IsAutoMode;            }        }        public bool IsRFEnabled        {            get            {                return IsManualMode && IsGasFlowing || IsRfPowering;            }        }        //public bool IsMatchPositionInputEnabled        //{        //    get        //    {        //        if (Rf != null && Match.TuneMode1 == EnumRfMatchTuneMode.Auto)        //            return false;        //        return IsManualMode;        //    }        //}        [Subscription(StateData.RecipeStepNo)]        public int RecipeStepNo        {            get;            set;        }        private int _recipeStepMode;        [Subscription(StateData.RecipeStepMode)]        public int RecipeStepMode        {            get            {                return _recipeStepMode;            }            set            {                _recipeStepMode = value;                if (IsAutoMode)                {                    switch (_recipeStepMode)                    {                    //case (int)EndByCondition.EndByHeatUp:                    //    StepModeSetPoint = "Heat Up";                    //    break;                    //case (int)EndByCondition.EndByRfTime:                    //    StepModeSetPoint = "RF Time";                    //    break;                    default:                        StepModeSetPoint = "Step Time";                        break;                    }                    NotifyOfPropertyChange("StepModeSetPoint");                }            }        }        [Subscription(StateData.RecipeProcessTime)]        public string RecipeProcessTime        {            get;            set;        }        [Subscription(StateData.PumpTime)]        public string PumpTime        {            get;            set;        }        [Subscription(StateData.PMState)]        public int PMStatus { get; set; }        [Subscription(StateData.IsPumpingOkForProcess)]        public bool IsPumpingOkForProcess        {            get;            set;        }        [Subscription(StateData.IsCoolingOkForProcess)]        public bool IsCoolingOkForProcess        {            get;            set;        }        [Subscription(StateData.IsGasFlowingOkForProcess)]        public bool IsGasFlowingOkForProcess        {            get;            set;        }        [Subscription(StateData.DataLogName)]        public string DataLogName        {            get;            set;        }        [Subscription(StateData.TotalCycle)]        public int TotalCycle        {            get;            set;        }        [Subscription(StateData.SmallWafer)]        public int SmallWafer { get; set; }        [Subscription(StateData.MidWafer)]        public int MidWafer { get; set; }        [Subscription(StateData.BigWafer)]        public int BigWafer { get; set; }        public string TvText        {            get            {                //if (Tv == null || !SCLocal.PressureControlConfig.EnableThrottleValve)                return "";                //return string.Format("{0}%", Tv.PositionFeedback.ToString("F0"));            }        }        public string TvTextBackground        {            get            {                if (Tv == null)                    return "Transparent";                if (Tv.State != 1)                    return "Red";                return "Green";            }        }        public string PmOperationMode        {            get            {                return IsAutoMode ? "Auto" : "Manual";            }        }        public string PmOnlineMode        {            get            {                return IsOnline ? "Online" : "Offline";            }        }        public bool IsOnlineButtonEnabled        {            get { return !IsOnline; }        }        public bool IsOfflineButtonEnabled        {            get { return IsOnline; }        }        [IgnorePropertyChange]        public bool BasePressureSetPointSaved { get; set; }        [IgnorePropertyChange]        public bool PumpLimitSetPointSaved { get; set; }        public double ElectrodeTemperatureFeedback        {            get            {                return 0;                //return SCLocal.CoolingConfig.EnableElectrodeTcLeftAsControlTc ? (ElectrodeLeftThermalCouple!= null ? ElectrodeLeftThermalCouple.FeedBack :0) :                //    (ElectrodeRightThermalCouple!=null ? ElectrodeRightThermalCouple.FeedBack : 0);            }        }        public int WaferLength        {            get            {                Ax.WaferInfo wafer = ChamberWafer==null ? new Ax.WaferInfo() : ChamberWafer[0];                if (wafer.IsEmpty)                    return 0;                switch (wafer.Size)                {                    case Ax.WaferSize.WS3: return 85;                    case Ax.WaferSize.WS4: return 125;                    default: return 145;                }            }        }        public bool IsHeaterButtonEnable        {            get            {                if (SystemName == "PMB")                {                    if ((bool)QueryDataClient.Instance.Service.GetConfig($"PMA.Chiller.EnableChiller") && (bool)QueryDataClient.Instance.Service.GetConfig($"PMB.Chiller.ChillerSameWithPMA"))                    {                        return false;                    }                    else                        return IsManualMode;                }                else                    return IsManualMode;            }        }        public string HeaterButtonContent        {            get            {                if ((bool)QueryDataClient.Instance.Service.GetConfig($"PMA.Chiller.EnableChiller"))                {                    if (SystemName == "PMB")                    {                        if ((bool)QueryDataClient.Instance.Service.GetConfig($"PMB.Chiller.ChillerSameWithPMA"))                        {                            return "Temperature Set";                        }                        else                        {                            if ((bool)QueryDataClient.Instance.Service.GetConfig($"PMB.Chiller.EnableChiller"))                            {                                return "Temperature Set";                            }                            else                            {                                return "Substrate Heating";                            }                        }                    }                    else                    {                        return "Temperature Set";                    }                }                else                    return "Substrate Heating";            }        }        //public string WaferSize        //{        //    get        //    {        //        Ax.WaferInfo wafer = ChamberWafer == null ? new Ax.WaferInfo() : ChamberWafer[0];        //        if (wafer.IsEmpty)        //            return "";        //        switch (wafer.Size)        //        {        //            case Ax.WaferSize.WS3: return SmallWafer.ToString();        //            case Ax.WaferSize.WS4: return MidWafer.ToString();        //            default: return BigWafer.ToString();        //        }        //    }        //}        public bool IsSmallPinVisible        {            get { return (int)QueryDataClient.Instance.Service.GetConfig($"{SystemName}.LiftPinMode") == 1; }        }        public bool IsMidPinVisible        {            get { return (int)QueryDataClient.Instance.Service.GetConfig($"{SystemName}.LiftPinMode") == 1; }        }        public bool IsLiftPinVisible        {            get { return true; }        }        public bool IsLiftPinUp        {            get            {                return PinPosition == 3;            }        }        public bool IsLiftPinMiddle        {            get            {                return PinPosition == 2;            }        }        public bool IsLiftPinHome        {            get            {                return PinPosition == 0;            }        }        public bool EnableLiftPinUp        {            get { return !IsAutoMode && !IsLiftPinUp; }        }        public bool EnableLiftPinMiddle        {            get { return !IsAutoMode && !IsLiftPinMiddle; }        }        public bool EnableLiftPinHome        {            get { return !IsAutoMode && !IsLiftPinHome; }        }        public bool EnableLock        {            get { return LidLockerData != null && !LidLockerData.OpenSetPoint; }        }        public bool IsLiftPinDown        {            get            {                return PinPosition == 1;            }        }        public bool EnableLiftPinDown        {            get { return !IsAutoMode && !IsLiftPinDown; }        }        public bool EnableUnlock        {            get { return LidLockerData != null && !LidLockerData.CloseSetPoint; }        }        public bool IsUpperPinUp        {            get { return UpperPinData != null && UpperPinData.OpenFeedback; }        }        public bool EnableUpperPinUp        {            get { return !IsAutoMode && UpperPinData != null && !UpperPinData.OpenFeedback; }        }        public bool IsUpperPinDown        {            get { return UpperPinData != null && UpperPinData.CloseFeedback; }        }        public bool EnableUpperPinDown        {            get { return !IsAutoMode && UpperPinData != null && !UpperPinData.CloseFeedback; }        }        public bool EnableLiftPinManualMove        {            get { return !IsAutoMode; }        }        public bool IsLowerPinUp        {            get { return LowerPinData != null && LowerPinData.OpenFeedback; }        }        public bool EnableLowerPinUp        {            get { return !IsAutoMode && LowerPinData != null && !LowerPinData.OpenFeedback; }        }        public bool IsLowerPinDown        {            get { return LowerPinData != null && LowerPinData.CloseFeedback; }        }        public bool EnableLowerPinDown        {            get { return !IsAutoMode && LowerPinData != null && !LowerPinData.CloseFeedback; }        }        public bool IsLidOpen        {            get { return LidData != null && !LidData.CloseFeedback; }        }        public bool EnableCloseLid        {            get            {                return LidData != null && !LidData.CloseFeedback;            }        }        public bool EnableOpenLid        {            get            {                return LidData != null && LidData.CloseFeedback;            }        }        public bool IsSlitValveOpen        {            get { return SlitDoorData != null && SlitDoorData.OpenFeedback; }        }        public bool IsSlitValveClose        {            get { return !IsSlitValveOpen; }        }        public bool EnableCloseSlitValve        {            get            {                return !IsAutoMode && SlitDoorData != null && !SlitDoorData.CloseFeedback;            }        }        public bool EnableOpenSlitValve        {            get            {                return !IsAutoMode && SlitDoorData != null && SlitDoorData.CloseFeedback;            }        }        public bool EnableRfTimeSetPoint        {            get            {                return IsManualMode;            }        }        //public bool IsEnableCloseLid        //{        //    get        //    {        //        return !ChamberDoorLid.IsClose && !IsAutoMode;        //    }        //}        public bool IsLeftTcAsControlTc        {            get            {                return true;//SCLocal.CoolingConfig.EnableElectrodeTcLeftAsControlTc;            }        }        public bool IsRightTcAsControlTc        {            get            {                return !IsLeftTcAsControlTc;            }        }        public bool IsEnableRecipeScan        {            get            {                return IsAutoMode && !IsProcessing;            }        }        public bool IsEnableLotScan        {            get            {                return IsAutoMode && !IsProcessing;            }        }        public bool IsEnableSelectRecipe        {            get            {                return IsAutoMode && !IsProcessing;            }        }        public bool IsEnableStartRecipe        {            get            {                return IsAutoMode && !string.IsNullOrEmpty(SelectedRecipeName) && !IsProcessing;            }        }        public bool IsEnableNextStep        {            get            {                return IsAutoMode && IsProcessing;            }        }        public bool IsEnableStopRecipe        {            get            {                return IsAutoMode && IsProcessing;            }        }        public bool IsBarcodeEnabled        {            get;            set;        }        public bool IsRfPowerOn        {            get            {                return Rf != null && Rf.IsRfOn;            }        }        public bool IsBiasRfPowerOn        {            get            {                return RfBias != null && RfBias.IsRfOn;            }        }        public bool IsBiasMatchPowerOn        {            get            {                return RfBias != null && RfBias.IsRfOn && RfBias.IsMatchOn;            }        }        public bool IsBiasRfVisible        {            get            {                return (bool)QueryDataClient.Instance.Service.GetConfig($"{SystemName}.BiasRf.EnableBiasRF");            }        }        public bool IsBiasMatchVisible        {            get            {                return (bool)QueryDataClient.Instance.Service.GetConfig($"{SystemName}.BiasMatch.EnableBiasMatch");            }        }        public bool IsChillerVisibility        {            get            {                return (bool)QueryDataClient.Instance.Service.GetConfig($"{SystemName}.Chiller.EnableChiller");            }        }        public bool IsHeaterVisibility        {            get            {                return !IsChillerVisibility;            }        }        public bool IsMatchPositionInputEnabled        {            get            {                if (Rf != null && RfMatchProcessModeSetPoint != "Preset")                    return false;                return IsManualMode;            }        }        public bool IsChillerEnable        {            get            {                if (SystemName == "PMB")                {                    if ((bool)QueryDataClient.Instance.Service.GetConfig($"{SystemName}.Chiller.ChillerSameWithPMA"))                    {                        return false;                    }                    else                    {                        return (bool)QueryDataClient.Instance.Service.GetConfig($"{SystemName}.Chiller.EnableChiller");                    }                }                else                {                    return (bool)QueryDataClient.Instance.Service.GetConfig($"{SystemName}.Chiller.EnableChiller");                }            }        }        public bool IsHeaterEnable        {            get            {                return IsHeaterVisibility;            }        }        public bool SensorValue        {            get            {                return false;            }        }        public bool IsManualButtonEnabled        {            get            {                return IsAutoMode;            }        }        public bool IsAutoButtonEnabled        {            get            {                return !IsAutoMode;            }        }        public bool IsPumping        {            get            {                return (PMState)PMStatus == PMState.Pumping;            }        }        public bool IsStartPumping        {            get            {                return (PMState)PMStatus == PMState.LaunchingPump;            }        }        public bool enableServiceControl        {            get            {                return Permission == 3;            }        }        public string RecipeStepNoDisplay        {            get            {                return (PMState)PMStatus == PMState.Processing ? RecipeStepNo.ToString() : "--";            }        }        public string RecipeStepModeDisplay        {            get            {                if ((PMState)PMStatus != PMState.Processing)                    return "--";                switch (RecipeStepMode)                {                //case (int)EndByCondition.EndByHeatUp:                //    return "Heat Up Mode";                //case (int)EndByCondition.EndByRfTime:                //    return "RF Time Mode";                default:                    return "Step Time Mode";                }            }        }        private string _pumpButtonBackground = "#376092";        public string PumpButtonBackground        {            get            {                if (IsPumping)                {                    _pumpButtonBackground = _pumpButtonBackground == "#95B3D7" ? "Blue" : "#95B3D7";                    return _pumpButtonBackground;                }                if (IsPumpingOkForProcess)                    return "#00C900";                return "#376092";            }        }        public bool IsGasFlowing        {            get            {                return (PMState)PMStatus == PMState.GasFlowing;            }        }        private string _gasFlowButtonBackground = "CadetBlue";        public string GasFlowButtonBackground        {            get            {                if (IsGasFlowing)                {                    _gasFlowButtonBackground = _gasFlowButtonBackground == "#95B3D7" ? "Blue" : "#95B3D7";                    return _gasFlowButtonBackground;                }                if (IsGasFlowingOkForProcess)                    return "#00C900";                return "CadetBlue";            }        }        public bool IsCooling        {            get            {                return true;//ElectrodeCoolingWaterValve!=null && ElectrodeCoolingWaterValve.IsOpen;            }        }        private string _coolingButtonBackground = "CadetBlue";        public string CoolingButtonBackground        {            get            {                if (IsCooling)                {                    _coolingButtonBackground = _coolingButtonBackground == "#95B3D7" ? "Blue" : "#95B3D7";                    return _coolingButtonBackground;                }                if (IsCoolingOkForProcess)                    return "#00C900";                return "CadetBlue";            }        }        public bool IsRfPowering        {            get            {                return (PMState)PMStatus == PMState.RfPowering;            }        }        public bool IsLeakCheck        {            get            {                return (PMState)PMStatus == PMState.LeakCheck;            }        }        private string _rfPowerButtonBackground = "CadetBlue";        public string RfPowerButtonBackground        {            get            {                if (IsRfPowering)                {                    _rfPowerButtonBackground = _rfPowerButtonBackground == "#95B3D7" ? "Blue" : "#95B3D7";                    return _rfPowerButtonBackground;                }                return "CadetBlue";            }        }        public bool IsCyclePurging => (PMState)PMStatus == PMState.Purge;        private string _cyclePurgeButtonBackground = "CadetBlue";        public string CyclePurgeButtonBackground        {            get            {                if (IsCyclePurging)                {                    _cyclePurgeButtonBackground = _cyclePurgeButtonBackground == "#95B3D7" ? "Blue" : "#95B3D7";                    return _cyclePurgeButtonBackground;                }                return "CadetBlue";            }        }        public bool IsVenting        {            get            {                return (PMState)PMStatus == PMState.Venting;            }        }        private string _ventButtonBackground = "CadetBlue";        public string VentButtonBackground        {            get            {                if (IsVenting)                {                    _ventButtonBackground = _ventButtonBackground == "#95B3D7" ? "Blue" : "#95B3D7";                    return _ventButtonBackground;                }                return "CadetBlue";            }        }        public bool IsProcessing        {            get            {                return (PMState)PMStatus == PMState.PreProcess || (PMState)PMStatus == PMState.Processing || (PMState)PMStatus == PMState.PostProcess;            }        }        public Visibility RfPowerOnChamberVisibility        {            get            {                return IsRfPowerOn ? Visibility.Visible : Visibility.Hidden;            }        }        public Visibility BiasRfPowerOnChamberVisibility        {            get            {                if (!IsBiasRfVisible)                    return RfPowerOnChamberVisibility;                return IsBiasRfPowerOn ? Visibility.Visible : Visibility.Hidden;            }        }        public Visibility BoostPumpVisibility        {            get;            set;        }        public bool IsRfPowerOnEnabled        {            get            {                return !IsRfPowerOn;            }        }        public bool IsRfPowerOffEnabled        {            get            {                return IsRfPowerOn;            }        }        public string ChamberStatus        {            get            {                return $"{(PMState)PMStatus}";            }        }        public Brush ChamberStatusBkColor        {            get            {                switch ((PMState)PMStatus)                {                case PMState.Error:                    return Brushes.Red;                case PMState.Idle:                    return Brushes.LightGray;                default:                    return Brushes.LightGreen;                }                //return Brushes.Transparent;            }        }        public Brush ChamberStatusForeColor        {            get            {                if (true)                    return Brushes.Black;                //else if (false)                //    return Brushes.LightGreen;                //return Brushes.Red;            }        }        public Brush PMOnlineColor        {            get            {                if (IsOnline)                    return Brushes.LimeGreen;                return Brushes.Transparent;            }        }        public double RfReflectPower        {            get;            set;        }        public double RfForwardPower        {            get;            set;        }        public object[] RfPowerOnCommandParameter        {            get            {                return new object[] { VirgoDevice.Rf.ToString(), AITRfOperation.SetPowerOnOff.ToString(), "true" };            }        }        public object[] RfPowerOffCommandParameter        {            get            {                return new object[] { VirgoDevice.Rf.ToString(), AITRfOperation.SetPowerOnOff.ToString(), "false" };            }        }        public double LotBarcodeHeight        {            get            {                return IsBarcodeEnabled ? 35 : 0;            }        }        public double DataLogHeight        {            get            {                return IsBarcodeEnabled ? 0 : 35;            }        }        public double RecipeBarcodeHeight        {            get            {                return IsBarcodeEnabled ? 35 : 0;            }        }        public string RecipeBarcodeInputText        {            get;            set;        }        public int RecipeBarcodeLength        {            get;            set;        }        public int LotBarcodeLength        {            get;            set;        }        public int LotBarcodeMaxCount        {            get;            set;        }        [IgnorePropertyChange]        public string BasePressureSetPoint        {            get;            set;        }        [IgnorePropertyChange]        public string PumpLimitSetPoint        {            get;            set;        }        [IgnorePropertyChange]        public string ManualProcessElectrodeCriticalTemperatureSetPoint        {            get;            set;        }        private string _stepModeSetPoint = "";        [IgnorePropertyChange]        public string StepModeSetPoint        {            get            {                return _stepModeSetPoint;            }            set            {                _stepModeSetPoint = value;            }        }        [IgnorePropertyChange]        public string ElectrodeTemperatureSetPoint        {            get;            set;        }        [IgnorePropertyChange]        public string ThrottleValveModeSetPoint        {            get;            set;        }        [IgnorePropertyChange]        public string ThrottleValvePositionSetPoint        {            get;            set;        }        [IgnorePropertyChange]        public string ThrottleValvePressureSetPoint        {            get;            set;        }        [IgnorePropertyChange]        public string BoostPumpPressureSetPoint        {            get;            set;        }        [IgnorePropertyChange]        public string RfTimeSetPoint        {            get;            set;        }        private string _rfModeSetPoint;        [IgnorePropertyChange]        public string RfModeSetPoint        {            get            {                return _rfModeSetPoint;            }            set            {                _rfModeSetPoint = value;            }        }        [IgnorePropertyChange]        public string RfFrequencySetPoint        {            get;            set;        }        [IgnorePropertyChange]        public string RfDutySetPoint        {            get;            set;        }        [IgnorePropertyChange]        public string RfMatchProcessModeSetPoint        {            get;            set;        }        [IgnorePropertyChange]        public string RfMatchPositionC1SetPoint        {            get;            set;        }        [IgnorePropertyChange]        public string RfMatchPositionC2SetPoint        {            get;            set;        }        private string _selectedRecipeName;        [Subscription("RecipeName")]        public string SelectedRecipeName        {            get            {                return _selectedRecipeName;            }            set            {                if (string.IsNullOrEmpty(value))                    return;                _selectedRecipeName = value;                if (IsAutoMode)                {                    InvokePropertyChanged("SelectedRecipeName");                }            }        }        [Subscription("ProcessStatus")]        public string ProcessStatus        {            get;            set;        }        [Subscription("RecipeStepTimeElapsed")]        public string RecipeStepTimeElapsed        {            get;            set;        }        [Subscription("RecipeStepTimeSetPoint")]        public string RecipeStepTimeSetPoint        {            get;            set;        }        [Subscription("RecipeSteps")]        public string RecipeSteps        {            get;            set;        }        private string _recipeStepRfTimeSetPoint;        [Subscription("RecipeStepRfTimeSetPoint")]        public string RecipeStepRfTimeSetPoint        {            get            {                return _recipeStepRfTimeSetPoint;            }            set            {                _recipeStepRfTimeSetPoint = value;                if (IsAutoMode)                {                    RfTimeSetPoint = _recipeStepRfTimeSetPoint;                    InvokePropertyChanged("RfTimeSetPoint");                }            }        }        //public string RecipeStatusBackground        //{        //    get        //    {        //        return IsProcessing ? "Green" : "Blue";        //    }        //}        public ObservableCollection<string> RFModeItems        {            get;            set;        }        public bool IsRFModeSelectable        {            get;            set;        }        public bool IsFullControlPermission        {            get;            set;        }        public bool EnableDeviceControl        {            get            {                return IsFullControlPermission;            }        }        public Visibility WallHeaterVisibility { get; set; }        public Visibility GridHeaterVisibility { get; set; }        public Ax.WaferSize SmallPinWaferSize { get; set; }        public Ax.WaferSize MediumPinWaferSize { get; set; }        public Ax.WaferSize BigPinWaferSize { get; set; }        public string SmallPinUpText { get; set; }        public string SmallPinDownText { get; set; }        public string MediumPinUpText { get; set; }        public string MediumPinDownText { get; set; }        public int SmallPinHeight { get; set; }        public int MediumPinHeight { get; set; }        private int MenuPermission;        private int _servoLiftPinMode;        private string _servoLiftPinName;        public PmOverviewViewModel()        {            BasePressureSetPointSaved = true;            PumpLimitSetPointSaved = true;        }        protected override void Poll()        {            base.Poll();            PinPosition = _servoLiftPinMode == 1 ? TriStateLiftPinPosition : _servoLiftPinMode == 2 ? GroupTriStateLiftPinPosition: DGroupTriStateLiftPinPosition;            ManualStopState = _servoLiftPinMode == 1 ? TriStateLiftPinManualStopState : _servoLiftPinMode == 2 ? GroupTriStateLiftPinManualStopState: DGroupTriStateLiftPinManualStopState;            ManualUpState = _servoLiftPinMode == 1 ? TriStateLiftPinManualUpState : _servoLiftPinMode == 2 ? GroupTriStateLiftPinManualUpState: DGroupTriStateLiftPinManualUpState;            ManualDownState = _servoLiftPinMode == 1 ? TriStateLiftPinManualDownState : _servoLiftPinMode == 2 ? GroupTriStateLiftPinManualDownState: DGroupTriStateLiftPinManualDownState;        }        protected override void OnActivate()        {            base.OnActivate();            _servoLiftPinMode = (int)QueryDataClient.Instance.Service.GetConfig($"{SystemName}.LiftPinMode");            _servoLiftPinName = _servoLiftPinMode == 1 ? "TriStateLiftPin" : _servoLiftPinMode == 2 ? "TriStateLiftPin2" : _servoLiftPinMode == 4 ? "TriStateLiftPin4" : "";            BasePressureSetPoint = QueryDataClient.Instance.Service.GetConfig($"{SystemName}.Pump.PumpBasePressure").ToString();            PumpLimitSetPoint = ((float)(double)QueryDataClient.Instance.Service.GetConfig($"{SystemName}.Pump.PumpTimeLimit")).ToString();            SmallPinWaferSize = MapWaferSize((int)QueryDataClient.Instance.Service.GetConfig($"System.SmallWafer"));            MediumPinWaferSize = MapWaferSize((int)QueryDataClient.Instance.Service.GetConfig($"System.MidWafer"));            BigPinWaferSize = MapWaferSize((int)QueryDataClient.Instance.Service.GetConfig($"System.BigWafer"));            SmallPinUpText = $"{SmallPinWaferSize} Pin Up";            SmallPinDownText = $"{SmallPinWaferSize} Pin Down";            MediumPinUpText = $"{MediumPinWaferSize} Pin Up";            MediumPinDownText = $"{MediumPinWaferSize} Pin Down";            SmallPinHeight = (int)QueryDataClient.Instance.Service.GetConfig($"{SystemName}.LiftPinMode") == 0 ? 0 : 32;            MediumPinHeight = (int)QueryDataClient.Instance.Service.GetConfig($"{SystemName}.LiftPinMode") == 0 ? 0 : 32;            WallHeaterVisibility = ((bool)QueryDataClient.Instance.Service.GetConfig($"{SystemName}.EnableWallHeater")) ? Visibility.Visible : Visibility.Hidden;            GridHeaterVisibility = ((bool)QueryDataClient.Instance.Service.GetConfig($"{SystemName}.EnableGridHeater")) ? Visibility.Visible : Visibility.Hidden;            EPDVisibility = (bool) QueryDataClient.Instance.Service.GetConfig($"System.SetUp.EPDInstalled") && (bool)QueryDataClient.Instance.Service.GetConfig($"{SystemName}.EPD.IsEnabled")                ? Visibility.Visible                : Visibility.Hidden;        }        private Ax.WaferSize MapWaferSize(int value)        {            switch (value)            {                case 3: return Ax.WaferSize.WS3;                case 4: return Ax.WaferSize.WS4;                case 6: return Ax.WaferSize.WS6;                case 8: return Ax.WaferSize.WS8;            }            return Ax.WaferSize.WS0;        }        protected override void OnDeactivate(bool close)        {            base.OnDeactivate(close);        }        protected override void OnInitialize()        {            base.OnInitialize();            InitGasLine();            InitParameterList(SystemName);            foreach (var pmParameter in PMParameters)            {                Subscribe(pmParameter.Name);            }        }        private void InitGasLine()        {            Gaslines = new List<GaslineItem>();            for (int i = 1; i <= 5; i++)    //GasLine 跳号Enable            {                if ((bool)QueryDataClient.Instance.Service.GetConfig($"{SystemName}.MfcGas{i}.Enable"))                {                    var gasName = QueryDataClient.Instance.Service.GetConfig($"{SystemName}.MfcGas{i}.GasName");                    var gasscale = QueryDataClient.Instance.Service.GetConfig($"{SystemName}.MfcGas{i}.MfcN2Scale");                    Gaslines.Add(new GaslineItem                    {                        Index = (byte)i,                        Display = $"MfcGas{i} " + gasName.ToString() + " " + gasscale.ToString() + " sccm",                        ValveName = $"{SystemName}.ValveMfc{i}",                        MfcName = $"{SystemName}.MfcGas{i}"                    });                }            }            //int count = 0;            //for (int i = 1; i <= 5; i++)            //{            //    if ((bool)QueryDataClient.Instance.Service.GetConfig($"{SystemName}.MfcGas{i}.Enable")) count++;            //}            //for (byte index = 1; index <= count; index++)            //{            //    var gasName = QueryDataClient.Instance.Service.GetConfig($"{SystemName}.MfcGas{index}.GasName");            //    Gaslines.Add(new GaslineItem            //    {            //        Index = index,            //        Display = gasName.ToString(),            //        ValveName = $"{SystemName}.ValveMfc{index}",            //        MfcName = $"{SystemName}.MfcGas{index}"            //    });            //}        }        public List<PMParameter> InitParameterList(string pmID)        {            PMParameters = new List<PMParameter>();            // 工艺时间            PMParameters.Add(new PMParameter            {                Name = $"{pmID}.RecipeProcessTime", Display = "Process Time (s)", Type = ParameterType.Share, Feedback = "00:00:00"            });            // 工艺步数            PMParameters.Add(new PMParameter            {                Name = $"{pmID}.StepNo",                Display = "Process Step",                Type = ParameterType.Share,                Feedback = "0",                Setpoint = ""            });            // 工艺每一步运行时间            PMParameters.Add(new PMParameter            {                Name = $"{pmID}.RecipeStepTimeElapsed",                Display = "Time elapsed (s)",                Type = ParameterType.Default,                Feedback = "0",                Setpoint = "",                SetpointEnabled = false            });            // process gauge            PMParameters.Add(new PMParameter            {                Name = $"{pmID}.ProcessGauge.Value",                Display = "Process Pressure(mTorr)",                Type = ParameterType.Share,                Feedback = "0",                SetpointEnabled = false            });            // pressure gauge            //PMParameters.Add(new PMParameter            //{            //    Name = $"{pmID}.PressureGauge.Value", Display = "腔体压力(mTorr)",            //    Type = ParameterType.Share, Feedback = "0", SetpointEnabled = false            //});                        // foreline gauge            // 蝶阀运作模式            PMParameters.Add(new PMParameter            {                Name            = $"{pmID}.IoThrottleValve.ThrottleValve.TVMode",                Display         = "TVMode",                Type            = ParameterType.DropDownList,                SetpointEnabled = true,                Selections      = new List<string> { "Position", "Pressure" },                Setpoint        = "Pressure",                Feedback        = "Pressure"            });            // 蝶阀位置            PMParameters.Add(new PMParameter            {                Name = $"{pmID}.IoThrottleValve.ThrottleValve.TVPosition", Display = "TVPosition (%)",                Type = ParameterType.Default, Feedback = "0", Setpoint = "", SetpointEnabled = true            });            // 蝶阀压力            PMParameters.Add(new PMParameter            {                Name = $"{pmID}.IoThrottleValve.ThrottleValve.TVPressure", Display = "TVPressure (mTorr)",                Type = ParameterType.Default, Feedback = "0", Setpoint = "", SetpointEnabled = true            });            // 底座温度            PMParameters.Add(new PMParameter            {                Name = $"{pmID}.IoTemperatureCtrl.TemperatureControl.SubstrateTemperature",                Display = HeaterButtonContent== "Substrate Heating" ? "LE TEMP (℃)": "Chiller TEMP(℃)",                Type = ParameterType.Default,                Feedback = "0",                Setpoint = "",                SetpointEnabled = true            });            // 射频时间            PMParameters.Add(new PMParameter            {                Name = $"{pmID}.Rf.PowerOnTime", Display = "RF Time (s)", Type = ParameterType.Default,                Feedback = "0", Setpoint = "", SetpointEnabled = true            });            //para = new PMParameter() { Display = "RF Mode", Type = ParameterType.DropDownList, Feedback = "Manual", SetpointEnabled = true };            //para.Selections = new List<string>() { "Manual", "Auto" };            //paras.Add(para);            // 设定功率            PMParameters.Add(new PMParameter            {                Name = $"{pmID}.Rf.ForwardPower", Display = "Source ForwardPower (w)", Type = ParameterType.Default,                Feedback = "", Setpoint = "", SetpointEnabled = true            });            // ReflectPower            PMParameters.Add(new PMParameter            {                Name = $"{pmID}.Rf.ReflectPower",                Display = "Source ReflectPower (w)",                Type = ParameterType.Share,                Setpoint = ""            });            //// Match C1            //PMParameters.Add(new PMParameter            //{            //    Name =$"{pmID}.Match.TunePosition1", Display = "Match C1 (%)", Type = ParameterType.Default, Feedback = "", Setpoint = "",            //    SetpointEnabled = true            //});            //// Match C2            //PMParameters.Add(new PMParameter            //{            //    Name = $"{pmID}.Match.TunePosition2", Display = "Match C2 (%)", Type = ParameterType.Default, Feedback = "", Setpoint = "",            //    SetpointEnabled = true            //});            // Match C1            PMParameters.Add(new PMParameter()            {                Name = $"{pmID}.Match.TunePosition1",                Display = "Source Match C1(%)",                Type = ParameterType.Share,                Setpoint = ""            });            // Match C2            PMParameters.Add(new PMParameter()            {                Name = $"{pmID}.Match.TunePosition2",                Display = "Source Match C2(%)",                Type = ParameterType.Share,                Setpoint = ""            });            // Vpp            PMParameters.Add(new PMParameter()            {                Name = $"{pmID}.Match.VPP",                Display = "Source Vpp", Type = ParameterType.Share, Setpoint = ""            });            if ((bool)QueryDataClient.Instance.Service.GetConfig($"{pmID}.BiasRf.EnableBiasRF"))            {                // 设定功率                PMParameters.Add(new PMParameter                {                    Name = $"{pmID}.BiasRf.ForwardPower",                    Display = "Bias ForwardPower(w)",                    Type = ParameterType.Default,                    Feedback = "",                    Setpoint = "",                    SetpointEnabled = true                });                // ReflectPower                PMParameters.Add(new PMParameter                {                    Name = $"{pmID}.BiasRf.ReflectPower",                    Display = "Bias ReflectPower(w)",                    Type = ParameterType.Share,                    Setpoint = ""                });                // Match Mode                PMParameters.Add(new PMParameter                {                    Name = $"{pmID}.BiasMatch.MatchProcessMode",                    Display = "Bias Match Mode",                    Type = ParameterType.DropDownList,                    SetpointEnabled = true,                    Selections = new List<string> { "Preset", "Hold" },                    Setpoint = "Preset",                    Feedback = "Preset"                });                // Match C1                PMParameters.Add(new PMParameter                {                    Name = $"{pmID}.BiasMatch.C1",                    Display = "Bias Match C1(%)",                    Type = ParameterType.Default,                    Feedback = "0",                    Setpoint = "",                    SetpointEnabled = true                });                // Match C2                PMParameters.Add(new PMParameter                {                    Name = $"{pmID}.BiasMatch.C2",                    Display = "Bias Match C2(%)",                    Type = ParameterType.Default,                    Feedback = "0",                    Setpoint = "",                    SetpointEnabled = true                });                // Vpp                PMParameters.Add(new PMParameter()                {                    Name = $"{pmID}.BiasMatch.VPP",                    Display = "Bias Vpp",                    Type = ParameterType.Share,                    Setpoint = ""                });            }            // 气体            foreach (var gas in Gaslines)            {                PMParameters.Add(new PMParameter                {                    Name = $"{pmID}.IoMfc.MfcGas{gas.Index}.FeedBack",                    Display = $"{gas.Display} (sccm)",                    Type = ParameterType.Default,                    Feedback = "0",                    Setpoint = "0",                    SetpointEnabled = true                });            }            return PMParameters;        }        public void SelectRecipe()        {            if (MenuPermission != 3) return;            if (!Enum.TryParse(SystemName, out ModuleName mod))                return;            RecipeSequenceSelectDialogViewModel dialog = new RecipeSequenceSelectDialogViewModel();            dialog.DisplayName = "Select Recipe";            dialog.Files = new ObservableCollection<FileNode>(RecipeSequenceTreeBuilder.GetFiles(RecipeClient.Instance.Service.GetRecipes(mod, false).ToList()));            WindowManager wm = new WindowManager();            bool? bret = wm.ShowDialog(dialog);            if ((bool)bret)            {                SelectedRecipeName = dialog.DialogResult;            }        }        public void UnLoad()        {        }        public void Start()        {            if (MenuPermission != 3) return;            if (string.IsNullOrWhiteSpace(this.SelectedRecipeName))            {                DialogBox.ShowError("Choose recipe");                return;            }            InvokeClient.Instance.Service.DoOperation($"{SystemName}.{RtOperation.RunRecipe}", $"{SystemName}\\{this.SelectedRecipeName}");        }        public void NextStep()        {            if (MenuPermission != 3) return;            if (MessageBox.Show("Next step?", "JetPlasma", MessageBoxButton.YesNo) == MessageBoxResult.Yes)            {                InvokeClient.Instance.Service.DoOperation($"{SystemName}.{RtOperation.SkipCurrentStep}");            }        }        public void Stop()        {            if (MenuPermission != 3) return;            if (MessageBox.Show("Stop process?", "JetPlasma", MessageBoxButton.YesNo) == MessageBoxResult.Yes)            {                InvokeClient.Instance.Service.DoOperation($"{SystemName}.{RtOperation.AbortRecipe}");            }        }        public void SetManual()        {            if (MenuPermission != 3) return;            InvokeClient.Instance.Service.DoOperation($"{SystemName}.PmManual");        }        public void SetAuto()        {            if (MenuPermission != 3) return;            InvokeClient.Instance.Service.DoOperation($"{SystemName}.PmAuto");        }        public void SetOnline()        {            if (MenuPermission != 3) return;            InvokeClient.Instance.Service.DoOperation($"{SystemName}.PmOnline");        }        public void SetInit()        {            if (MenuPermission != 3) return;            InvokeClient.Instance.Service.DoOperation($"{SystemName}.Home");        }        public void AbortPM()        {            if (MenuPermission != 3) return;            InvokeClient.Instance.Service.DoOperation($"{SystemName}.Abort");        }        public void SetOffline()        {            if (MenuPermission != 3) return;            InvokeClient.Instance.Service.DoOperation($"{SystemName}.PmOffline");        }        public void UnlockLid()        {            if (MenuPermission != 3) return;            InvokeClient.Instance.Service.DoOperation($"{SystemName}.UnlockLid");        }        public void LockLid()        {            if (MenuPermission != 3) return;            InvokeClient.Instance.Service.DoOperation($"{SystemName}.LockLid");        }        public void OpenSlitValve()        {            if (MenuPermission != 3) return;            if (!IsCDAOK)            {                DialogBox.ShowWarning("CDA Pressure Error");                return;            }            if (!IsArmNotExtend)            {                DialogBox.ShowWarning("Arm Is Not Extend Error");                return;            }            InvokeClient.Instance.Service.DoOperation($"{SystemName}.SlitDoor.Open");        }        public void CloseSlitValve()        {            if (MenuPermission != 3) return;            if (!IsCDAOK)            {                DialogBox.ShowWarning("CDA Pressure Error");                return;            }            if (!IsArmNotExtend)            {                DialogBox.ShowWarning("Arm Is Not Extend Error");                return;            }            InvokeClient.Instance.Service.DoOperation($"{SystemName}.SlitDoor.Close");        }        protected override void InvokeAfterUpdateProperty(Dictionary<string, object> data)        {            MenuPermission = ClientApp.Instance.GetPermission($"Overview{SystemName}");            foreach (var pmParameter in PMParameters)            {                string paraName = pmParameter.Name;                if (!data.ContainsKey(paraName))                    continue;                pmParameter.Feedback = $"{data[paraName]:N0}";                if (paraName == $"{SystemName}.BiasMatch.MatchProcessMode")                {                    pmParameter.Feedback = (int)data[paraName] == 1 ? "Preset" : "Hold";                }                if (paraName == $"{SystemName}.BiasMatch.C1")                {                    pmParameter.Feedback = $"{data[paraName]:N1}";                }                if (paraName == $"{SystemName}.BiasMatch.C2")                {                    pmParameter.Feedback = $"{data[paraName]:N1}";                }                if (paraName == $"{SystemName}.ProcessGauge.Value")                {                    pmParameter.Feedback = $"{data[paraName]:N1}";                }                if (paraName == $"{SystemName}.IoThrottleValve.ThrottleValve.TVMode")                {                    pmParameter.Feedback = pmParameter.Setpoint;                }                if (paraName == $"{SystemName}.IoThrottleValve.ThrottleValve.TVPressure")                {                    if (Convert.ToDouble(data[paraName]) <= 0.0)                    {                        pmParameter.Feedback = "0.0";                    }                    else                    {                        pmParameter.Feedback = $"{(Convert.ToDouble(data[paraName]) + ProcessPressureOffset):N1}";                    }                }                if (paraName == $"{SystemName}.Rf.PowerOnTime")                {                    pmParameter.Feedback = $"{data[$"{SystemName}.Rf.PowerOnTime"]}";                }                if (paraName == $"{SystemName}.Match.TunePosition1"|| paraName == $"{SystemName}.Match.TunePosition2")                {                    pmParameter.Feedback = $"{data[paraName]:N2}";                }                if (paraName == $"{SystemName}.StepTime")                {                    pmParameter.Feedback = $"{data[$"{SystemName}.RecipeStepTimeElapsed"]:N0}";                    pmParameter.Setpoint = $"{data[$"{SystemName}.RecipeStepTimeSetPoint"]:N0}";                }                if (paraName == $"{SystemName}.StepNo")                {                    pmParameter.Setpoint = $"{data[$"{SystemName}.RecipeSteps"]:N0}";                }                if (paraName == $"{SystemName}.RecipeStepTimeElapsed")                {                    pmParameter.Setpoint = $"{data[$"{SystemName}.RecipeStepTimeSetPoint"]:N0}";                }                if (paraName == ($"{SystemName}.IoTemperatureCtrl.TemperatureControl.SubstrateTemperature"))                {                    if(IsAutoMode)                    {                        pmParameter.Setpoint = string.Format("{0:N1}", ((AITHeaterData)data[$"{SystemName}.HeaterChamber.DeviceData"]).SetPoint);                    }                    pmParameter.Feedback = string.Format("{0:N1}", ((AITHeaterData)data[$"{SystemName}.HeaterChamber.DeviceData"]).FeedBack);                }            }            foreach (var gasLine in Gaslines)            {                if (data.ContainsKey(gasLine.ValveName))                {                    gasLine.ValveData = (AITValveData)data[gasLine.ValveName];                    gasLine.NotifyOfPropertyChange("ValveData");                }                if (data.ContainsKey(gasLine.MfcName))                {                    gasLine.MfcData = (AITMfcData)data[gasLine.MfcName];                    gasLine.Display = gasLine.MfcData.DeviceName + " " + gasLine.MfcData.DisplayName + " " + gasLine.MfcData.Scale + " " + gasLine.MfcData.Unit;                    PMParameters.Find(x => x.Name == $"{SystemName}.IoMfc.MfcGas{gasLine.Index}.FeedBack").Display = gasLine.Display;                    PMParameters.Find(x => x.Name == $"{SystemName}.IoMfc.MfcGas{gasLine.Index}.FeedBack").NotifyOfPropertyChange("Display");                    gasLine.NotifyOfPropertyChange("MfcData");                }            }            //if (PMParameters.Find(x => x.Name == $"{SystemName}.BiasMatch.MatchProcessMode").Setpoint == "Hold")            //{            //    PMParameters.Find(x => x.Name == $"{SystemName}.BiasMatch.C1").Setpoint = "";            //    PMParameters.Find(x => x.Name == $"{SystemName}.BiasMatch.C2").Setpoint = "";            //}        }        public void DoStartPump()        {            if (MenuPermission != 3) return;            if (IsStartPumping)            {                InvokeClient.Instance.Service.DoOperation($"{SystemName}.{RtOperation.Abort}");                return;            }            InvokeClient.Instance.Service.DoOperation($"{SystemName}.StartPump");        }        // Pumpdown        public void DoPump()        {            if (MenuPermission != 3) return;            if (IsPumping)            {                InvokeClient.Instance.Service.DoOperation($"{SystemName}.{RtOperation.Abort}");                return;            }            if (IsPumpingOkForProcess)            {                InvokeClient.Instance.Service.DoOperation($"{SystemName}.StopPump");                return;            }            // 设置底压            double basePressure = string.IsNullOrEmpty(BasePressureSetPoint) ? 0 : Convert.ToDouble(BasePressureSetPoint);            if (basePressure <= 0.01 || basePressure >= 1000)            {                MessageBox.Show($"Basic pressure setpoint {basePressure} invalid,between 0 end 1000(mtorr)");                return;            }            double pumpLimit = string.IsNullOrEmpty(PumpLimitSetPoint) ? 0 : Convert.ToDouble(PumpLimitSetPoint);            if (pumpLimit <= 0.01 || pumpLimit >= 1200)            {                MessageBox.Show($"Pump limit between 0 end 1200,current value {pumpLimit}");                return;            }            InvokeClient.Instance.Service.DoOperation("System.SetConfig", $"{SystemName}.Pump.PumpBasePressure", basePressure.ToString());            InvokeClient.Instance.Service.DoOperation("System.SetConfig", $"{SystemName}.Pump.PumpTimeLimit", pumpLimit.ToString());            InvokeClient.Instance.Service.DoOperation($"{SystemName}.Pump");            // pump down 过程中tv 全开            var tvMode = PMParameters.Find(x => x.Name == $"{SystemName}.IoThrottleValve.ThrottleValve.TVMode");            tvMode.Feedback = "Position";            PumpLimitSetPointSaved = true;            BasePressureSetPointSaved = true;            NotifyOfPropertyChange(nameof(PumpLimitSetPointSaved));            NotifyOfPropertyChange(nameof(BasePressureSetPointSaved));        }        private void MoveGuidePin(MovementPosition pos)        {            switch (pos)            {            case MovementPosition.Down:                BottomPinStatus = 1;                TopPinStatus = 0;                MidPinStatus = 0;                break;            case MovementPosition.Up:                BottomPinStatus = 0;                TopPinStatus = 1;                MidPinStatus = 0;                break;            case MovementPosition.Middle:                BottomPinStatus = 0;                TopPinStatus = 0;                MidPinStatus = 1;                break;            default:                break;            }        }        public void Purge()        {            if (MenuPermission != 3) return;            if (IsCyclePurging)            {                InvokeClient.Instance.Service.DoOperation($"{SystemName}.StopPurge");            }            else            {                InvokeClient.Instance.Service.DoOperation($"{SystemName}.Purge");            }        }        public void LeakCheck()        {            if (!IsLeakCheck)            {                InvokeClient.Instance.Service.DoOperation($"{SystemName}.LeakCheck");            }        }        public void Vent()        {            if (MenuPermission != 3) return;            //OverviewPMProvider.Instance.Vent("PM1");            if (!IsVenting)            {                InvokeClient.Instance.Service.DoOperation($"{SystemName}.Vent");                return;            }            InvokeClient.Instance.Service.DoOperation($"{SystemName}.{RtOperation.Abort}");        }        /// <summary>        /// 流气        /// </summary>        public void Gas()        {            if (MenuPermission != 3) return;            if (!this.HandleThrottleValve())                return;            //GasLine 跳号Enable            object[] mfc = new object[5];            string[] mfcSetPoint = new string[5];            for (int i = 0; i < 5; i++)            {                if ((bool)QueryDataClient.Instance.Service.GetConfig($"{SystemName}.MfcGas{i + 1}.Enable"))                {                    mfcSetPoint[i] = PMParameters.Find(x => x.Name == $"{SystemName}.IoMfc.MfcGas{i + 1}.FeedBack").Setpoint;                    if (string.IsNullOrWhiteSpace(mfcSetPoint[i]))                    {                        DialogBox.ShowError("Please input gas flow value");                        return;                    }                }                mfc[i] = Convert.ToDouble(string.IsNullOrEmpty(mfcSetPoint[i]) ? "0.0" : mfcSetPoint[i]);            }            //object[] mfc = new object[Gaslines.Count];            //string[] mfcSetPoint = new string[Gaslines.Count];            //for (int index = 0; index < Gaslines.Count; index++)            //{            //    mfcSetPoint[index] = PMParameters.Find(x => x.Name == $"{SystemName}.IoMfc.MfcGas{index + 1}.FeedBack").Setpoint;            //    if (string.IsNullOrWhiteSpace(mfcSetPoint[index]))            //    {            //        DialogBox.ShowError("请输入气体流量值");            //        return;            //    }            //    mfc[index] = Convert.ToDouble(string.IsNullOrEmpty(mfcSetPoint[index]) ? "0.0" : mfcSetPoint[index]);            //}            if ((IsGasFlowing                 && (Math.Abs((double)mfc[0] - (double)_oldmfc[0]) < 0.01)                 && (Math.Abs((double)mfc[1] - (double)_oldmfc[1]) < 0.01)                 && (Math.Abs((double)mfc[2] - (double)_oldmfc[2])) < 0.01)                || (IsGasFlowing && (Math.Abs((double)mfc[0]) <= 0.01 && Math.Abs((double)mfc[1]) <= 0.01 && Math.Abs((double)mfc[2]) <= 0.01)))            {                InvokeClient.Instance.Service.DoOperation($"{SystemName}.{RtOperation.Abort}");                return;            }            _oldmfc = mfc;            InvokeClient.Instance.Service.DoOperation($"{SystemName}.{RtOperation.GasFlow}", mfc);        }        /// <summary>        /// 处理蝶阀        /// </summary>        /// <returns></returns>        private bool HandleThrottleValve()        {            var tvMode = PMParameters.Find(x => x.Name == $"{SystemName}.IoThrottleValve.ThrottleValve.TVMode");            string tvModeSp = "TV" + tvMode.Setpoint + "Ctrl";            if (!Enum.TryParse(tvModeSp, out PressureCtrlMode ctrlMode))            {                MessageBox.Show("Select the mode of Throttle valve");                return false;            }            switch (ctrlMode)            {            case PressureCtrlMode.TVPressureCtrl:                string tvPressureSP = PMParameters.Find(x => x.Name == $"{SystemName}.IoThrottleValve.ThrottleValve.TVPressure").Setpoint;                if (string.IsNullOrWhiteSpace(tvPressureSP))                {                    DialogBox.ShowError("Please input TV pressure value");                    return false;                }                double pressure = Convert.ToDouble(tvPressureSP);                if (pressure < 0 || pressure > 756000)                {                    DialogBox.ShowError($"TV pressure {pressure} invalid,between 0 end 756000");                    return false;                }                InvokeClient.Instance.Service.DoOperation($"{SystemName}.{VirgoDevice.ThrottleValve}.{AITThrottleValveOperation.SetPressure}", pressure);                break;            case PressureCtrlMode.TVPositionCtrl:                string tvPositionSP = PMParameters.Find(x => x.Name == $"{SystemName}.IoThrottleValve.ThrottleValve.TVPosition").Setpoint;                if (string.IsNullOrWhiteSpace(tvPositionSP))                {                    DialogBox.ShowError("Please input TV Position value");                    return false;                }                double position = Convert.ToDouble(tvPositionSP);                if (position < 0 || position > 100)                {                    DialogBox.ShowError($"TV Position {position} invalid,between 0 end 100");                    return false;                }                InvokeClient.Instance.Service.DoOperation($"{SystemName}.{VirgoDevice.ThrottleValve}.{AITThrottleValveOperation.SetPosition}", position);                break;            default:                break;            }            tvMode.Feedback = tvMode.Setpoint;            return true;        }        public void Heat()        {            var para_temp = PMParameters.Find(x => x.Name == $"{SystemName}.IoTemperatureCtrl.TemperatureControl.SubstrateTemperature");            var temp = para_temp.Setpoint;            if (double.TryParse(temp, out double dt))            {                InvokeClient.Instance.Service.DoOperation($"{SystemName}.{RtOperation.Heat}", dt);            }            else            {                DialogBox.ShowError("Set TEMP invalid");            }        }        // RF Power        public void RF()        {            if (MenuPermission != 3) return;            double rf_sp = 0;            double rf_sp_bias = 0;            double match1_sp = 0.0f;            double match2_sp = 0.0f;            double rf_time = 0;            string rfPowerSetPointBias = "";            BiasRfMatchMode matchMode = BiasRfMatchMode.Preset;            if (IsRfPowering)            {                InvokeClient.Instance.Service.DoOperation($"{SystemName}.{RtOperation.Abort}");                return;            }            // 源射频功率            string rfPowerSetPoint = PMParameters.Find(x => x.Name == $"{SystemName}.Rf.ForwardPower").Setpoint;            if (string.IsNullOrWhiteSpace(rfPowerSetPoint))            {                DialogBox.ShowWarning("Input RF power set value first");                return;            }            // 源射频时间            string sRFTime = PMParameters.Find(x => x.Name == $"{SystemName}.Rf.PowerOnTime").Setpoint;            if (string.IsNullOrWhiteSpace(sRFTime))            {                DialogBox.ShowError("Input RF power time");                return;            }            // 偏压射频功率            if ((bool)QueryDataClient.Instance.Service.GetConfig($"{SystemName}.BiasRf.EnableBiasRF"))            {                rfPowerSetPointBias = PMParameters.Find(x => x.Name == $"{SystemName}.BiasRf.ForwardPower").Setpoint;                if (string.IsNullOrWhiteSpace(rfPowerSetPointBias))                {                    DialogBox.ShowWarning("Input Bias RF power set value first");                    return;                }                rf_sp_bias = Convert.ToDouble(rfPowerSetPointBias);                if ((bool)QueryDataClient.Instance.Service.GetConfig($"{SystemName}.BiasMatch.EnableBiasMatch"))                {                    var MatchMode = PMParameters.Find(x => x.Name == $"{SystemName}.BiasMatch.MatchProcessMode");                    if (!Enum.TryParse(MatchMode.Setpoint, out matchMode))                    {                        MessageBox.Show("Select the mode of Throttle valve");                        return;                    }                    if (matchMode == BiasRfMatchMode.Preset)                    {                        PMParameters.Find(x => x.Name == $"{SystemName}.BiasMatch.MatchProcessMode").Feedback = "Preset";                        // Match C1                        string rfMatchC1SetPoint = PMParameters.Find(x => x.Name == $"{SystemName}.BiasMatch.C1").Setpoint;                        if (string.IsNullOrWhiteSpace(rfMatchC1SetPoint))                        {                            DialogBox.ShowWarning("Input Match C1 set value first");                            return;                        }                        // Match C2                        string rfMatchC2SetPoint = PMParameters.Find(x => x.Name == $"{SystemName}.BiasMatch.C2").Setpoint;                        if (string.IsNullOrWhiteSpace(rfMatchC2SetPoint))                        {                            DialogBox.ShowWarning("Input Match C2 set value first");                            return;                        }                        match1_sp = Convert.ToDouble(rfMatchC1SetPoint);                        match2_sp = Convert.ToDouble(rfMatchC2SetPoint);                    }                    else if (matchMode == BiasRfMatchMode.Hold)                    {                        //PMParameters.Find(x => x.Name == $"{SystemName}.BiasMatch.MatchProcessMode").Feedback = "Hold";                    }                }            }                       rf_sp = Convert.ToDouble(rfPowerSetPoint);             rf_time = Convert.ToDouble(sRFTime);            InvokeClient.Instance.Service.DoOperation($"{SystemName}.{RtOperation.RfPower}", rf_sp, rf_sp_bias, rf_time, (int)matchMode, match1_sp, match2_sp);        }        // Lift pin method        public void MoveLiftPinSetState(string name)        {            if (MenuPermission != 3) return;            if (!IsCDAOK)            {                DialogBox.ShowWarning("CDA Pressure Error");                return;            }            InvokeClient.Instance.Service.DoOperation($"{SystemName}.{_servoLiftPinName}.SetState",name);        }        public void MoveLiftPinHome(string name)        {            if (MenuPermission != 3) return;            if (!IsCDAOK)            {                DialogBox.ShowWarning("CDA Pressure Error");                return;            }            InvokeClient.Instance.Service.DoOperation($"{SystemName}.{_servoLiftPinName}.Home",name);        }        public void MoveLiftPinDown()        {            if (MenuPermission != 3) return;            if (!IsCDAOK)            {                DialogBox.ShowWarning("CDA Pressure Error");                return;            }            InvokeClient.Instance.Service.DoOperation($"{SystemName}.LiftPin.Close");        }        // Guide pin method        public void MovePin3Up()        {            if (MenuPermission != 3) return;            if (!IsCDAOK)            {                DialogBox.ShowWarning("CDA Pressure Error");                return;            }            InvokeClient.Instance.Service.DoOperation($"{SystemName}.{RtOperation.MoveGuidePin}", WaferSize.WS3, 2);        }        public void MovePin3Down()        {            if (MenuPermission != 3) return;            if (!IsCDAOK)            {                DialogBox.ShowWarning("CDA Pressure Error");                return;            }            InvokeClient.Instance.Service.DoOperation($"{SystemName}.{RtOperation.MoveGuidePin}", WaferSize.WS3, 1);        }        public void MovePin4Up()        {            if (MenuPermission != 3) return;            if (!IsCDAOK)            {                DialogBox.ShowWarning("CDA Pressure Error");                return;            }            InvokeClient.Instance.Service.DoOperation($"{SystemName}.{RtOperation.MoveGuidePin}", WaferSize.WS4, 2);        }        public void MovePin4Down()        {            if (MenuPermission != 3) return;            if (!IsCDAOK)            {                DialogBox.ShowWarning("CDA Pressure Error");                return;            }            InvokeClient.Instance.Service.DoOperation($"{SystemName}.{RtOperation.MoveGuidePin}", WaferSize.WS4, 1);        }    }}
 |