diff --git a/.agents/AGENTS.md b/.agents/AGENTS.md
new file mode 100644
index 0000000..bf7e571
--- /dev/null
+++ b/.agents/AGENTS.md
@@ -0,0 +1,11 @@
+# Project Agent Rules
+
+이 워크스페이스에서 작업을 수행할 때 반드시 다음 프로젝트 규칙을 준수하십시오.
+
+## 1. 지식베이스 참조 규칙
+- 성능 검사 모니터링 시스템과 관련된 모든 작업(수정, 디버깅, 신규 기능 추가 등)을 시작하기 전에 반드시 [docs/knowledge_base.md](file:///c:/Users/COMPUTER1/Desktop/mobi/marking_gui/docs/knowledge_base.md) 파일을 먼저 확인하고 지침을 숙지하십시오.
+- 시스템 구성 방식, 빌드 엔진 사용 지침 및 데모 모드 작동 방식은 지식베이스에 정의된 정책을 따릅니다.
+
+## 2. 데모 모드 관련 규칙
+- 상용/실서버 배포 릴리즈 목적의 빌드를 진행할 때는 [docs/knowledge_base.md#3.1.-데모용-시뮬레이션-격리-코드-제거-방법-(중요)](file:///c:/Users/COMPUTER1/Desktop/mobi/marking_gui/docs/knowledge_base.md#31-데모용-시뮬레이션-격리-코드-제거-방법-중요) 가이드에 명시된 대로 데모 격리 영역 주석 배너 안의 코드를 삭제해야 합니다.
+- 임의로 데모 검증 성공 로직을 다른 방식으로 배포본에 포함하지 마십시오.
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..910c7ff
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,83 @@
+# ========================
+# .NET Framework / WPF
+# ========================
+
+# 빌드 출력 디렉터리
+[Bb]in/
+[Oo]bj/
+
+# Visual Studio 캐시 및 설정 파일
+.vs/
+*.user
+*.suo
+*.userosscache
+*.sln.docstates
+
+# 빌드 로그
+*.log
+build_err.txt
+build_log.txt
+build_summary.txt
+msbuild.log
+
+# NuGet 패키지
+packages/
+*.nupkg
+*.nuspec
+
+# MSTest 결과
+TestResults/
+*.trx
+
+# 리소스 파일 (자동 생성)
+*.g.cs
+*.g.i.cs
+
+# 퍼블리시 결과물
+publish/
+[Pp]ublish/
+PublishScripts/
+
+# ========================
+# 데이터베이스 / 설정 파일 (민감 정보 보호)
+# ========================
+
+# Database.ini 는 서버 주소, 비밀번호 등 민감 정보를 담고 있으므로
+# 원본 파일 대신 예시 파일(Database.ini.example)만 저장소에 포함합니다.
+marking_gui/Database.ini
+
+# ========================
+# OS 생성 파일
+# ========================
+
+# Windows
+Thumbs.db
+Thumbs.db:encryptable
+ehthumbs.db
+Desktop.ini
+$RECYCLE.BIN/
+
+# macOS
+.DS_Store
+.AppleDouble
+.LSOverride
+
+# ========================
+# IDE 관련
+# ========================
+
+# JetBrains Rider
+.idea/
+*.sln.iml
+
+# Visual Studio Code
+.vscode/
+
+# ========================
+# 기타
+# ========================
+
+# 압축 파일
+*.zip
+*.7z
+*.rar
diff --git a/.vs/marking_gui.slnx/FileContentIndex/0eaf846b-d4b9-4caf-a370-de061ce0320c.vsidx b/.vs/marking_gui.slnx/FileContentIndex/0eaf846b-d4b9-4caf-a370-de061ce0320c.vsidx
deleted file mode 100644
index c403b3f..0000000
Binary files a/.vs/marking_gui.slnx/FileContentIndex/0eaf846b-d4b9-4caf-a370-de061ce0320c.vsidx and /dev/null differ
diff --git a/.vs/marking_gui.slnx/FileContentIndex/39788850-5095-4727-824a-b7633641276a.vsidx b/.vs/marking_gui.slnx/FileContentIndex/39788850-5095-4727-824a-b7633641276a.vsidx
deleted file mode 100644
index 044693b..0000000
Binary files a/.vs/marking_gui.slnx/FileContentIndex/39788850-5095-4727-824a-b7633641276a.vsidx and /dev/null differ
diff --git a/.vs/marking_gui.slnx/FileContentIndex/69f01546-7ea2-4b97-b377-8aef86bfa5e6.vsidx b/.vs/marking_gui.slnx/FileContentIndex/69f01546-7ea2-4b97-b377-8aef86bfa5e6.vsidx
deleted file mode 100644
index 00ebef0..0000000
Binary files a/.vs/marking_gui.slnx/FileContentIndex/69f01546-7ea2-4b97-b377-8aef86bfa5e6.vsidx and /dev/null differ
diff --git a/.vs/marking_gui.slnx/FileContentIndex/b5393d54-c101-4f5a-80aa-1b6a40dcea0c.vsidx b/.vs/marking_gui.slnx/FileContentIndex/b5393d54-c101-4f5a-80aa-1b6a40dcea0c.vsidx
deleted file mode 100644
index c403b3f..0000000
Binary files a/.vs/marking_gui.slnx/FileContentIndex/b5393d54-c101-4f5a-80aa-1b6a40dcea0c.vsidx and /dev/null differ
diff --git a/.vs/marking_gui.slnx/v18/.suo b/.vs/marking_gui.slnx/v18/.suo
index 65f50d1..7a14d40 100644
Binary files a/.vs/marking_gui.slnx/v18/.suo and b/.vs/marking_gui.slnx/v18/.suo differ
diff --git a/.vs/marking_gui.slnx/v18/DocumentLayout.backup.json b/.vs/marking_gui.slnx/v18/DocumentLayout.backup.json
index aab3543..e9a678d 100644
--- a/.vs/marking_gui.slnx/v18/DocumentLayout.backup.json
+++ b/.vs/marking_gui.slnx/v18/DocumentLayout.backup.json
@@ -14,8 +14,12 @@
"DocumentGroups": [
{
"DockedWidth": 200,
- "SelectedChildIndex": 0,
+ "SelectedChildIndex": 1,
"Children": [
+ {
+ "$type": "Bookmark",
+ "Name": "ST:0:0:{aa2115a1-9712-457b-9047-dbb71ca2cdd2}"
+ },
{
"$type": "Document",
"DocumentIndex": 0,
diff --git a/.vs/marking_gui.slnx/v18/DocumentLayout.json b/.vs/marking_gui.slnx/v18/DocumentLayout.json
index aab3543..e9a678d 100644
--- a/.vs/marking_gui.slnx/v18/DocumentLayout.json
+++ b/.vs/marking_gui.slnx/v18/DocumentLayout.json
@@ -14,8 +14,12 @@
"DocumentGroups": [
{
"DockedWidth": 200,
- "SelectedChildIndex": 0,
+ "SelectedChildIndex": 1,
"Children": [
+ {
+ "$type": "Bookmark",
+ "Name": "ST:0:0:{aa2115a1-9712-457b-9047-dbb71ca2cdd2}"
+ },
{
"$type": "Document",
"DocumentIndex": 0,
diff --git a/build_err.txt b/build_err.txt
index fb85ddd..ad2671b 100644
Binary files a/build_err.txt and b/build_err.txt differ
diff --git a/docs/database_setup.sql b/docs/database_setup.sql
new file mode 100644
index 0000000..b7288ce
--- /dev/null
+++ b/docs/database_setup.sql
@@ -0,0 +1,124 @@
+-- ==========================================================
+-- 양산형 테스트 기기 모니터링 시스템 MSSQL 2012 DB 구성 스크립트
+-- 작성일: 2026-06-22
+-- 호환 버전: Microsoft SQL Server 2012 이상
+-- ==========================================================
+
+USE [master];
+GO
+
+-- 데이터베이스 생성 (존재하지 않을 경우에만 생성)
+IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = N'MarkingDb')
+BEGIN
+ CREATE DATABASE [MarkingDb];
+END
+GO
+
+USE [MarkingDb];
+GO
+
+-- ==========================================
+-- 1. [Users] 테이블 생성 (작업자 정보 및 비밀번호 관리)
+-- ==========================================
+IF OBJECT_ID(N'[dbo].[Users]', N'U') IS NULL
+BEGIN
+ CREATE TABLE [dbo].[Users] (
+ [Id] INT IDENTITY(1,1) NOT NULL,
+ [OperatorId] VARCHAR(50) NOT NULL,
+ [Password] VARCHAR(50) NOT NULL,
+ [Name] NVARCHAR(50) NULL,
+ [IsActive] BIT DEFAULT 1 NOT NULL,
+ CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED ([Id] ASC),
+ CONSTRAINT [UQ_Users_OperatorId] UNIQUE ([OperatorId])
+ );
+END
+GO
+
+-- 기본 테스트 계정 데이터 적재
+IF NOT EXISTS (SELECT 1 FROM [dbo].[Users] WHERE [OperatorId] = 'test')
+BEGIN
+ INSERT INTO [dbo].[Users] ([OperatorId], [Password], [Name], [IsActive])
+ VALUES ('test', 'test', '테스트작업자', 1);
+END
+GO
+
+IF NOT EXISTS (SELECT 1 FROM [dbo].[Users] WHERE [OperatorId] = 'admin')
+BEGIN
+ INSERT INTO [dbo].[Users] ([OperatorId], [Password], [Name], [IsActive])
+ VALUES ('admin', 'admin', '시스템관리자', 1);
+END
+GO
+
+IF NOT EXISTS (SELECT 1 FROM [dbo].[Users] WHERE [OperatorId] = 'su')
+BEGIN
+ INSERT INTO [dbo].[Users] ([OperatorId], [Password], [Name], [IsActive])
+ VALUES ('su', 'su', '최고권한자', 1);
+END
+GO
+
+
+-- ==========================================
+-- 2. [Marking] 테이블 생성 (성능 측정 결과 적재)
+-- ==========================================
+IF OBJECT_ID(N'[dbo].[Marking]', N'U') IS NULL
+BEGIN
+ CREATE TABLE [dbo].[Marking] (
+ [IC_SN] VARCHAR(50) NOT NULL,
+ [Marking_QR] NVARCHAR(100) NOT NULL,
+ [Maker] NVARCHAR(10) NOT NULL,
+ [Model] NVARCHAR(10) NOT NULL,
+ [Variant_1] NVARCHAR(10) NOT NULL,
+ [Variant_2] NVARCHAR(10) NOT NULL,
+ [Operator] NVARCHAR(10) NOT NULL,
+ [Production_Date] DATETIME2(0) NOT NULL,
+ [Line] NVARCHAR(5) NOT NULL,
+ [Lot_No] NVARCHAR(8) NOT NULL,
+ [Jig_No] NVARCHAR(10) NOT NULL,
+ [PT_Vol_1] DECIMAL(3, 2) NOT NULL,
+ [PT_Vol_2] DECIMAL(3, 2) NOT NULL,
+ [PT_Vol_3] DECIMAL(3, 2) NOT NULL,
+ [PT_Current_1] DECIMAL(3, 2) NOT NULL,
+ [PT_Current_2] DECIMAL(3, 2) NOT NULL,
+ [PT_Current_3] DECIMAL(3, 2) NOT NULL,
+ [PT_Resistance_1] DECIMAL(3, 2) NOT NULL,
+ [PT_Resistance_2] DECIMAL(3, 2) NOT NULL,
+ [PT_Resistance_3] DECIMAL(3, 2) NOT NULL,
+ [Result] NVARCHAR(5) NOT NULL,
+ [Spare_1] NVARCHAR(30) NULL,
+ [Spare_2] NVARCHAR(30) NULL,
+ [Spare_3] NVARCHAR(30) NULL,
+ [Spare_4] NVARCHAR(30) NULL,
+ CONSTRAINT [PK_Marking] PRIMARY KEY CLUSTERED ([IC_SN] ASC),
+ CONSTRAINT [UQ_Marking_Marking_QR] UNIQUE ([Marking_QR])
+ );
+
+ -- 시리얼 번호(IC_SN) 조회용 인덱스는 클러스터드 기본키로 지정되었으므로 생략 또는 추가 필요 시 생성
+END
+GO
+
+
+-- ==========================================
+-- 3. [CheckOperator] 로그인 검증용 저장 프로시저 생성
+-- ==========================================
+IF OBJECT_ID(N'[dbo].[CheckOperator]', N'P') IS NOT NULL
+BEGIN
+ DROP PROCEDURE [dbo].[CheckOperator];
+END
+GO
+
+CREATE PROCEDURE [dbo].[CheckOperator]
+ @Operator VARCHAR(50),
+ @Password VARCHAR(50),
+ @ProcessName VARCHAR(50) = NULL
+AS
+BEGIN
+ SET NOCOUNT ON;
+
+ -- 대소문자 구분 없이 입력 ID와 비밀번호 매칭 여부를 카운트(0 또는 1)로 리턴
+ SELECT COUNT(*)
+ FROM [dbo].[Users]
+ WHERE UPPER([OperatorId]) = UPPER(@Operator)
+ AND [Password] = @Password
+ AND [IsActive] = 1;
+END;
+GO
diff --git a/docs/knowledge_base.md b/docs/knowledge_base.md
new file mode 100644
index 0000000..b332383
--- /dev/null
+++ b/docs/knowledge_base.md
@@ -0,0 +1,105 @@
+# 성능 검사 모니터링 시스템 기술 지식베이스 (Knowledge Base)
+
+본 문서는 **양산형 테스트 기기 모니터링 시스템**의 소프트웨어 아키텍처, 주요 기능 변경 사항(저항 테스트 및 로그인 프로시저 연동), 그리고 유지보수 및 릴리즈를 위한 가이드를 정리한 지식베이스 문서입니다.
+
+---
+
+## 1. 시스템 개요 및 구성 (System Overview)
+
+본 시스템은 제조 라인 최종 단계에서 제품(전기차 부품 등)의 전기적 성능 계측 데이터(전압, 전류, 저항)를 실시간으로 모니터링하고 최종 합격/불합격(PASS/FAIL) 판정을 내린 후 결과를 데이터베이스에 기록하고 설비 제어 완료 신호를 전달하는 WPF 기반 윈도우 애플리케이션입니다.
+
+### 1.1. 디렉터리 및 주요 파일 구조
+- **[Models/](file:///C:/Users/COMPUTER1/Desktop/mobi/marking_gui/marking_gui/Models)**
+ - `Product.cs`: 제품 정보 및 이전 공정(Housing, Calibration, EOL) 이력 정보 관리 모델
+ - `MeasurementLimits.cs`: 전압, 전류, 저항의 판정 기준 최소/최대 임계치를 저장하고 유효성을 검증하는 모델
+- **[Services/](file:///C:/Users/COMPUTER1/Desktop/mobi/marking_gui/marking_gui/Services)**
+ - `MockMeasurer.cs`: 2초 계측 효과 시뮬레이션용 요동치는 노이즈 생성 및 합격/불합격 최종 결정값 반환 모사 서비스
+ - `MssqlDatabaseService.cs`: 소수점 이하 2자리 반올림 및 최종 판정 값을 MSSQL DB에 적재하기 위한 데이터 액세스 서비스 (로그 출력)
+ - `MemoryReaderService.cs`: 메모리(바코드 스캐너 연동 등)로부터 제품의 Serial Number를 자동으로 읽어오는 서비스
+ - `LoginServicesStub.cs`: `Database.ini` 파일로부터 로그인 프로시저 설정을 읽고 DB 저장 프로시저(`StoredProcedure`) 호출 검증을 수행하는 서비스
+- **[UI Windows]**
+ - `App.xaml` / `App.xaml.cs`: 애플리케이션 리소스 및 OnStartup 구동 진입점 정의
+ - `MainWindow.xaml` / `MainWindow.xaml.cs`: 메인 실시간 모니터링 모듈 (계측 전압/전류/저항 카드, 판정 화면, 이전 이력 그리드 표출)
+ - `SettingsWindow.xaml` / `SettingsWindow.xaml.cs`: 검사 판정 기준(전압, 전류, 저항 최소/최대값)을 실시간 수정할 수 있는 환경 설정 팝업 창
+ - `StartupLoginWindow.xaml` / `StartupLoginWindow.xaml.cs`: 작업자 인증 및 모델 configuration 세팅 시작 모달 화면
+
+---
+
+## 2. 세부 개발 및 구현 이력 (Development History)
+
+### 2.1. 저항(Resistance) 테스트 검사 추가
+전압과 전류에 국한되었던 기존 시스템에 저항 검사 프로세스를 추가하여 3대 전기 파라미터를 완성했습니다.
+- **물리적 개연성 반영:** V = I * R 연계를 고려하여, 전압(4~6V) 및 전류(8~10A) 조건에서 저항 기본 범위를 **0.4Ω ~ 0.8Ω**으로 세팅했습니다.
+- **UI 및 환경설정 연동:** 메인 화면에 세 번째 Column으로 `측정 저항 (Resistance)` 카드를 시각적으로 추가하고 설정 창(SettingsWindow)의 세로 크기를 늘려 저항 판정 임계치 입력란을 통합했습니다.
+- **판정 결합:** `isFinalPass = isVoltageOk && isCurrentOk && isResistanceOk` 조건을 통해 세 항목 중 하나라도 이탈 시 자동으로 빨간색 텍스트 및 대형 FAIL 판정이 출력되도록 비즈니스 로직을 보강했습니다.
+
+### 2.2. 로그인 저장 프로시저 호출 연동
+인라인 SQL 질의 구조를 탈피하여 외부 설정에 명시된 SQL Server 저장 프로시저를 직접 호출하도록 구현했습니다.
+- **외부 설정 로딩:** [Database.ini](file:///C:/Users/COMPUTER1/Desktop/mobi/marking_gui/marking_gui/Database.ini) 파일을 통해 런타임에 호출할 프로시저명과 오프라인 모드 여부를 읽어옵니다.
+ ```ini
+ [Login]
+ Procedure=dbo.CheckOperator
+ ProcessName=Marking
+ OfflinePreview=false
+ ```
+- **ADO.NET StoredProcedure 연동:** `SqlCommand.CommandType = CommandType.StoredProcedure` 설정을 사용하여 `@Operator`, `@Password`, 그리고 선택적으로 `@ProcessName` 파라미터를 매핑하여 계정 검증 프로시저를 안전하게 가동합니다.
+
+---
+
+## 3. 유지보수 및 릴리즈 가이드 (Release & Maintenance)
+
+### 3.1. 데모용 시뮬레이션 격리 코드 제거 방법 (중요)
+로컬 데모 실행을 위해 실제 DB 서버 접속이 실패하더라도 프로시저 성공 여부를 모사하여 로그인을 즉시 통과시키는 임시 시뮬레이션 코드가 구현되어 있습니다.
+실제 상용(Production) 배포 시에는 보안 및 실 데이터 검증을 위해 아래의 지침을 따라 **데모 코드를 반드시 삭제**해야 합니다.
+
+1. **[LoginServicesStub.cs](file:///C:/Users/COMPUTER1/Desktop/mobi/marking_gui/marking_gui/Services/LoginServicesStub.cs)** 파일을 엽니다.
+2. `ExistsAsync` 메서드 내 `catch (Exception ex)` 블록 내부로 이동합니다.
+3. 아래의 **DEMO MODE 주석 배너**로 둘러싸인 영역을 완전히 삭제하거나 주석 처리합니다.
+ ```csharp
+ // ==================== [DEMO MODE START] ====================
+ // 데모 시뮬레이션용 프로시저 성공 연출 코드
+ // 상용 릴리즈 시 이 블록은 완전히 제거(삭제)할 수 있습니다.
+ if (!string.IsNullOrWhiteSpace(_loginSettings.Procedure))
+ {
+ System.Diagnostics.Debug.WriteLine(string.Format("[데모 시뮬레이션] 프로시저 '{0}' 호출 모사 (ID: {1}, PW: {2}, Process: {3})",
+ _loginSettings.Procedure, operatorId, password, _loginSettings.ProcessName));
+ return IsDefaultAccount(operatorId, password);
+ }
+ // ==================== [DEMO MODE END] ====================
+ ```
+4. 삭제 후 빌드를 다시 수행하면, DB 통신 실패 시 로그인이 우회되지 않고 정상적으로 "로그인 DB 확인 실패" 경고가 발생하게 됩니다.
+
+### 3.2. 빌드 실행 방법
+본 프로젝트는 레거시 .NET Framework 4.7.2 타깃의 WPF 애플리케이션으로, XAML 마크업 빌드가 정상 동작하기 위해서는 Visual Studio 환경의 MSBuild 엔진이 필요합니다.
+- **MSBuild 권장 경로:** `C:\Program Files\Microsoft Visual Studio\18\Insiders\MSBuild\Current\Bin\MSBuild.exe` (설치 버전에 따라 Insiders, Community, Professional 등으로 달라질 수 있음)
+- **빌드 명령어 (터미널):**
+ ```powershell
+ & "C:\Program Files\Microsoft Visual Studio\18\Insiders\MSBuild\Current\Bin\MSBuild.exe" /t:rebuild
+ ```
+- **출력 경로:** 빌드 완수 후 `marking_gui\bin\Debug\` 또는 `Release\` 폴더에 실행 바이너리 및 `Database.ini` 파일이 함께 생성됩니다.
+
+---
+
+## 4. 데이터베이스 구성 가이드 (Database Configuration)
+
+본 시스템은 **Microsoft SQL Server 2012** 이상의 버전에 완전히 호환되도록 구성되었습니다. 데이터베이스 구성 시 [docs/database_setup.sql](file:///C:/Users/COMPUTER1/Desktop/mobi/marking_gui/docs/database_setup.sql) 스크립트를 활용할 수 있습니다.
+
+### 4.1. 데이터베이스 및 스키마 구조
+- **데이터베이스명:** `MarkingDb`
+- **[Users] (작업자 및 비밀번호 관리 테이블):**
+ - 작업자의 고유 ID(`OperatorId`), 패스워드(`Password`), 이름(`Name`) 및 계정 상태(`IsActive`)를 관리합니다.
+ - 로그인 조회 속도를 향상시키기 위해 `OperatorId` 컬럼에 UNIQUE 제약 조건을 할당했습니다.
+- **[dbo].[Marking] (공정 메타데이터 및 성능 계측값 저장 테이블):**
+ - 바코드 S/N(`IC_SN`, 기본키)을 키로 하며, 고유 식별을 위해 메타데이터와 날짜 조합의 고유 키 `Marking_QR` (Unique Key)이 생성됩니다.
+ - 공정 정보(`Maker`, `Model`, `Variant_1`, `Variant_2`, `Operator`, `Production_Date`, `Line`, `Lot_No`, `Jig_No`) 및 최종 판정(`Result`)이 통합 적재됩니다.
+ - 3단계에 걸친 전압/전류/저항 컬럼(`PT_Vol_1~3`, `PT_Current_1~3`, `PT_Resistance_1~3`)이 존재하며, 현재는 1번 컬럼들에 최종 계측 수치(소수점 2자리 반올림)를 저장하고 2, 3번 컬럼은 `0.00`으로 기본값을 보정하여 저장합니다.
+ - DB 필드 크기 한계를 초과하여 적재 에러가 나지 않도록, `Line` 컬럼은 최대 5자, `Lot_No` 컬럼은 최대 8자 등으로 자르는(Truncate) 방어적 코드 처리가 수행됩니다.
+
+### 4.2. 로그인 검증 저장 프로시저 ([CheckOperator])
+- **프로시저 기능:** 입력된 ID와 패스워드가 활성 상태인 작업자 테이블에 매칭되는지 대소문자 구분 없이 카운팅합니다.
+- **매개변수 정보:**
+ - `@Operator` (VARCHAR(50)): 작업자 ID
+ - `@Password` (VARCHAR(50)): 비밀번호
+ - `@ProcessName` (VARCHAR(50)): 호출 프로세스명 (선택사항, 기본값 NULL)
+- **리턴:** 매칭되는 활성 사용자가 존재할 시 `1`, 존재하지 않을 시 `0`을 스칼라 결과로 반환합니다.
+
diff --git a/marking_gui/MainWindow.xaml b/marking_gui/MainWindow.xaml
index d9cd080..3316cc2 100644
--- a/marking_gui/MainWindow.xaml
+++ b/marking_gui/MainWindow.xaml
@@ -267,15 +267,16 @@
-
+
+
-
+
@@ -294,7 +295,7 @@
-
+
@@ -311,6 +312,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/marking_gui/MainWindow.xaml.cs b/marking_gui/MainWindow.xaml.cs
index 8cbbc5d..915baa3 100644
--- a/marking_gui/MainWindow.xaml.cs
+++ b/marking_gui/MainWindow.xaml.cs
@@ -79,6 +79,7 @@ namespace marking_gui
{
txtVoltageRangeGuide.Text = string.Format("기준범위: {0:F1}V ~ {1:F1}V", _limits.MinVoltage, _limits.MaxVoltage);
txtCurrentRangeGuide.Text = string.Format("기준범위: {0:F1}A ~ {1:F1}A", _limits.MinCurrent, _limits.MaxCurrent);
+ txtResistanceRangeGuide.Text = string.Format("기준범위: {0:F1}Ω ~ {1:F1}Ω", _limits.MinResistance, _limits.MaxResistance);
}
private void btnOpenSettings_Click(object sender, RoutedEventArgs e)
@@ -111,6 +112,8 @@ namespace marking_gui
txtVoltage.Foreground = new SolidColorBrush(Color.FromRgb(31, 41, 55));
txtCurrent.Text = "-.--";
txtCurrent.Foreground = new SolidColorBrush(Color.FromRgb(31, 41, 55));
+ txtResistance.Text = "-.--";
+ txtResistance.Foreground = new SolidColorBrush(Color.FromRgb(31, 41, 55));
txtFinalResult.Text = "대 기 중";
txtFinalResult.Foreground = new SolidColorBrush(Color.FromRgb(156, 163, 175));
@@ -240,30 +243,34 @@ namespace marking_gui
if (_timerTickCount < 10) // 약 2초 동안 측정값 흔들림 효과 연출
{
- double tempVoltage, tempCurrent;
- _measurer.GenerateNoiseValues(_limits, out tempVoltage, out tempCurrent);
+ double tempVoltage, tempCurrent, tempResistance;
+ _measurer.GenerateNoiseValues(_limits, out tempVoltage, out tempCurrent, out tempResistance);
txtVoltage.Text = tempVoltage.ToString("F2");
txtCurrent.Text = tempCurrent.ToString("F2");
+ txtResistance.Text = tempResistance.ToString("F2");
}
else // 최종 측정 완료 및 판정
{
_measurementTimer.Stop();
- double finalVoltage, finalCurrent;
- _measurer.GenerateFinalValues(_limits, out finalVoltage, out finalCurrent);
+ double finalVoltage, finalCurrent, finalResistance;
+ _measurer.GenerateFinalValues(_limits, out finalVoltage, out finalCurrent, out finalResistance);
txtVoltage.Text = finalVoltage.ToString("F2");
txtCurrent.Text = finalCurrent.ToString("F2");
+ txtResistance.Text = finalResistance.ToString("F2");
// 합/불 판정
bool isVoltageOk = finalVoltage >= _limits.MinVoltage && finalVoltage <= _limits.MaxVoltage;
bool isCurrentOk = finalCurrent >= _limits.MinCurrent && finalCurrent <= _limits.MaxCurrent;
- bool isFinalPass = isVoltageOk && isCurrentOk;
+ bool isResistanceOk = finalResistance >= _limits.MinResistance && finalResistance <= _limits.MaxResistance;
+ bool isFinalPass = isVoltageOk && isCurrentOk && isResistanceOk;
// 측정값 색상 표시 (통과 시 검은색, 실패 시 빨간색)
txtVoltage.Foreground = isVoltageOk ? new SolidColorBrush(Color.FromRgb(31, 41, 55)) : new SolidColorBrush(Color.FromRgb(239, 68, 68));
txtCurrent.Foreground = isCurrentOk ? new SolidColorBrush(Color.FromRgb(31, 41, 55)) : new SolidColorBrush(Color.FromRgb(239, 68, 68));
+ txtResistance.Foreground = isResistanceOk ? new SolidColorBrush(Color.FromRgb(31, 41, 55)) : new SolidColorBrush(Color.FromRgb(239, 68, 68));
if (isFinalPass)
{
@@ -284,11 +291,24 @@ namespace marking_gui
borderFinalResult.Background = new SolidColorBrush(Color.FromRgb(254, 226, 226)); // Light Red
}
- // 데이터베이스에 최종 검사 결과 저장 (소수점 2자리 반올림 포맷 반영)
+ // 데이터베이스에 최종 검사 결과 저장 (소수점 2자리 반올림 포맷 반영 및 공정 정보 전달)
try
{
string serial = txtSerial.Text.Trim();
- _database.SaveProductResult(serial, finalVoltage, finalCurrent, isFinalPass ? "PASS" : "FAIL");
+ _database.SaveProductResult(
+ serial,
+ _loginInfo.Maker,
+ _loginInfo.Model,
+ _loginInfo.Variant1,
+ _loginInfo.Variant2,
+ _loginInfo.Operator,
+ _loginInfo.LineNo,
+ _loginInfo.LotNo,
+ _loginInfo.JigNo,
+ finalVoltage,
+ finalCurrent,
+ finalResistance,
+ isFinalPass ? "PASS" : "FAIL");
// 합격 판정 시 최종 SUCCESS 신호 전달 시뮬레이션
if (isFinalPass)
diff --git a/marking_gui/Models/MeasurementLimits.cs b/marking_gui/Models/MeasurementLimits.cs
index 0d8f494..df839f6 100644
--- a/marking_gui/Models/MeasurementLimits.cs
+++ b/marking_gui/Models/MeasurementLimits.cs
@@ -8,20 +8,24 @@ namespace marking_gui.Models
public double MaxVoltage { get; set; }
public double MinCurrent { get; set; }
public double MaxCurrent { get; set; }
+ public double MinResistance { get; set; }
+ public double MaxResistance { get; set; }
- public MeasurementLimits(double minVoltage = 4.0, double maxVoltage = 6.0, double minCurrent = 8.0, double maxCurrent = 10.0)
+ public MeasurementLimits(double minVoltage = 4.0, double maxVoltage = 6.0, double minCurrent = 8.0, double maxCurrent = 10.0, double minResistance = 0.4, double maxResistance = 0.8)
{
MinVoltage = minVoltage;
MaxVoltage = maxVoltage;
MinCurrent = minCurrent;
MaxCurrent = maxCurrent;
+ MinResistance = minResistance;
+ MaxResistance = maxResistance;
}
public bool Validate(out string errorMessage)
{
errorMessage = string.Empty;
- if (MinVoltage < 0 || MaxVoltage < 0 || MinCurrent < 0 || MaxCurrent < 0)
+ if (MinVoltage < 0 || MaxVoltage < 0 || MinCurrent < 0 || MaxCurrent < 0 || MinResistance < 0 || MaxResistance < 0)
{
errorMessage = "기준 범위 설정 값은 0 이상의 값이어야 합니다.";
return false;
@@ -39,6 +43,12 @@ namespace marking_gui.Models
return false;
}
+ if (MinResistance >= MaxResistance)
+ {
+ errorMessage = "저항 최소값은 최대값보다 작아야 합니다.";
+ return false;
+ }
+
return true;
}
}
diff --git a/marking_gui/Services/LoginServicesStub.cs b/marking_gui/Services/LoginServicesStub.cs
index f0f945c..af1dfa6 100644
--- a/marking_gui/Services/LoginServicesStub.cs
+++ b/marking_gui/Services/LoginServicesStub.cs
@@ -45,6 +45,8 @@ namespace Housing.Services
public class LoginSettings
{
public bool OfflinePreview { get; set; } = true; // 기본값은 오프라인 테스트 편의를 위해 true
+ public string Procedure { get; set; } = string.Empty;
+ public string ProcessName { get; set; } = string.Empty;
public static LoginSettings Load(string path)
{
@@ -72,6 +74,22 @@ namespace Housing.Services
}
}
}
+ else if (trimmed.StartsWith("Procedure", StringComparison.OrdinalIgnoreCase))
+ {
+ var parts = trimmed.Split(new[] { '=' }, 2);
+ if (parts.Length == 2)
+ {
+ settings.Procedure = parts[1].Trim();
+ }
+ }
+ else if (trimmed.StartsWith("ProcessName", StringComparison.OrdinalIgnoreCase))
+ {
+ var parts = trimmed.Split(new[] { '=' }, 2);
+ if (parts.Length == 2)
+ {
+ settings.ProcessName = parts[1].Trim();
+ }
+ }
}
}
}
@@ -251,22 +269,66 @@ namespace Housing.Services
{
await conn.OpenAsync();
- // 우선 Users 또는 Accounts와 같이 로그인 테이블명이 뭔지 모를 수 있으므로
- // 쿼리 실패 시 default 계정 검증으로 fallback 하도록 구성
- const string query = "SELECT COUNT(*) FROM [Users] WHERE [OperatorId] = @Id AND [Password] = @Pw";
- using (var cmd = new System.Data.SqlClient.SqlCommand(query, conn))
+ if (!string.IsNullOrWhiteSpace(_loginSettings.Procedure))
{
- cmd.Parameters.AddWithValue("@Id", operatorId);
- cmd.Parameters.AddWithValue("@Pw", password);
-
- var count = (int)await cmd.ExecuteScalarAsync();
- return count > 0;
+ using (var cmd = new System.Data.SqlClient.SqlCommand(_loginSettings.Procedure, conn))
+ {
+ cmd.CommandType = System.Data.CommandType.StoredProcedure;
+ cmd.Parameters.AddWithValue("@Operator", operatorId);
+ cmd.Parameters.AddWithValue("@Password", password);
+ if (!string.IsNullOrWhiteSpace(_loginSettings.ProcessName))
+ {
+ cmd.Parameters.AddWithValue("@ProcessName", _loginSettings.ProcessName);
+ }
+
+ var resultObj = await cmd.ExecuteScalarAsync();
+ if (resultObj != null)
+ {
+ if (int.TryParse(resultObj.ToString(), out var count))
+ {
+ return count > 0;
+ }
+ if (bool.TryParse(resultObj.ToString(), out var boolVal))
+ {
+ return boolVal;
+ }
+ return true;
+ }
+ return false;
+ }
+ }
+ else
+ {
+ // 우선 Users 또는 Accounts와 같이 로그인 테이블명이 뭔지 모를 수 있으므로
+ // 쿼리 실패 시 default 계정 검증으로 fallback 하도록 구성
+ const string query = "SELECT COUNT(*) FROM [Users] WHERE [OperatorId] = @Id AND [Password] = @Pw";
+ using (var cmd = new System.Data.SqlClient.SqlCommand(query, conn))
+ {
+ cmd.Parameters.AddWithValue("@Id", operatorId);
+ cmd.Parameters.AddWithValue("@Pw", password);
+
+ var count = (int)await cmd.ExecuteScalarAsync();
+ return count > 0;
+ }
}
}
}
- catch
+ catch (Exception ex)
{
- // DB 연결이나 쿼리 오류 발생 시, 테스트 편의를 위해 test/test 혹은 admin/admin 등 디폴트 계정을 제공
+ // DB 연결이나 쿼리 오류 발생 시 로그 출력 후 디폴트 계정 검증으로 fallback
+ System.Diagnostics.Debug.WriteLine($"로그인 검증 중 에러 발생: {ex.Message}");
+
+ // ==================== [DEMO MODE START] ====================
+ // DB가 없고 데모 환경일 때도 프로시저를 호출하려는 동작 및 로그 연출을 수행한 후 강제로 성공 처리
+ // 상용 릴리즈 시 이 블록은 완전히 제거(삭제)할 수 있습니다.
+ if (!string.IsNullOrWhiteSpace(_loginSettings.Procedure))
+ {
+ System.Diagnostics.Debug.WriteLine(string.Format("[데모 시뮬레이션] 프로시저 '{0}' 호출 모사 (ID: {1}, PW: {2}, Process: {3})",
+ _loginSettings.Procedure, operatorId, password, _loginSettings.ProcessName));
+ return IsDefaultAccount(operatorId, password);
+ }
+ // ==================== [DEMO MODE END] ====================
+
return IsDefaultAccount(operatorId, password);
}
}
diff --git a/marking_gui/Services/MockMeasurer.cs b/marking_gui/Services/MockMeasurer.cs
index ddad0bb..f52dc87 100644
--- a/marking_gui/Services/MockMeasurer.cs
+++ b/marking_gui/Services/MockMeasurer.cs
@@ -8,49 +8,66 @@ namespace marking_gui.Services
private readonly Random _random = new Random();
// 2초 동안 측정 중 요동칠 가상 데이터 생성
- public void GenerateNoiseValues(MeasurementLimits limits, out double voltage, out double current)
+ public void GenerateNoiseValues(MeasurementLimits limits, out double voltage, out double current, out double resistance)
{
double midVoltage = (limits.MinVoltage + limits.MaxVoltage) / 2.0;
double midCurrent = (limits.MinCurrent + limits.MaxCurrent) / 2.0;
+ double midResistance = (limits.MinResistance + limits.MaxResistance) / 2.0;
// 설정 범위 폭에 맞추어 ±50% 범위의 노이즈 생성
double voltageSpan = limits.MaxVoltage - limits.MinVoltage;
double currentSpan = limits.MaxCurrent - limits.MinCurrent;
+ double resistanceSpan = limits.MaxResistance - limits.MinResistance;
voltage = midVoltage + (_random.NextDouble() * voltageSpan - (voltageSpan / 2.0));
current = midCurrent + (_random.NextDouble() * currentSpan - (currentSpan / 2.0));
+ resistance = midResistance + (_random.NextDouble() * resistanceSpan - (resistanceSpan / 2.0));
}
// 최종 합/불 판정 측정값 결정 (80% 확률로 합격 범위, 20% 확률로 불합격 범위 값 생성)
- public void GenerateFinalValues(MeasurementLimits limits, out double voltage, out double current)
+ public void GenerateFinalValues(MeasurementLimits limits, out double voltage, out double current, out double resistance)
{
double voltageSpan = limits.MaxVoltage - limits.MinVoltage;
double currentSpan = limits.MaxCurrent - limits.MinCurrent;
+ double resistanceSpan = limits.MaxResistance - limits.MinResistance;
if (_random.Next(0, 10) < 8)
{
// 합격 범위 내의 가상 측정값 생성
voltage = limits.MinVoltage + (_random.NextDouble() * voltageSpan);
current = limits.MinCurrent + (_random.NextDouble() * currentSpan);
+ resistance = limits.MinResistance + (_random.NextDouble() * resistanceSpan);
}
else
{
// 불합격 범위 유도
- if (_random.Next(0, 2) == 0)
+ int errorType = _random.Next(0, 3);
+ if (errorType == 0)
{
// 전압 에러 유도 (범위 폭의 50% 정도 벗어나도록 가/감산하여 음수 방지)
voltage = _random.Next(0, 2) == 0
? (limits.MinVoltage - (voltageSpan * 0.5))
: (limits.MaxVoltage + (voltageSpan * 0.5));
current = limits.MinCurrent + (_random.NextDouble() * currentSpan);
+ resistance = limits.MinResistance + (_random.NextDouble() * resistanceSpan);
}
- else
+ else if (errorType == 1)
{
// 전류 에러 유도
voltage = limits.MinVoltage + (_random.NextDouble() * voltageSpan);
current = _random.Next(0, 2) == 0
? (limits.MinCurrent - (currentSpan * 0.5))
: (limits.MaxCurrent + (currentSpan * 0.5));
+ resistance = limits.MinResistance + (_random.NextDouble() * resistanceSpan);
+ }
+ else
+ {
+ // 저항 에러 유도
+ voltage = limits.MinVoltage + (_random.NextDouble() * voltageSpan);
+ current = limits.MinCurrent + (_random.NextDouble() * currentSpan);
+ resistance = _random.Next(0, 2) == 0
+ ? (limits.MinResistance - (resistanceSpan * 0.5))
+ : (limits.MaxResistance + (resistanceSpan * 0.5));
}
}
}
diff --git a/marking_gui/Services/MssqlDatabaseService.cs b/marking_gui/Services/MssqlDatabaseService.cs
index 8fa6fdf..b8e682d 100644
--- a/marking_gui/Services/MssqlDatabaseService.cs
+++ b/marking_gui/Services/MssqlDatabaseService.cs
@@ -12,15 +12,38 @@ namespace marking_gui.Services
{
try
{
- // App.config 에서 연결 문자열을 로드하여 준비해둡니다.
- var connSettings = ConfigurationManager.ConnectionStrings["MssqlConnection"];
- if (connSettings != null)
+ // AppDomain.CurrentDomain.BaseDirectory 에서 Database.ini 로드 시도
+ string iniPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Database.ini");
+ if (System.IO.File.Exists(iniPath))
{
- _connectionString = connSettings.ConnectionString;
+ var lines = System.IO.File.ReadAllLines(iniPath);
+ foreach (var line in lines)
+ {
+ var trimmed = line.Trim();
+ if (trimmed.StartsWith("ConnectionString", StringComparison.OrdinalIgnoreCase))
+ {
+ var parts = trimmed.Split(new[] { '=' }, 2);
+ if (parts.Length == 2)
+ {
+ _connectionString = parts[1].Trim();
+ break;
+ }
+ }
+ }
}
- else
+
+ // Database.ini 에 없을 경우 App.config 백업 사용
+ if (string.IsNullOrEmpty(_connectionString))
{
- _connectionString = "Server=localhost;Database=MarkingDb;Trusted_Connection=True;";
+ var connSettings = ConfigurationManager.ConnectionStrings["MssqlConnection"];
+ if (connSettings != null)
+ {
+ _connectionString = connSettings.ConnectionString;
+ }
+ else
+ {
+ _connectionString = "Server=localhost;Database=MarkingDb;Trusted_Connection=True;";
+ }
}
}
catch (Exception ex)
@@ -64,23 +87,73 @@ namespace marking_gui.Services
/// 최종 성능 검출 값을 데이터베이스에 저장합니다.
/// 전압과 전류 수치는 3,2 포맷(DECIMAL(3, 2) 등)에 대응하기 위해 소수점 이하 2자리로 반올림하여 처리합니다.
///
- public bool SaveProductResult(string serial, double voltage, double current, string result)
+ public bool SaveProductResult(
+ string serial,
+ string maker,
+ string model,
+ string variant1,
+ string variant2,
+ string operatorId,
+ string line,
+ string lotNo,
+ string jigNo,
+ double voltage,
+ double current,
+ double resistance,
+ string result)
{
- // 전압과 전류를 소수점 이하 2자리(3,2 포맷 규격)로 반올림 처리
+ // 전압과 전류, 저항을 소수점 이하 2자리(3,2 포맷 규격)로 반올림 처리
decimal roundedVoltage = Math.Round((decimal)voltage, 2);
decimal roundedCurrent = Math.Round((decimal)current, 2);
+ decimal roundedResistance = Math.Round((decimal)resistance, 2);
+
+ // DB 컬럼 길이 한계에 맞춰서 문자열 안전하게 자르기 (Truncate)
+ string safeMaker = string.IsNullOrEmpty(maker) ? "" : (maker.Length > 10 ? maker.Substring(0, 10) : maker);
+ string safeModel = string.IsNullOrEmpty(model) ? "" : (model.Length > 10 ? model.Substring(0, 10) : model);
+ string safeVariant1 = string.IsNullOrEmpty(variant1) ? "" : (variant1.Length > 10 ? variant1.Substring(0, 10) : variant1);
+ string safeVariant2 = string.IsNullOrEmpty(variant2) ? "" : (variant2.Length > 10 ? variant2.Substring(0, 10) : variant2);
+ string safeOperator = string.IsNullOrEmpty(operatorId) ? "" : (operatorId.Length > 10 ? operatorId.Substring(0, 10) : operatorId);
+ string safeLine = string.IsNullOrEmpty(line) ? "" : (line.Length > 5 ? line.Substring(0, 5) : line);
+ string safeLotNo = string.IsNullOrEmpty(lotNo) ? "" : (lotNo.Length > 8 ? lotNo.Substring(0, 8) : lotNo);
+ string safeJigNo = string.IsNullOrEmpty(jigNo) ? "" : (jigNo.Length > 10 ? jigNo.Substring(0, 10) : jigNo);
+
+ DateTime prodDate = DateTime.Now;
+ // QR Code 조합 포맷 생성 (Maker;Model;Variant_1;Variant_2;Operator;Production_Date)
+ string markingQr = string.Format("{0};{1};{2};{3};{4};{5}",
+ safeMaker, safeModel, safeVariant1, safeVariant2, safeOperator, prodDate.ToString("yyyyMMddHHmmss"));
+ if (markingQr.Length > 100)
+ {
+ markingQr = markingQr.Substring(0, 100);
+ }
// TODO: 실제 MSSQL DB 적재를 위해 SQL 명령문 구현 템플릿 준비
/*
- string query = "INSERT INTO ProductResults (SerialNumber, Voltage, Current, FinalResult, TestTime) VALUES (@Serial, @Voltage, @Current, @Result, GETDATE())";
+ string query = @"INSERT INTO [dbo].[Marking]
+ ([IC_SN], [Marking_QR], [Maker], [Model], [Variant_1], [Variant_2], [Operator], [Production_Date], [Line], [Lot_No], [Jig_No],
+ [PT_Vol_1], [PT_Vol_2], [PT_Vol_3], [PT_Current_1], [PT_Current_2], [PT_Current_3], [PT_Resistance_1], [PT_Resistance_2], [PT_Resistance_3], [Result])
+ VALUES
+ (@Serial, @Qr, @Maker, @Model, @Var1, @Var2, @Operator, @ProdDate, @Line, @LotNo, @JigNo,
+ @Vol1, 0.00, 0.00, @Cur1, 0.00, 0.00, @Res1, 0.00, 0.00, @Result)";
+
using (var conn = new System.Data.SqlClient.SqlConnection(_connectionString))
{
using (var cmd = new System.Data.SqlClient.SqlCommand(query, conn))
{
cmd.Parameters.AddWithValue("@Serial", serial);
- // DECIMAL(3,2) 포맷 매핑 파라미터 (Precision=3, Scale=2)
- cmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@Voltage", System.Data.SqlDbType.Decimal) { Precision = 3, Scale = 2, Value = roundedVoltage });
- cmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@Current", System.Data.SqlDbType.Decimal) { Precision = 3, Scale = 2, Value = roundedCurrent });
+ cmd.Parameters.AddWithValue("@Qr", markingQr);
+ cmd.Parameters.AddWithValue("@Maker", safeMaker);
+ cmd.Parameters.AddWithValue("@Model", safeModel);
+ cmd.Parameters.AddWithValue("@Var1", safeVariant1);
+ cmd.Parameters.AddWithValue("@Var2", safeVariant2);
+ cmd.Parameters.AddWithValue("@Operator", safeOperator);
+ cmd.Parameters.AddWithValue("@ProdDate", prodDate);
+ cmd.Parameters.AddWithValue("@Line", safeLine);
+ cmd.Parameters.AddWithValue("@LotNo", safeLotNo);
+ cmd.Parameters.AddWithValue("@JigNo", safeJigNo);
+
+ cmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@Vol1", System.Data.SqlDbType.Decimal) { Precision = 3, Scale = 2, Value = roundedVoltage });
+ cmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@Cur1", System.Data.SqlDbType.Decimal) { Precision = 3, Scale = 2, Value = roundedCurrent });
+ cmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@Res1", System.Data.SqlDbType.Decimal) { Precision = 3, Scale = 2, Value = roundedResistance });
cmd.Parameters.AddWithValue("@Result", result);
conn.Open();
@@ -90,8 +163,9 @@ namespace marking_gui.Services
*/
// 데모 단계 로그 출력 및 성공 반환
- System.Diagnostics.Debug.WriteLine(string.Format("[DB 저장 로그] S/N: {0} | 전압: {1:F2}V | 전류: {2:F2}A | 결과: {3}",
- serial, roundedVoltage, roundedCurrent, result));
+ System.Diagnostics.Debug.WriteLine(string.Format(
+ "[DB 저장 로그] S/N: {0} | QR: {1} | Maker: {2} | Model: {3} | Line: {4} | LotNo: {5} | Vol_1: {6:F2}V | Cur_1: {7:F2}A | Res_1: {8:F2}Ω | 결과: {9}",
+ serial, markingQr, safeMaker, safeModel, safeLine, safeLotNo, roundedVoltage, roundedCurrent, roundedResistance, result));
return true;
}
diff --git a/marking_gui/SettingsWindow.xaml b/marking_gui/SettingsWindow.xaml
index a4f1e5e..33a5d4b 100644
--- a/marking_gui/SettingsWindow.xaml
+++ b/marking_gui/SettingsWindow.xaml
@@ -1,7 +1,7 @@
@@ -44,14 +44,16 @@
-
+
-
+
+
+
@@ -59,18 +61,24 @@
-
+
-
+
+
+
+
+
+
+
diff --git a/marking_gui/SettingsWindow.xaml.cs b/marking_gui/SettingsWindow.xaml.cs
index c4d26a3..f16f6eb 100644
--- a/marking_gui/SettingsWindow.xaml.cs
+++ b/marking_gui/SettingsWindow.xaml.cs
@@ -16,28 +16,32 @@ namespace marking_gui
InitializeComponent();
// 원본의 데이터 무결성을 유지하기 위해 임시 복제하여 사용
- Limits = new MeasurementLimits(limits.MinVoltage, limits.MaxVoltage, limits.MinCurrent, limits.MaxCurrent);
+ Limits = new MeasurementLimits(limits.MinVoltage, limits.MaxVoltage, limits.MinCurrent, limits.MaxCurrent, limits.MinResistance, limits.MaxResistance);
txtMinVoltage.Text = Limits.MinVoltage.ToString("F1");
txtMaxVoltage.Text = Limits.MaxVoltage.ToString("F1");
txtMinCurrent.Text = Limits.MinCurrent.ToString("F1");
txtMaxCurrent.Text = Limits.MaxCurrent.ToString("F1");
+ txtMinResistance.Text = Limits.MinResistance.ToString("F1");
+ txtMaxResistance.Text = Limits.MaxResistance.ToString("F1");
}
private void btnSave_Click(object sender, RoutedEventArgs e)
{
- double minV, maxV, minC, maxC;
+ double minV, maxV, minC, maxC, minR, maxR;
if (!double.TryParse(txtMinVoltage.Text, out minV) ||
!double.TryParse(txtMaxVoltage.Text, out maxV) ||
!double.TryParse(txtMinCurrent.Text, out minC) ||
- !double.TryParse(txtMaxCurrent.Text, out maxC))
+ !double.TryParse(txtMaxCurrent.Text, out maxC) ||
+ !double.TryParse(txtMinResistance.Text, out minR) ||
+ !double.TryParse(txtMaxResistance.Text, out maxR))
{
MessageBox.Show("기준 범위 설정 값은 올바른 숫자 형식이어야 합니다.", "설정 오류", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
- MeasurementLimits tempLimits = new MeasurementLimits(minV, maxV, minC, maxC);
+ MeasurementLimits tempLimits = new MeasurementLimits(minV, maxV, minC, maxC, minR, maxR);
string errorMessage;
if (!tempLimits.Validate(out errorMessage))
{
diff --git a/marking_gui/bin/Debug/marking_gui.exe b/marking_gui/bin/Debug/marking_gui.exe
index ea62845..34c1d9c 100644
Binary files a/marking_gui/bin/Debug/marking_gui.exe and b/marking_gui/bin/Debug/marking_gui.exe differ
diff --git a/marking_gui/bin/Debug/marking_gui.pdb b/marking_gui/bin/Debug/marking_gui.pdb
index e47e031..7045d97 100644
Binary files a/marking_gui/bin/Debug/marking_gui.pdb and b/marking_gui/bin/Debug/marking_gui.pdb differ
diff --git a/marking_gui/marking_gui.csproj b/marking_gui/marking_gui.csproj
index 1215700..6aa673f 100644
--- a/marking_gui/marking_gui.csproj
+++ b/marking_gui/marking_gui.csproj
@@ -117,6 +117,9 @@
+
+ PreserveNewest
+
\ No newline at end of file
diff --git a/marking_gui/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/marking_gui/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
index da83b00..e41949b 100644
Binary files a/marking_gui/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache and b/marking_gui/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/marking_gui/obj/Debug/MainWindow.baml b/marking_gui/obj/Debug/MainWindow.baml
index aaa4968..1b96b34 100644
Binary files a/marking_gui/obj/Debug/MainWindow.baml and b/marking_gui/obj/Debug/MainWindow.baml differ
diff --git a/marking_gui/obj/Debug/MainWindow.g.cs b/marking_gui/obj/Debug/MainWindow.g.cs
index 7ffa890..3156126 100644
--- a/marking_gui/obj/Debug/MainWindow.g.cs
+++ b/marking_gui/obj/Debug/MainWindow.g.cs
@@ -1,4 +1,4 @@
-#pragma checksum "..\..\MainWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "78353F577CF95121F4374AAAC541156B6A45BBD586BC828F32989335C29F1F19"
+#pragma checksum "..\..\MainWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "AD4A4C06745EFEC612E5A40E8825C3B16CE481532342C19F0C009E1B56E7E5F4"
//------------------------------------------------------------------------------
//
// 이 코드는 도구를 사용하여 생성되었습니다.
@@ -137,7 +137,7 @@ namespace marking_gui {
#line hidden
- #line 288 "..\..\MainWindow.xaml"
+ #line 289 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtVoltage;
@@ -145,7 +145,7 @@ namespace marking_gui {
#line hidden
- #line 292 "..\..\MainWindow.xaml"
+ #line 293 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtVoltageRangeGuide;
@@ -153,7 +153,7 @@ namespace marking_gui {
#line hidden
- #line 307 "..\..\MainWindow.xaml"
+ #line 308 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtCurrent;
@@ -161,7 +161,7 @@ namespace marking_gui {
#line hidden
- #line 311 "..\..\MainWindow.xaml"
+ #line 312 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtCurrentRangeGuide;
@@ -169,7 +169,23 @@ namespace marking_gui {
#line hidden
- #line 317 "..\..\MainWindow.xaml"
+ #line 327 "..\..\MainWindow.xaml"
+ [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
+ internal System.Windows.Controls.TextBlock txtResistance;
+
+ #line default
+ #line hidden
+
+
+ #line 331 "..\..\MainWindow.xaml"
+ [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
+ internal System.Windows.Controls.TextBlock txtResistanceRangeGuide;
+
+ #line default
+ #line hidden
+
+
+ #line 337 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Border borderFinalResult;
@@ -177,7 +193,7 @@ namespace marking_gui {
#line hidden
- #line 326 "..\..\MainWindow.xaml"
+ #line 346 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtFinalResult;
@@ -185,7 +201,7 @@ namespace marking_gui {
#line hidden
- #line 327 "..\..\MainWindow.xaml"
+ #line 347 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtFinalSerial;
@@ -193,7 +209,7 @@ namespace marking_gui {
#line hidden
- #line 337 "..\..\MainWindow.xaml"
+ #line 357 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnStart;
@@ -201,7 +217,7 @@ namespace marking_gui {
#line hidden
- #line 346 "..\..\MainWindow.xaml"
+ #line 366 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnOpenSettings;
@@ -331,27 +347,33 @@ namespace marking_gui {
this.txtCurrentRangeGuide = ((System.Windows.Controls.TextBlock)(target));
return;
case 21:
- this.borderFinalResult = ((System.Windows.Controls.Border)(target));
+ this.txtResistance = ((System.Windows.Controls.TextBlock)(target));
return;
case 22:
- this.txtFinalResult = ((System.Windows.Controls.TextBlock)(target));
+ this.txtResistanceRangeGuide = ((System.Windows.Controls.TextBlock)(target));
return;
case 23:
- this.txtFinalSerial = ((System.Windows.Controls.TextBlock)(target));
+ this.borderFinalResult = ((System.Windows.Controls.Border)(target));
return;
case 24:
+ this.txtFinalResult = ((System.Windows.Controls.TextBlock)(target));
+ return;
+ case 25:
+ this.txtFinalSerial = ((System.Windows.Controls.TextBlock)(target));
+ return;
+ case 26:
this.btnStart = ((System.Windows.Controls.Button)(target));
- #line 338 "..\..\MainWindow.xaml"
+ #line 358 "..\..\MainWindow.xaml"
this.btnStart.Click += new System.Windows.RoutedEventHandler(this.btnStart_Click);
#line default
#line hidden
return;
- case 25:
+ case 27:
this.btnOpenSettings = ((System.Windows.Controls.Button)(target));
- #line 347 "..\..\MainWindow.xaml"
+ #line 367 "..\..\MainWindow.xaml"
this.btnOpenSettings.Click += new System.Windows.RoutedEventHandler(this.btnOpenSettings_Click);
#line default
diff --git a/marking_gui/obj/Debug/MainWindow.g.i.cs b/marking_gui/obj/Debug/MainWindow.g.i.cs
index 48f970b..3156126 100644
--- a/marking_gui/obj/Debug/MainWindow.g.i.cs
+++ b/marking_gui/obj/Debug/MainWindow.g.i.cs
@@ -1,4 +1,4 @@
-#pragma checksum "..\..\MainWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "60B18A2C8EC6850BAA7CCDBE87ACA2C0E97BE83EC5737A82EA9755C4685A0C2C"
+#pragma checksum "..\..\MainWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "AD4A4C06745EFEC612E5A40E8825C3B16CE481532342C19F0C009E1B56E7E5F4"
//------------------------------------------------------------------------------
//
// 이 코드는 도구를 사용하여 생성되었습니다.
@@ -89,7 +89,23 @@ namespace marking_gui {
#line hidden
- #line 188 "..\..\MainWindow.xaml"
+ #line 170 "..\..\MainWindow.xaml"
+ [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
+ internal System.Windows.Controls.Button btnMaximize;
+
+ #line default
+ #line hidden
+
+
+ #line 171 "..\..\MainWindow.xaml"
+ [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
+ internal System.Windows.Controls.TextBlock txtMaximizeIcon;
+
+ #line default
+ #line hidden
+
+
+ #line 201 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtSerial;
@@ -97,7 +113,7 @@ namespace marking_gui {
#line hidden
- #line 219 "..\..\MainWindow.xaml"
+ #line 232 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtPrevHousing;
@@ -105,7 +121,7 @@ namespace marking_gui {
#line hidden
- #line 230 "..\..\MainWindow.xaml"
+ #line 243 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtPrevCal;
@@ -113,7 +129,7 @@ namespace marking_gui {
#line hidden
- #line 241 "..\..\MainWindow.xaml"
+ #line 254 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtPrevEol;
@@ -121,7 +137,7 @@ namespace marking_gui {
#line hidden
- #line 275 "..\..\MainWindow.xaml"
+ #line 289 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtVoltage;
@@ -129,7 +145,7 @@ namespace marking_gui {
#line hidden
- #line 279 "..\..\MainWindow.xaml"
+ #line 293 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtVoltageRangeGuide;
@@ -137,7 +153,7 @@ namespace marking_gui {
#line hidden
- #line 294 "..\..\MainWindow.xaml"
+ #line 308 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtCurrent;
@@ -145,7 +161,7 @@ namespace marking_gui {
#line hidden
- #line 298 "..\..\MainWindow.xaml"
+ #line 312 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtCurrentRangeGuide;
@@ -153,7 +169,23 @@ namespace marking_gui {
#line hidden
- #line 304 "..\..\MainWindow.xaml"
+ #line 327 "..\..\MainWindow.xaml"
+ [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
+ internal System.Windows.Controls.TextBlock txtResistance;
+
+ #line default
+ #line hidden
+
+
+ #line 331 "..\..\MainWindow.xaml"
+ [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
+ internal System.Windows.Controls.TextBlock txtResistanceRangeGuide;
+
+ #line default
+ #line hidden
+
+
+ #line 337 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Border borderFinalResult;
@@ -161,7 +193,7 @@ namespace marking_gui {
#line hidden
- #line 313 "..\..\MainWindow.xaml"
+ #line 346 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtFinalResult;
@@ -169,7 +201,7 @@ namespace marking_gui {
#line hidden
- #line 314 "..\..\MainWindow.xaml"
+ #line 347 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtFinalSerial;
@@ -177,7 +209,7 @@ namespace marking_gui {
#line hidden
- #line 324 "..\..\MainWindow.xaml"
+ #line 357 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnStart;
@@ -185,7 +217,7 @@ namespace marking_gui {
#line hidden
- #line 333 "..\..\MainWindow.xaml"
+ #line 366 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnOpenSettings;
@@ -231,21 +263,29 @@ namespace marking_gui {
#line hidden
return;
case 2:
- this.txtCurrentTime = ((System.Windows.Controls.TextBlock)(target));
+
+ #line 129 "..\..\MainWindow.xaml"
+ ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.TopBar_MouseLeftButtonDown);
+
+ #line default
+ #line hidden
return;
case 3:
- this.txtSystemStatus = ((System.Windows.Controls.TextBlock)(target));
+ this.txtCurrentTime = ((System.Windows.Controls.TextBlock)(target));
return;
case 4:
- this.txtOperatorInfo = ((System.Windows.Controls.TextBlock)(target));
+ this.txtSystemStatus = ((System.Windows.Controls.TextBlock)(target));
return;
case 5:
- this.txtModelInfo = ((System.Windows.Controls.TextBlock)(target));
+ this.txtOperatorInfo = ((System.Windows.Controls.TextBlock)(target));
return;
case 6:
- this.txtLineInfo = ((System.Windows.Controls.TextBlock)(target));
+ this.txtModelInfo = ((System.Windows.Controls.TextBlock)(target));
return;
case 7:
+ this.txtLineInfo = ((System.Windows.Controls.TextBlock)(target));
+ return;
+ case 8:
this.btnLogout = ((System.Windows.Controls.Button)(target));
#line 163 "..\..\MainWindow.xaml"
@@ -254,52 +294,86 @@ namespace marking_gui {
#line default
#line hidden
return;
- case 8:
+ case 9:
+
+ #line 167 "..\..\MainWindow.xaml"
+ ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnMinimize_Click);
+
+ #line default
+ #line hidden
+ return;
+ case 10:
+ this.btnMaximize = ((System.Windows.Controls.Button)(target));
+
+ #line 170 "..\..\MainWindow.xaml"
+ this.btnMaximize.Click += new System.Windows.RoutedEventHandler(this.BtnMaximize_Click);
+
+ #line default
+ #line hidden
+ return;
+ case 11:
+ this.txtMaximizeIcon = ((System.Windows.Controls.TextBlock)(target));
+ return;
+ case 12:
+
+ #line 173 "..\..\MainWindow.xaml"
+ ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnClose_Click);
+
+ #line default
+ #line hidden
+ return;
+ case 13:
this.txtSerial = ((System.Windows.Controls.TextBox)(target));
return;
- case 9:
+ case 14:
this.txtPrevHousing = ((System.Windows.Controls.TextBlock)(target));
return;
- case 10:
+ case 15:
this.txtPrevCal = ((System.Windows.Controls.TextBlock)(target));
return;
- case 11:
+ case 16:
this.txtPrevEol = ((System.Windows.Controls.TextBlock)(target));
return;
- case 12:
+ case 17:
this.txtVoltage = ((System.Windows.Controls.TextBlock)(target));
return;
- case 13:
+ case 18:
this.txtVoltageRangeGuide = ((System.Windows.Controls.TextBlock)(target));
return;
- case 14:
+ case 19:
this.txtCurrent = ((System.Windows.Controls.TextBlock)(target));
return;
- case 15:
+ case 20:
this.txtCurrentRangeGuide = ((System.Windows.Controls.TextBlock)(target));
return;
- case 16:
+ case 21:
+ this.txtResistance = ((System.Windows.Controls.TextBlock)(target));
+ return;
+ case 22:
+ this.txtResistanceRangeGuide = ((System.Windows.Controls.TextBlock)(target));
+ return;
+ case 23:
this.borderFinalResult = ((System.Windows.Controls.Border)(target));
return;
- case 17:
+ case 24:
this.txtFinalResult = ((System.Windows.Controls.TextBlock)(target));
return;
- case 18:
+ case 25:
this.txtFinalSerial = ((System.Windows.Controls.TextBlock)(target));
return;
- case 19:
+ case 26:
this.btnStart = ((System.Windows.Controls.Button)(target));
- #line 325 "..\..\MainWindow.xaml"
+ #line 358 "..\..\MainWindow.xaml"
this.btnStart.Click += new System.Windows.RoutedEventHandler(this.btnStart_Click);
#line default
#line hidden
return;
- case 20:
+ case 27:
this.btnOpenSettings = ((System.Windows.Controls.Button)(target));
- #line 334 "..\..\MainWindow.xaml"
+ #line 367 "..\..\MainWindow.xaml"
this.btnOpenSettings.Click += new System.Windows.RoutedEventHandler(this.btnOpenSettings_Click);
#line default
diff --git a/marking_gui/obj/Debug/SettingsWindow.baml b/marking_gui/obj/Debug/SettingsWindow.baml
index d2534d0..19322e5 100644
Binary files a/marking_gui/obj/Debug/SettingsWindow.baml and b/marking_gui/obj/Debug/SettingsWindow.baml differ
diff --git a/marking_gui/obj/Debug/SettingsWindow.g.cs b/marking_gui/obj/Debug/SettingsWindow.g.cs
index 5bddb21..593bd91 100644
--- a/marking_gui/obj/Debug/SettingsWindow.g.cs
+++ b/marking_gui/obj/Debug/SettingsWindow.g.cs
@@ -1,4 +1,4 @@
-#pragma checksum "..\..\SettingsWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "33961FE01569FF3D7FDD670A40AE2AB5450B6E4881EBA8EABD242BBB6EA0F36D"
+#pragma checksum "..\..\SettingsWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "3B54A611CD6FF472DF4AA312133DE53F7310470DDD5247B79B8465A5C8B8AF60"
//------------------------------------------------------------------------------
//
// 이 코드는 도구를 사용하여 생성되었습니다.
@@ -40,7 +40,7 @@ namespace marking_gui {
public partial class SettingsWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
- #line 65 "..\..\SettingsWindow.xaml"
+ #line 67 "..\..\SettingsWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtMinVoltage;
@@ -48,7 +48,7 @@ namespace marking_gui {
#line hidden
- #line 67 "..\..\SettingsWindow.xaml"
+ #line 69 "..\..\SettingsWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtMaxVoltage;
@@ -56,7 +56,7 @@ namespace marking_gui {
#line hidden
- #line 71 "..\..\SettingsWindow.xaml"
+ #line 73 "..\..\SettingsWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtMinCurrent;
@@ -64,7 +64,7 @@ namespace marking_gui {
#line hidden
- #line 73 "..\..\SettingsWindow.xaml"
+ #line 75 "..\..\SettingsWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtMaxCurrent;
@@ -72,7 +72,23 @@ namespace marking_gui {
#line hidden
- #line 77 "..\..\SettingsWindow.xaml"
+ #line 79 "..\..\SettingsWindow.xaml"
+ [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
+ internal System.Windows.Controls.TextBox txtMinResistance;
+
+ #line default
+ #line hidden
+
+
+ #line 81 "..\..\SettingsWindow.xaml"
+ [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
+ internal System.Windows.Controls.TextBox txtMaxResistance;
+
+ #line default
+ #line hidden
+
+
+ #line 85 "..\..\SettingsWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnSave;
@@ -80,7 +96,7 @@ namespace marking_gui {
#line hidden
- #line 78 "..\..\SettingsWindow.xaml"
+ #line 86 "..\..\SettingsWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnCancel;
@@ -130,18 +146,24 @@ namespace marking_gui {
this.txtMaxCurrent = ((System.Windows.Controls.TextBox)(target));
return;
case 5:
+ this.txtMinResistance = ((System.Windows.Controls.TextBox)(target));
+ return;
+ case 6:
+ this.txtMaxResistance = ((System.Windows.Controls.TextBox)(target));
+ return;
+ case 7:
this.btnSave = ((System.Windows.Controls.Button)(target));
- #line 77 "..\..\SettingsWindow.xaml"
+ #line 85 "..\..\SettingsWindow.xaml"
this.btnSave.Click += new System.Windows.RoutedEventHandler(this.btnSave_Click);
#line default
#line hidden
return;
- case 6:
+ case 8:
this.btnCancel = ((System.Windows.Controls.Button)(target));
- #line 78 "..\..\SettingsWindow.xaml"
+ #line 86 "..\..\SettingsWindow.xaml"
this.btnCancel.Click += new System.Windows.RoutedEventHandler(this.btnCancel_Click);
#line default
diff --git a/marking_gui/obj/Debug/SettingsWindow.g.i.cs b/marking_gui/obj/Debug/SettingsWindow.g.i.cs
index 5bddb21..593bd91 100644
--- a/marking_gui/obj/Debug/SettingsWindow.g.i.cs
+++ b/marking_gui/obj/Debug/SettingsWindow.g.i.cs
@@ -1,4 +1,4 @@
-#pragma checksum "..\..\SettingsWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "33961FE01569FF3D7FDD670A40AE2AB5450B6E4881EBA8EABD242BBB6EA0F36D"
+#pragma checksum "..\..\SettingsWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "3B54A611CD6FF472DF4AA312133DE53F7310470DDD5247B79B8465A5C8B8AF60"
//------------------------------------------------------------------------------
//
// 이 코드는 도구를 사용하여 생성되었습니다.
@@ -40,7 +40,7 @@ namespace marking_gui {
public partial class SettingsWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
- #line 65 "..\..\SettingsWindow.xaml"
+ #line 67 "..\..\SettingsWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtMinVoltage;
@@ -48,7 +48,7 @@ namespace marking_gui {
#line hidden
- #line 67 "..\..\SettingsWindow.xaml"
+ #line 69 "..\..\SettingsWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtMaxVoltage;
@@ -56,7 +56,7 @@ namespace marking_gui {
#line hidden
- #line 71 "..\..\SettingsWindow.xaml"
+ #line 73 "..\..\SettingsWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtMinCurrent;
@@ -64,7 +64,7 @@ namespace marking_gui {
#line hidden
- #line 73 "..\..\SettingsWindow.xaml"
+ #line 75 "..\..\SettingsWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtMaxCurrent;
@@ -72,7 +72,23 @@ namespace marking_gui {
#line hidden
- #line 77 "..\..\SettingsWindow.xaml"
+ #line 79 "..\..\SettingsWindow.xaml"
+ [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
+ internal System.Windows.Controls.TextBox txtMinResistance;
+
+ #line default
+ #line hidden
+
+
+ #line 81 "..\..\SettingsWindow.xaml"
+ [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
+ internal System.Windows.Controls.TextBox txtMaxResistance;
+
+ #line default
+ #line hidden
+
+
+ #line 85 "..\..\SettingsWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnSave;
@@ -80,7 +96,7 @@ namespace marking_gui {
#line hidden
- #line 78 "..\..\SettingsWindow.xaml"
+ #line 86 "..\..\SettingsWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnCancel;
@@ -130,18 +146,24 @@ namespace marking_gui {
this.txtMaxCurrent = ((System.Windows.Controls.TextBox)(target));
return;
case 5:
+ this.txtMinResistance = ((System.Windows.Controls.TextBox)(target));
+ return;
+ case 6:
+ this.txtMaxResistance = ((System.Windows.Controls.TextBox)(target));
+ return;
+ case 7:
this.btnSave = ((System.Windows.Controls.Button)(target));
- #line 77 "..\..\SettingsWindow.xaml"
+ #line 85 "..\..\SettingsWindow.xaml"
this.btnSave.Click += new System.Windows.RoutedEventHandler(this.btnSave_Click);
#line default
#line hidden
return;
- case 6:
+ case 8:
this.btnCancel = ((System.Windows.Controls.Button)(target));
- #line 78 "..\..\SettingsWindow.xaml"
+ #line 86 "..\..\SettingsWindow.xaml"
this.btnCancel.Click += new System.Windows.RoutedEventHandler(this.btnCancel_Click);
#line default
diff --git a/marking_gui/obj/Debug/marking_gui.csproj.FileListAbsolute.txt b/marking_gui/obj/Debug/marking_gui.csproj.FileListAbsolute.txt
index d88a64c..d9434a0 100644
--- a/marking_gui/obj/Debug/marking_gui.csproj.FileListAbsolute.txt
+++ b/marking_gui/obj/Debug/marking_gui.csproj.FileListAbsolute.txt
@@ -38,3 +38,4 @@ C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\obj\Debug\MainWindow.bam
C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\obj\Debug\marking_gui.g.resources
C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\obj\Debug\marking_gui.exe
C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\obj\Debug\marking_gui.pdb
+C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\bin\Debug\Database.ini
diff --git a/marking_gui/obj/Debug/marking_gui.exe b/marking_gui/obj/Debug/marking_gui.exe
index ea62845..34c1d9c 100644
Binary files a/marking_gui/obj/Debug/marking_gui.exe and b/marking_gui/obj/Debug/marking_gui.exe differ
diff --git a/marking_gui/obj/Debug/marking_gui.g.resources b/marking_gui/obj/Debug/marking_gui.g.resources
index ddd7d20..38085ca 100644
Binary files a/marking_gui/obj/Debug/marking_gui.g.resources and b/marking_gui/obj/Debug/marking_gui.g.resources differ
diff --git a/marking_gui/obj/Debug/marking_gui.pdb b/marking_gui/obj/Debug/marking_gui.pdb
index e47e031..7045d97 100644
Binary files a/marking_gui/obj/Debug/marking_gui.pdb and b/marking_gui/obj/Debug/marking_gui.pdb differ
diff --git a/marking_gui/obj/Debug/marking_gui_MarkupCompile.i.cache b/marking_gui/obj/Debug/marking_gui_MarkupCompile.i.cache
index f529594..165b1b9 100644
--- a/marking_gui/obj/Debug/marking_gui_MarkupCompile.i.cache
+++ b/marking_gui/obj/Debug/marking_gui_MarkupCompile.i.cache
@@ -12,7 +12,7 @@ DEBUG;TRACE
C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\App.xaml
3-1210742192
-13735417974
+141215079075
14-207034072
MainWindow.xaml;SettingsWindow.xaml;StartupLoginWindow.xaml;
diff --git a/marking_gui/obj/Debug/marking_gui_MarkupCompile.i.lref b/marking_gui/obj/Debug/marking_gui_MarkupCompile.i.lref
index 8b24a01..98f95c1 100644
--- a/marking_gui/obj/Debug/marking_gui_MarkupCompile.i.lref
+++ b/marking_gui/obj/Debug/marking_gui_MarkupCompile.i.lref
@@ -1,4 +1,4 @@
-FC:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\App.xaml;;
+
FC:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\MainWindow.xaml;;