using Aurora.Api.Manager; using Aurora.Api; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Aurora.View; using Aurora; using System.Collections.ObjectModel; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Threading; using AuroraOCT.IPG; namespace AuroraOCT.Views { internal class UCOCTManualMotionViewModel : NotifyPropertyChangedBase { Logger Log = new Logger("OCT"); #region Xaml Property private ObservableCollection _ListItemSerialNumbers; public ObservableCollection ListItemSerialNumbers { get => _ListItemSerialNumbers; set => SetProperty(ref _ListItemSerialNumbers, value); } private ObservableCollection _ListItemLDDSerialNumbers; public ObservableCollection ListItemLDDSerialNumbers { get => _ListItemLDDSerialNumbers; set => SetProperty(ref _ListItemLDDSerialNumbers, value); } private string _strCellSerialNumber; public string strCellSerialNumber { get => _strCellSerialNumber; set => SetProperty(ref _strCellSerialNumber, value); } private string _strSequenceFileName; public string strSequenceFileName { get => _strSequenceFileName; set => SetProperty(ref _strSequenceFileName, value); } private string _strSequenceResult; public string strSequenceResult { get => _strSequenceResult; set => SetProperty(ref _strSequenceResult, value); } private string _strJobResult; public string strJobResult { get => _strJobResult; set => SetProperty(ref _strJobResult, value); } private string _strJobLastError; public string strJobLastError { get => _strJobLastError; set => SetProperty(ref _strJobLastError, value); } private string OCTState = "Initializing"; private bool _bRadioInitializing; public bool bRadioInitializing { get => _bRadioInitializing; set => SetProperty(ref _bRadioInitializing, value); } private bool _bRadioReady; public bool bRadioReady { get => _bRadioReady; set => SetProperty(ref _bRadioReady, value); } private bool _bRadioBusy; public bool bRadioBusy { get => _bRadioBusy; set => SetProperty(ref _bRadioBusy, value); } private bool _bRadioNoRespone; public bool bRadioNoRespone { get => _bRadioNoRespone; set => SetProperty(ref _bRadioNoRespone, value); } private bool _bRadioAcquiring; public bool bRadioAcquiring { get => _bRadioAcquiring; set => SetProperty(ref _bRadioAcquiring, value); } private bool _bRadioProcessing; public bool bRadioProcessing { get => _bRadioProcessing; set => SetProperty(ref _bRadioProcessing, value); } private bool _bRadioWaitingTrigger; public bool bRadioWaitingTrigger { get => _bRadioWaitingTrigger; set => SetProperty(ref _bRadioWaitingTrigger, value); } private bool _bRadioNotRemoteMode; public bool bRadioNotRemoteMode { get => _bRadioNotRemoteMode; set => SetProperty(ref _bRadioNotRemoteMode, value); } #endregion #region Envent Command public ICommand CMD_VisibleChanged { get; } public ICommand CMD_ReloadSerialNumber { get; } public ICommand CMD_ClearSerialNumber { get; } public ICommand CMD_GetSerialNumberFromFile { get; } public ICommand CMD_AddSerialNumber { get; } public ICommand CMD_CheckSerialNumber { get; } public ICommand CMD_RemoveSerialNumber { get; } public ICommand CMD_Connent { get; } public ICommand CMD_DisConnect { get; } public ICommand CMD_StartSW { get; } public ICommand CMD_SetSequenceFile { get; } public ICommand CMD_RunSequence { get; } public ICommand CMD_StopSequence { get; } public ICommand CMD_GetLastSequenceResult { get; } public ICommand CMD_GetLastJobResult { get; } public ICommand CMD_OCTStateChanged { get; } public ICommand CMD_ENTER_REMOTE { get; } public ICommand CMD_SET_REMOTE_SEQ { get; } public ICommand CMD_START_SEQ { get; } public ICommand CMD_GET_REMOTE_MODE { get; } public ICommand CMD_GETKHD { get; } public ICommand CMD_GETKHD2 { get; } public ICommand CMD_STOP_SEQ { get; } private readonly DispatcherTimer _CurrentStatusUpdateTimer; #endregion private readonly IDeviceManager _deviceManger; private readonly OCT _OCT; //private readonly OCTConfig _config; public UCOCTManualMotionViewModel(IAuroraEnvironment aurora, string deviceId) { _deviceManger = aurora.DeviceManager; _OCT = _deviceManger[deviceId] as OCT; #region DelegateCommand CMD_VisibleChanged = new DelegateCommand(VisibleChanged); CMD_ReloadSerialNumber = new DelegateCommand(ReloadSerialNumber); CMD_ClearSerialNumber = new DelegateCommand(ClearSerialNumber); CMD_GetSerialNumberFromFile = new DelegateCommand(GetSerialNumberFromFile); CMD_AddSerialNumber = new DelegateCommand(AddSerialNumber); CMD_CheckSerialNumber = new DelegateCommand(CheckSerialNumber); CMD_RemoveSerialNumber = new DelegateCommand(RemoveSerialNumber); CMD_Connent = new DelegateCommand(Connect); CMD_DisConnect = new DelegateCommand(DisConnect); CMD_StartSW = new DelegateCommand(StartSW); CMD_SetSequenceFile = new DelegateCommand(SetSequenceFile); CMD_RunSequence = new DelegateCommand(RunSequence); CMD_StopSequence = new DelegateCommand(StopSequence); CMD_GetLastSequenceResult = new DelegateCommand(GetLastSequenceResult); CMD_GetLastJobResult = new DelegateCommand(GetLastJobResult); CMD_OCTStateChanged = new DelegateCommand(OCTStateChanged); CMD_GETKHD = new DelegateCommand(KHDTEST); CMD_GETKHD2 = new DelegateCommand(QATEST); CMD_STOP_SEQ = new DelegateCommand(StopSequence); CMD_ENTER_REMOTE = new DelegateCommand(EnterRemote); CMD_SET_REMOTE_SEQ = new DelegateCommand(SetRemoteSeq); CMD_START_SEQ = new DelegateCommand(StartSeq); CMD_GET_REMOTE_MODE = new DelegateCommand(GetRemoteMode); #endregion InitializeUIProperties(); _CurrentStatusUpdateTimer = new DispatcherTimer(); _CurrentStatusUpdateTimer.Tick += OnMonitoring; _CurrentStatusUpdateTimer.Interval = TimeSpan.FromMilliseconds(200); } private void InitializeUIProperties() { strSequenceResult = ""; strSequenceFileName = ""; } private void OnMonitoring(object sender, EventArgs e) { GetOCTState(); OCTStateChange(); } #region Event Functions private void VisibleChanged(object obj) { bool visible = (bool)obj; if (visible) { _CurrentStatusUpdateTimer?.Start(); } else { _CurrentStatusUpdateTimer?.Stop(); } } private void ReloadSerialNumber(object obj) { if (_OCT.IsSimul) { return; } if (_OCT != null) { if (_OCT.Config.Type == eOCTType.IPG_LDD700) { } // _OCT..functions } } private void ClearSerialNumber(object obj) { if (_OCT.IsSimul) { return; } if (_OCT != null) { // _OCT..functions } } private void GetSerialNumberFromFile(object obj) { if (_OCT.IsSimul) { return; } if (_OCT != null) { //var oct = _OCT._OCT as LDD700; _ListItemLDDSerialNumbers.Clear(); foreach (var item in ListItemSerialNumbers) { string strRet; //if (oct.get_serial_number(item.Name, out strRet) == (int)eLDDErr.ACK) { if (_OCT.get_serial_number(item.Name, out strRet) == (int)eLDDErr.ACK) { ListItem listItem = new ListItem { Name = strRet }; _ListItemLDDSerialNumbers.Add(listItem); } } // _OCT..functions } } public void AddSerialNumber(object obj) { if (_OCT.IsSimul) { return; } if (strCellSerialNumber.Length < 1) { MessageUtil.CreateAndShowMessageDialog("Fail", "SerialNumber is empty"); } if (_OCT != null) { //var oct = _OCT._OCT as LDD700; //oct.AddWorkPieceID(strCellSerialNumber); _OCT.AddWorkPieceID(strCellSerialNumber); } } public void CheckSerialNumber(object obj) { if (_OCT.IsSimul) { return; } if (strCellSerialNumber.Length < 1) { MessageUtil.CreateAndShowMessageDialog("Fail", "SerialNumber is empty"); } if (_OCT != null) { //var oct = _OCT._OCT as LDD700; //if (oct.CheckWorkPieceID(strCellSerialNumber) == 0) { if (_OCT.CheckWorkPieceID(strCellSerialNumber) == 0) { MessageUtil.CreateAndShowMessageDialog("Success", string.Format("{0} SerialNumber is registered", strCellSerialNumber)); } else { MessageUtil.CreateAndShowMessageDialog("Fail", string.Format("{0} SerialNumber is not registered", strCellSerialNumber)); } } } private void RemoveSerialNumber(object obj) { if (_OCT.IsSimul) { return; } if (_OCT != null) { // _OCT..functions } } private void Connect(object obj) { if (_OCT.IsSimul) { return; } if (_OCT != null) { //var oct = _OCT._OCT as LDD700; //oct.Open(_OCT.Config); _OCT.Open(_OCT.Config); //if (_OCT._OCT.GetConnected()) { if (_OCT.GetConnected()) { MessageUtil.CreateAndShowMessageDialog("Success", "OCT is Connected."); } else { MessageUtil.CreateAndShowMessageDialog("Fail", "OCT is not Connected."); } } } private void DisConnect(object obj) { if (_OCT.IsSimul) { return; } if (_OCT != null) { //var oct = _OCT._OCT as LDD700; //oct.DisConnect(); _OCT.DisConnect(); } } private void StartSW(object obj) { if (_OCT.IsSimul) { return; } if (_OCT != null) { //var oct = _OCT._OCT as LDD700; //oct.start_software(); _OCT.start_software(); //if (_OCT._OCT.GetConnected()) { if (_OCT.GetConnected()) { MessageUtil.CreateAndShowMessageDialog("Success", "OCT is Connected."); } else { MessageUtil.CreateAndShowMessageDialog("Fail", "OCT is not Connected."); } } } private void SetSequenceFile(object obj) { if (_OCT.IsSimul) { return; } if (_OCT != null) { //var oct = _OCT._OCT as LDD700; //if (oct.set_sequence_file(strSequenceFileName) == 0) { if (_OCT.set_sequence_file(strSequenceFileName) == 0) { MessageUtil.CreateAndShowMessageDialog("Success", "Sequence File Setting is Completed."); } else { MessageUtil.CreateAndShowMessageDialog("Fail", "Sequence File Setting is Failed."); } } } private void RunSequence(object obj) { if (_OCT.IsSimul) { return; } if (_OCT != null) { //var oct = _OCT._OCT as LDD700; //// Set Sequence File 이 있는데, Start 도 file 이름을 받는다. 왜그런지는 모름.. //if (oct.start(strSequenceFileName) == 0) { if (_OCT.start(strSequenceFileName) == 0) { } else { MessageUtil.CreateAndShowMessageDialog("Fail", "Sequence Starting is Failed."); } } } private void StopSequence(object obj) { if (_OCT.IsSimul) { return; } if (_OCT != null) { //var oct = _OCT._OCT as LDD700; //if (oct.stop() == 0) { if (_OCT.stop() == 0) { MessageUtil.CreateAndShowMessageDialog("Success", "Sequence Stopped."); } else { MessageUtil.CreateAndShowMessageDialog("Fail", "Sequence Stop is Failed."); } } } private void GetLastSequenceResult(object obj) { if (_OCT.IsSimul) { return; } if (_OCT != null) { //var oct = _OCT._OCT as LDD700; string strResult; //if (oct.get_last_seqeunce_result(out strResult) == 0) { if (_OCT.get_last_seqeunce_result(out strResult) == 0) { strSequenceResult = strResult; } else { MessageUtil.CreateAndShowMessageDialog("Fail", "Sequence Running Failed."); } } } private void GetLastJobResult(object obj) { if (_OCT.IsSimul) { return; } if (_OCT != null) { //var oct = _OCT._OCT as LDD700; List strResult; List strLastErr; //if (oct.get_last_job_result(out strResult) == 0) { if (_OCT.get_last_job_result(out strResult) == 0) { // strResult 를 parsing 해서 strJobResult 에 넣을 것 } else { MessageUtil.CreateAndShowMessageDialog("Fail", "Job Running Failed."); } //if (oct.get_last_job_fail_codes(out strLastErr) == 0) { if (_OCT.get_last_job_fail_codes(out strLastErr) == 0) { // strLastErr 를 parsing 해서 strJobLastError 에 넣을 것 } else { MessageUtil.CreateAndShowMessageDialog("Fail", "Job Error Code Response Failed."); } } } #endregion public class ListItem { public string Name { get; set; } public override string ToString() { return Name; } } private void OCTStateChanged(object obj) { OCTState = (string)obj; } private void EnterRemote(object obj) { if (_OCT.IsSimul) { return; } if (_OCT != null) { //var oct = _OCT._OCT as LDD700; //if (oct.EnterRemoteMode(30000) == 0) { if (_OCT.EnterRemoteMode(30000) == 0) { } } } private void SetRemoteSeq(object obj) { if (_OCT.IsSimul) { return; } if (_OCT != null) { //var oct = _OCT._OCT as LDD700; //if (oct.SetRemoteControl(2) == 0) { if (_OCT.SetRemoteControl(2) == 0) { } } } private void StartSeq(object obj) { if (_OCT.IsSimul) { return; } if (_OCT != null) { //var oct = _OCT._OCT as LDD700; //if (oct.SetProgram(1) == 0) { if (_OCT.SetProgram(1) == 0) { } } } private void GetRemoteMode(object obj) { if (_OCT.IsSimul) { return; } int nRet = 0; if (_OCT != null) { //var oct = _OCT._OCT as LDD700; //nRet = oct.GetRemoteControl(); nRet = _OCT.GetRemoteControl(); } if (nRet == 0) { strSequenceResult = "OFF"; } else if (nRet == 1) { strSequenceResult = "Remote Job Mode"; } else if (nRet == 2) { strSequenceResult = "Remote Sequence Mode"; } else { strSequenceResult = ""; } } private void KHDTEST(object obj) { strSequenceResult = ""; //r OCT = _OCT._OCT as LDD700; string strAVG = _OCT.GetKHD_AVG(); string strMIN = _OCT.GetKHD_MIN(); string strMAX = _OCT.GetKHD_MAX(); string strUnder = _OCT.GetKHD_LowSum(); string strUpper = _OCT.GetKHD_HighSum(); strSequenceResult = strAVG + ", " + strMIN + ", " + strMAX + ", " + strUnder + ", " + strUpper; } private void QATEST(object obj) { strSequenceResult = ""; //var OCT = _OCT._OCT as LDD700; List list = new List(); list = _OCT.GetKHD_Total(); for (int i = 0; i < list.Count; i++) { strSequenceResult += list[i] + ", "; } } private void OCTStateChange() { // 이 함수가 호출되어야 OCTState 변수를 바꾸고 나서 UI 에 적용된다. bRadioInitializing = OCTState == "Initializing" ? true : false; bRadioReady = OCTState == "Ready for Command" ? true : false; bRadioBusy = OCTState == "Busy" ? true : false; bRadioNoRespone = OCTState == "No Response" ? true : false; bRadioAcquiring = OCTState == "Acquiring" ? true : false; bRadioProcessing = OCTState == "Processing" ? true : false; bRadioWaitingTrigger = OCTState == "Waiting for Trigger" ? true : false; bRadioNotRemoteMode = OCTState == "Not in Remote Mode" ? true : false; } private void GetOCTState() { if (_OCT.IsSimul) { OCTState = "No Response"; return; } if (_OCT != null) { //var oct = _OCT._OCT as LDD700; string strResult; //if (oct.get_system_state(out strResult) != -1) { if (_OCT.get_system_state(out strResult) != -1) { OCTState = strResult; } else { OCTState = "No Response"; } } } } }