public InspectionStep[] GetInspectionSteps() { IntPtr stepsPtr = IntPtr.Zero; int i = 0; int j = 0; InspectionStep[] steps; InspectionStepsPriv stepsPriv = new InspectionStepsPriv(); InspectionStepPriv[] stepArrayPriv; PassFailConditionPriv[] conditionArrayPriv; Error err = vbaiGetInspectionSteps(_session.nativeSession, ref stepsPtr); if (err != Error.Success) { steps = null; ExceptionBuilder.CheckErrorAndThrow(err); return(steps); } stepsPriv = (InspectionStepsPriv)Marshal.PtrToStructure(stepsPtr, typeof(InspectionStepsPriv)); steps = new InspectionStep[stepsPriv.numSteps]; stepArrayPriv = new InspectionStepPriv[stepsPriv.numSteps]; for (i = 0; i < stepsPriv.numSteps; i++) { int structSize = Marshal.SizeOf(typeof(InspectionStepPriv)); stepArrayPriv[i] = (InspectionStepPriv)Marshal.PtrToStructure((System.IntPtr)((int)stepsPriv.stepsIntPtr + i * structSize), typeof(InspectionStepPriv)); steps[i].stateName = String.Copy(stepArrayPriv[i].stateName); steps[i].stepClass = String.Copy(stepArrayPriv[i].stepClass); steps[i].stepGUID = String.Copy(stepArrayPriv[i].stepGUID); steps[i].stepName = String.Copy(stepArrayPriv[i].stepName); steps[i].conditionsArray = new PassFailCondition[stepArrayPriv[i].numConditions]; conditionArrayPriv = new PassFailConditionPriv[stepArrayPriv[i].numConditions]; int offset = 0; for (j = 0; j < stepArrayPriv[i].numConditions; j++) { PassFailConditionPriv temp = (PassFailConditionPriv)Marshal.PtrToStructure((System.IntPtr)((int)stepArrayPriv[i].conditionsArrayIntPtr + offset), typeof(PassFailConditionPriv)); offset += 28; // increment for next item on next iteration. Marshal.SizeOf(typeof(NumericCondition)); steps[i].conditionsArray[j].typeCondition = temp.typeCondition; if (temp.typeCondition == (PassFailConditionType.NumericCondition)) { steps[i].conditionsArray[j].used = (temp.conditionPriv.numericCondition.used == 1); steps[i].conditionsArray[j].num1 = temp.conditionPriv.numericCondition.value1; steps[i].conditionsArray[j].num2 = temp.conditionPriv.numericCondition.value2; steps[i].conditionsArray[j].numFunction = temp.conditionPriv.numericCondition.function; } else { steps[i].conditionsArray[j].used = (temp.conditionPriv.stringCondition.used == 1); steps[i].conditionsArray[j].str1 = Marshal.PtrToStringAnsi(temp.conditionPriv.stringCondition.value1); steps[i].conditionsArray[j].str2 = Marshal.PtrToStringAnsi(temp.conditionPriv.stringCondition.value2); steps[i].conditionsArray[j].strFunction = temp.conditionPriv.stringCondition.function; } } } vbaiDispose(stepsPtr); return(steps); }
/// <summary> /// 外観検査モード主処理 /// </summary> /// <returns>正常終了/異常終了</returns> public bool MainProc() { log.System("検査モード 開始"); string recipe_fpath = m_cfg.RecipeFileList[m_recipeNo]; // レシピファイルリード m_insList = InspectionList.LoadRecipeFile(recipe_fpath); if (m_insList == null) { CommonUI.MsgBox.Error($"検査レシピ取得エラー\r\nレシピ'{m_recipeNo}'をリード中に異常がありました"); return(false); } // デバイス異常時のコールバック設定 m_devMgr.OnErrorEnd += OnDeviceErrorEnd; m_devMgr.InputID += OnDeviceInputId; m_step = InspectionStep.None; // プリンタの使用有無設定更新 m_devMgr.Printer.Use = !string.IsNullOrEmpty(m_insList.TemplateFileNameBarcode); // メイン画面生成 m_fmMain = new UI.FormAppearanceInspection(m_recipeNo, m_user, m_insList); var fmtask = UITask(m_fmMain); // 検査処理タスク var insTask = Task.Factory.StartNew(MainInspectionTask, TaskCreationOptions.LongRunning); insTask.ContinueWith(t => { if (t.Result == ProcResult.Error) { m_fmMain.Destroy(); } }); try { // メイン画面終了待ち fmtask.Wait(m_cts.Token); } catch (Exception) { m_cts.Cancel(); } m_cts.Dispose(); m_devMgr.InputID -= OnDeviceInputId; bool bret = fmtask.Result == CommonUI.FormResult.OK || fmtask.Result == CommonUI.FormResult.Cancel; log.System("検査モード 終了 : 結果={0}", bret); return(bret); }
/// <summary> /// 工程のステップ(工程) /// </summary> /// <param name="state">新しい工程</param> async void SetStep(InspectionStep state) { log.UI("状態更新 {0} -> {1}", m_InspectionStep, state); m_InspectionStep = state; m_stepView.UpdateState(state); switch (state) { // 初期化 case InspectionStep.Intialize: FinishStep(true); break; // ID取得 case InspectionStep.GetId: bool bret = await GetIDLoop(); if (!bret) { Result = FormResult.Cancel; Close(); return; } FinishStep(true); break; // パネルセット case InspectionStep.SetPanel: if (!MsgBox.ContinueConfirm("パネルをセットして下さい(裏面)")) { Result = FormResult.Cancel; Close(); return; } await CallControllerAction(new ActionParam_ReadyInspecton()); FinishStep(true); break; // 裏面検査 case InspectionStep.InspectionBack: StartInspection(Inspection.ISP_Mode.BackSurface); break; // パネル反転 case InspectionStep.ReversePanel: if (!MsgBox.ContinueConfirm("表面を検査します。パネルを反転して下さい")) { Result = FormResult.Cancel; Close(); return; } FinishStep(true); break; // 表面検査 case InspectionStep.InspectionFront: StartInspection(Inspection.ISP_Mode.Surface); break; } }
/// <summary> /// コンストラクタ /// </summary> /// <param name="step">次の工程</param> public UpdateStepInfo(InspectionStep step) { Step = step; m_taskCmp = new TaskCompletionSource <bool>(); }
/// <summary> /// 状態の設定 /// </summary> /// <param name="newStep">次の状態</param> void SetStep(InspectionStep newStep) { m_step = newStep; m_updStep = new FormMessages.UpdateStepInfo(newStep); m_fmMain.PostMessage(FormMessages.UpdateStep(m_updStep)); }