Browse Source

fix: S/N 읽기 방식 수정, 로직 순서 변경

master
seuuung 2 months ago
parent
commit
2e1911d008
  1. 0
      .vs/marking_gui.slnx/FileContentIndex/0eaf846b-d4b9-4caf-a370-de061ce0320c.vsidx
  2. 0
      .vs/marking_gui.slnx/FileContentIndex/5aec86f5-6062-4241-89fe-a2d7cacc7094.vsidx
  3. BIN
      .vs/marking_gui.slnx/FileContentIndex/a26e37eb-5b6f-417f-8426-dfd11cf0e629.vsidx
  4. BIN
      .vs/marking_gui.slnx/FileContentIndex/dbd6c12d-68ab-4590-b0c7-f0747a0fdc95.vsidx
  5. BIN
      .vs/marking_gui.slnx/FileContentIndex/e996ace7-7fba-4157-879f-74d3faae8720.vsidx
  6. BIN
      .vs/marking_gui.slnx/FileContentIndex/e9aaf3b7-f547-4846-9bb0-c8cac36ad7c4.vsidx
  7. BIN
      .vs/marking_gui.slnx/v18/.suo
  8. 30
      .vs/marking_gui.slnx/v18/DocumentLayout.backup.json
  9. 30
      .vs/marking_gui.slnx/v18/DocumentLayout.json
  10. BIN
      build_log.txt
  11. 17
      marking_gui/App.xaml.cs
  12. 60
      marking_gui/MainWindow.xaml
  13. 174
      marking_gui/MainWindow.xaml.cs
  14. 33
      marking_gui/Services/MemoryReaderService.cs
  15. 36
      marking_gui/Services/MssqlDatabaseService.cs
  16. BIN
      marking_gui/bin/Debug/marking_gui.exe
  17. BIN
      marking_gui/bin/Debug/marking_gui.pdb
  18. 1
      marking_gui/marking_gui.csproj
  19. BIN
      marking_gui/obj/Debug/App.baml
  20. 2
      marking_gui/obj/Debug/App.g.cs
  21. 2
      marking_gui/obj/Debug/App.g.i.cs
  22. BIN
      marking_gui/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
  23. BIN
      marking_gui/obj/Debug/MainWindow.baml
  24. 115
      marking_gui/obj/Debug/MainWindow.g.cs
  25. 14
      marking_gui/obj/Debug/MainWindow.g.i.cs
  26. BIN
      marking_gui/obj/Debug/SettingsWindow.baml
  27. 2
      marking_gui/obj/Debug/SettingsWindow.g.cs
  28. 2
      marking_gui/obj/Debug/SettingsWindow.g.i.cs
  29. BIN
      marking_gui/obj/Debug/StartupLoginWindow.baml
  30. 2
      marking_gui/obj/Debug/StartupLoginWindow.g.cs
  31. 2
      marking_gui/obj/Debug/StartupLoginWindow.g.i.cs
  32. BIN
      marking_gui/obj/Debug/marking_gui.csproj.AssemblyReference.cache
  33. 2
      marking_gui/obj/Debug/marking_gui.csproj.CoreCompileInputs.cache
  34. 1
      marking_gui/obj/Debug/marking_gui.csproj.FileListAbsolute.txt
  35. BIN
      marking_gui/obj/Debug/marking_gui.csproj.GenerateResource.cache
  36. BIN
      marking_gui/obj/Debug/marking_gui.exe
  37. BIN
      marking_gui/obj/Debug/marking_gui.g.resources
  38. BIN
      marking_gui/obj/Debug/marking_gui.pdb
  39. 10
      marking_gui/obj/Debug/marking_gui_MarkupCompile.cache
  40. 2
      marking_gui/obj/Debug/marking_gui_MarkupCompile.i.cache
  41. 2
      marking_gui/obj/Debug/marking_gui_MarkupCompile.i.lref
  42. 4
      marking_gui/obj/Debug/marking_gui_MarkupCompile.lref
  43. 142
      program_flow.md

0
.vs/marking_gui.slnx/FileContentIndex/b2cdd851-fde6-4ff7-8960-15b7403933fa.vsidx → .vs/marking_gui.slnx/FileContentIndex/0eaf846b-d4b9-4caf-a370-de061ce0320c.vsidx

0
.vs/marking_gui.slnx/FileContentIndex/b9adc68c-0602-473b-92e8-cab09444cfae.vsidx → .vs/marking_gui.slnx/FileContentIndex/5aec86f5-6062-4241-89fe-a2d7cacc7094.vsidx

BIN
.vs/marking_gui.slnx/FileContentIndex/a26e37eb-5b6f-417f-8426-dfd11cf0e629.vsidx

Binary file not shown.

BIN
.vs/marking_gui.slnx/FileContentIndex/dbd6c12d-68ab-4590-b0c7-f0747a0fdc95.vsidx

Binary file not shown.

BIN
.vs/marking_gui.slnx/FileContentIndex/e996ace7-7fba-4157-879f-74d3faae8720.vsidx

Binary file not shown.

BIN
.vs/marking_gui.slnx/FileContentIndex/e9aaf3b7-f547-4846-9bb0-c8cac36ad7c4.vsidx

Binary file not shown.

BIN
.vs/marking_gui.slnx/v18/.suo

Binary file not shown.

30
.vs/marking_gui.slnx/v18/DocumentLayout.backup.json

@ -1,20 +1,20 @@
{ {
"Version": 1, "Version": 1,
"WorkspaceRootPath": "C:\\Users\\wjddn\\Desktop\\amosense\\marking_gui\\", "WorkspaceRootPath": "C:\\Users\\COMPUTER1\\Desktop\\mobi\\marking_gui\\",
"Documents": [ "Documents": [
{ {
"AbsoluteMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|c:\\users\\wjddn\\desktop\\amosense\\marking_gui\\marking_gui\\mainwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}", "AbsoluteMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|c:\\users\\computer1\\desktop\\mobi\\marking_gui\\marking_gui\\mainwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
"RelativeMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|solutionrelative:marking_gui\\mainwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}" "RelativeMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|solutionrelative:marking_gui\\mainwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
}, },
{ {
"AbsoluteMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|c:\\users\\wjddn\\desktop\\amosense\\marking_gui\\marking_gui\\startuploginwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}", "AbsoluteMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|C:\\Users\\COMPUTER1\\Desktop\\mobi\\marking_gui\\marking_gui\\startuploginwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
"RelativeMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|solutionrelative:marking_gui\\startuploginwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}" "RelativeMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|solutionrelative:marking_gui\\startuploginwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
}, },
{ {
"AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\wjddn\\Desktop\\amosense\\AMO_Housing\\MainWindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\wjddn\\Desktop\\amosense\\AMO_Housing\\MainWindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
}, },
{ {
"AbsoluteMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|C:\\Users\\wjddn\\Desktop\\amosense\\marking_gui\\marking_gui\\mainwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", "AbsoluteMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|C:\\Users\\COMPUTER1\\Desktop\\mobi\\marking_gui\\marking_gui\\mainwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|solutionrelative:marking_gui\\mainwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" "RelativeMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|solutionrelative:marking_gui\\mainwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
} }
], ],
@ -31,34 +31,32 @@
"$type": "Document", "$type": "Document",
"DocumentIndex": 1, "DocumentIndex": 1,
"Title": "StartupLoginWindow.xaml", "Title": "StartupLoginWindow.xaml",
"DocumentMoniker": "C:\\Users\\wjddn\\Desktop\\amosense\\marking_gui\\marking_gui\\StartupLoginWindow.xaml", "DocumentMoniker": "C:\\Users\\COMPUTER1\\Desktop\\mobi\\marking_gui\\marking_gui\\StartupLoginWindow.xaml",
"RelativeDocumentMoniker": "marking_gui\\StartupLoginWindow.xaml", "RelativeDocumentMoniker": "marking_gui\\StartupLoginWindow.xaml",
"ToolTip": "C:\\Users\\wjddn\\Desktop\\amosense\\marking_gui\\marking_gui\\StartupLoginWindow.xaml", "ToolTip": "C:\\Users\\COMPUTER1\\Desktop\\mobi\\marking_gui\\marking_gui\\StartupLoginWindow.xaml",
"RelativeToolTip": "marking_gui\\StartupLoginWindow.xaml", "RelativeToolTip": "marking_gui\\StartupLoginWindow.xaml",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
"WhenOpened": "2026-06-08T01:06:29.984Z", "WhenOpened": "2026-06-08T01:06:29.984Z"
"EditorCaption": ""
}, },
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 2, "DocumentIndex": 2,
"Title": "MainWindow.xaml.cs", "Title": "MainWindow.xaml.cs",
"DocumentMoniker": "C:\\Users\\wjddn\\Desktop\\amosense\\AMO_Housing\\MainWindow.xaml.cs", "DocumentMoniker": "C:\\Users\\wjddn\\Desktop\\amosense\\AMO_Housing\\MainWindow.xaml.cs",
"RelativeDocumentMoniker": "..\\AMO_Housing\\MainWindow.xaml.cs", "RelativeDocumentMoniker": "..\\..\\..\\..\\wjddn\\Desktop\\amosense\\AMO_Housing\\MainWindow.xaml.cs",
"ToolTip": "C:\\Users\\wjddn\\Desktop\\amosense\\AMO_Housing\\MainWindow.xaml.cs", "ToolTip": "C:\\Users\\wjddn\\Desktop\\amosense\\AMO_Housing\\MainWindow.xaml.cs",
"RelativeToolTip": "..\\AMO_Housing\\MainWindow.xaml.cs", "RelativeToolTip": "..\\..\\..\\..\\wjddn\\Desktop\\amosense\\AMO_Housing\\MainWindow.xaml.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-06-08T00:52:55.21Z", "WhenOpened": "2026-06-08T00:52:55.21Z"
"EditorCaption": ""
}, },
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 0, "DocumentIndex": 0,
"Title": "MainWindow.xaml", "Title": "MainWindow.xaml",
"DocumentMoniker": "C:\\Users\\wjddn\\Desktop\\amosense\\marking_gui\\marking_gui\\MainWindow.xaml", "DocumentMoniker": "C:\\Users\\COMPUTER1\\Desktop\\mobi\\marking_gui\\marking_gui\\MainWindow.xaml",
"RelativeDocumentMoniker": "marking_gui\\MainWindow.xaml", "RelativeDocumentMoniker": "marking_gui\\MainWindow.xaml",
"ToolTip": "C:\\Users\\wjddn\\Desktop\\amosense\\marking_gui\\marking_gui\\MainWindow.xaml", "ToolTip": "C:\\Users\\COMPUTER1\\Desktop\\mobi\\marking_gui\\marking_gui\\MainWindow.xaml",
"RelativeToolTip": "marking_gui\\MainWindow.xaml", "RelativeToolTip": "marking_gui\\MainWindow.xaml",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
"WhenOpened": "2026-06-05T02:08:02.816Z", "WhenOpened": "2026-06-05T02:08:02.816Z",
@ -68,9 +66,9 @@
"$type": "Document", "$type": "Document",
"DocumentIndex": 3, "DocumentIndex": 3,
"Title": "MainWindow.xaml.cs", "Title": "MainWindow.xaml.cs",
"DocumentMoniker": "C:\\Users\\wjddn\\Desktop\\amosense\\marking_gui\\marking_gui\\MainWindow.xaml.cs", "DocumentMoniker": "C:\\Users\\COMPUTER1\\Desktop\\mobi\\marking_gui\\marking_gui\\MainWindow.xaml.cs",
"RelativeDocumentMoniker": "marking_gui\\MainWindow.xaml.cs", "RelativeDocumentMoniker": "marking_gui\\MainWindow.xaml.cs",
"ToolTip": "C:\\Users\\wjddn\\Desktop\\amosense\\marking_gui\\marking_gui\\MainWindow.xaml.cs", "ToolTip": "C:\\Users\\COMPUTER1\\Desktop\\mobi\\marking_gui\\marking_gui\\MainWindow.xaml.cs",
"RelativeToolTip": "marking_gui\\MainWindow.xaml.cs", "RelativeToolTip": "marking_gui\\MainWindow.xaml.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "00000000-0000-0000-0000-000000000000.000000|iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADKSURBVDhP7ZMhDoNAEEX/VlStqMYwJ\u002BgFegguwB1AIsC1ZhWKE3AVkj3DojCEBIOumZqWLENoSVPZl6zYPz8/k5ldQHC\u002BWbbtyFLfjW1HDvOGbTuyMYaJiIui2AxUYd5wN92ljvB0RHe9KCLiKIqglEJZlkr6VvgdAAARMQAkScJpmm52MiNnQEQ8DMO\u002BEGPMqviag3\u002BkZ\u002BZt8Yn0HPzLN/wDfh2gtYZzbnOVzjkOgmChLd52XddcVRX6vvflGa01sixDHMef/8ReHgD\u002BXy4W5TMHAAAAAElFTkSuQmCC", "Icon": "00000000-0000-0000-0000-000000000000.000000|iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADKSURBVDhP7ZMhDoNAEEX/VlStqMYwJ\u002BgFegguwB1AIsC1ZhWKE3AVkj3DojCEBIOumZqWLENoSVPZl6zYPz8/k5ldQHC\u002BWbbtyFLfjW1HDvOGbTuyMYaJiIui2AxUYd5wN92ljvB0RHe9KCLiKIqglEJZlkr6VvgdAAARMQAkScJpmm52MiNnQEQ8DMO\u002BEGPMqviag3\u002BkZ\u002BZt8Yn0HPzLN/wDfh2gtYZzbnOVzjkOgmChLd52XddcVRX6vvflGa01sixDHMef/8ReHgD\u002BXy4W5TMHAAAAAElFTkSuQmCC",

30
.vs/marking_gui.slnx/v18/DocumentLayout.json

@ -1,20 +1,20 @@
{ {
"Version": 1, "Version": 1,
"WorkspaceRootPath": "C:\\Users\\wjddn\\Desktop\\amosense\\marking_gui\\", "WorkspaceRootPath": "C:\\Users\\COMPUTER1\\Desktop\\mobi\\marking_gui\\",
"Documents": [ "Documents": [
{ {
"AbsoluteMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|c:\\users\\wjddn\\desktop\\amosense\\marking_gui\\marking_gui\\mainwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}", "AbsoluteMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|c:\\users\\computer1\\desktop\\mobi\\marking_gui\\marking_gui\\mainwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
"RelativeMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|solutionrelative:marking_gui\\mainwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}" "RelativeMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|solutionrelative:marking_gui\\mainwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
}, },
{ {
"AbsoluteMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|c:\\users\\wjddn\\desktop\\amosense\\marking_gui\\marking_gui\\startuploginwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}", "AbsoluteMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|C:\\Users\\COMPUTER1\\Desktop\\mobi\\marking_gui\\marking_gui\\startuploginwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
"RelativeMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|solutionrelative:marking_gui\\startuploginwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}" "RelativeMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|solutionrelative:marking_gui\\startuploginwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
}, },
{ {
"AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\wjddn\\Desktop\\amosense\\AMO_Housing\\MainWindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\wjddn\\Desktop\\amosense\\AMO_Housing\\MainWindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
}, },
{ {
"AbsoluteMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|C:\\Users\\wjddn\\Desktop\\amosense\\marking_gui\\marking_gui\\mainwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", "AbsoluteMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|C:\\Users\\COMPUTER1\\Desktop\\mobi\\marking_gui\\marking_gui\\mainwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|solutionrelative:marking_gui\\mainwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" "RelativeMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|solutionrelative:marking_gui\\mainwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
} }
], ],
@ -31,34 +31,32 @@
"$type": "Document", "$type": "Document",
"DocumentIndex": 1, "DocumentIndex": 1,
"Title": "StartupLoginWindow.xaml", "Title": "StartupLoginWindow.xaml",
"DocumentMoniker": "C:\\Users\\wjddn\\Desktop\\amosense\\marking_gui\\marking_gui\\StartupLoginWindow.xaml", "DocumentMoniker": "C:\\Users\\COMPUTER1\\Desktop\\mobi\\marking_gui\\marking_gui\\StartupLoginWindow.xaml",
"RelativeDocumentMoniker": "marking_gui\\StartupLoginWindow.xaml", "RelativeDocumentMoniker": "marking_gui\\StartupLoginWindow.xaml",
"ToolTip": "C:\\Users\\wjddn\\Desktop\\amosense\\marking_gui\\marking_gui\\StartupLoginWindow.xaml", "ToolTip": "C:\\Users\\COMPUTER1\\Desktop\\mobi\\marking_gui\\marking_gui\\StartupLoginWindow.xaml",
"RelativeToolTip": "marking_gui\\StartupLoginWindow.xaml", "RelativeToolTip": "marking_gui\\StartupLoginWindow.xaml",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
"WhenOpened": "2026-06-08T01:06:29.984Z", "WhenOpened": "2026-06-08T01:06:29.984Z"
"EditorCaption": ""
}, },
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 2, "DocumentIndex": 2,
"Title": "MainWindow.xaml.cs", "Title": "MainWindow.xaml.cs",
"DocumentMoniker": "C:\\Users\\wjddn\\Desktop\\amosense\\AMO_Housing\\MainWindow.xaml.cs", "DocumentMoniker": "C:\\Users\\wjddn\\Desktop\\amosense\\AMO_Housing\\MainWindow.xaml.cs",
"RelativeDocumentMoniker": "..\\AMO_Housing\\MainWindow.xaml.cs", "RelativeDocumentMoniker": "..\\..\\..\\..\\wjddn\\Desktop\\amosense\\AMO_Housing\\MainWindow.xaml.cs",
"ToolTip": "C:\\Users\\wjddn\\Desktop\\amosense\\AMO_Housing\\MainWindow.xaml.cs", "ToolTip": "C:\\Users\\wjddn\\Desktop\\amosense\\AMO_Housing\\MainWindow.xaml.cs",
"RelativeToolTip": "..\\AMO_Housing\\MainWindow.xaml.cs", "RelativeToolTip": "..\\..\\..\\..\\wjddn\\Desktop\\amosense\\AMO_Housing\\MainWindow.xaml.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-06-08T00:52:55.21Z", "WhenOpened": "2026-06-08T00:52:55.21Z"
"EditorCaption": ""
}, },
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 0, "DocumentIndex": 0,
"Title": "MainWindow.xaml", "Title": "MainWindow.xaml",
"DocumentMoniker": "C:\\Users\\wjddn\\Desktop\\amosense\\marking_gui\\marking_gui\\MainWindow.xaml", "DocumentMoniker": "C:\\Users\\COMPUTER1\\Desktop\\mobi\\marking_gui\\marking_gui\\MainWindow.xaml",
"RelativeDocumentMoniker": "marking_gui\\MainWindow.xaml", "RelativeDocumentMoniker": "marking_gui\\MainWindow.xaml",
"ToolTip": "C:\\Users\\wjddn\\Desktop\\amosense\\marking_gui\\marking_gui\\MainWindow.xaml", "ToolTip": "C:\\Users\\COMPUTER1\\Desktop\\mobi\\marking_gui\\marking_gui\\MainWindow.xaml",
"RelativeToolTip": "marking_gui\\MainWindow.xaml", "RelativeToolTip": "marking_gui\\MainWindow.xaml",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
"WhenOpened": "2026-06-05T02:08:02.816Z", "WhenOpened": "2026-06-05T02:08:02.816Z",
@ -68,9 +66,9 @@
"$type": "Document", "$type": "Document",
"DocumentIndex": 3, "DocumentIndex": 3,
"Title": "MainWindow.xaml.cs", "Title": "MainWindow.xaml.cs",
"DocumentMoniker": "C:\\Users\\wjddn\\Desktop\\amosense\\marking_gui\\marking_gui\\MainWindow.xaml.cs", "DocumentMoniker": "C:\\Users\\COMPUTER1\\Desktop\\mobi\\marking_gui\\marking_gui\\MainWindow.xaml.cs",
"RelativeDocumentMoniker": "marking_gui\\MainWindow.xaml.cs", "RelativeDocumentMoniker": "marking_gui\\MainWindow.xaml.cs",
"ToolTip": "C:\\Users\\wjddn\\Desktop\\amosense\\marking_gui\\marking_gui\\MainWindow.xaml.cs", "ToolTip": "C:\\Users\\COMPUTER1\\Desktop\\mobi\\marking_gui\\marking_gui\\MainWindow.xaml.cs",
"RelativeToolTip": "marking_gui\\MainWindow.xaml.cs", "RelativeToolTip": "marking_gui\\MainWindow.xaml.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "00000000-0000-0000-0000-000000000000.000000|iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADKSURBVDhP7ZMhDoNAEEX/VlStqMYwJ\u002BgFegguwB1AIsC1ZhWKE3AVkj3DojCEBIOumZqWLENoSVPZl6zYPz8/k5ldQHC\u002BWbbtyFLfjW1HDvOGbTuyMYaJiIui2AxUYd5wN92ljvB0RHe9KCLiKIqglEJZlkr6VvgdAAARMQAkScJpmm52MiNnQEQ8DMO\u002BEGPMqviag3\u002BkZ\u002BZt8Yn0HPzLN/wDfh2gtYZzbnOVzjkOgmChLd52XddcVRX6vvflGa01sixDHMef/8ReHgD\u002BXy4W5TMHAAAAAElFTkSuQmCC", "Icon": "00000000-0000-0000-0000-000000000000.000000|iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADKSURBVDhP7ZMhDoNAEEX/VlStqMYwJ\u002BgFegguwB1AIsC1ZhWKE3AVkj3DojCEBIOumZqWLENoSVPZl6zYPz8/k5ldQHC\u002BWbbtyFLfjW1HDvOGbTuyMYaJiIui2AxUYd5wN92ljvB0RHe9KCLiKIqglEJZlkr6VvgdAAARMQAkScJpmm52MiNnQEQ8DMO\u002BEGPMqviag3\u002BkZ\u002BZt8Yn0HPzLN/wDfh2gtYZzbnOVzjkOgmChLd52XddcVRX6vvflGa01sixDHMef/8ReHgD\u002BXy4W5TMHAAAAAElFTkSuQmCC",

BIN
build_log.txt

Binary file not shown.

17
marking_gui/App.xaml.cs

@ -17,23 +17,8 @@ namespace marking_gui
{ {
base.OnStartup(e); base.OnStartup(e);
// 로그인 창이 닫힐 때 앱이 자동 종료되는 것을 방지하기 위해 ExplicitShutdown으로 설정 var mainWindow = new MainWindow();
ShutdownMode = ShutdownMode.OnExplicitShutdown;
var loginWindow = new Housing.Login.StartupLoginWindow();
if (loginWindow.ShowDialog() == true)
{
var loginResult = loginWindow.Result;
var mainWindow = new MainWindow(loginResult);
// 메인 창이 닫힐 때 앱이 정상 종료되도록 기본 모드로 원복
ShutdownMode = ShutdownMode.OnLastWindowClose;
mainWindow.Show(); mainWindow.Show();
} }
else
{
Shutdown();
}
}
} }
} }

60
marking_gui/MainWindow.xaml

@ -7,7 +7,8 @@
mc:Ignorable="d" mc:Ignorable="d"
Title="양산형 테스트 기기 모니터링 시스템" Height="700" Width="900" Title="양산형 테스트 기기 모니터링 시스템" Height="700" Width="900"
MinWidth="900" MinHeight="700" WindowState="Maximized" MinWidth="900" MinHeight="700" WindowState="Maximized"
WindowStartupLocation="CenterScreen" Background="#F3F4F6"> WindowStartupLocation="CenterScreen" Background="#F3F4F6"
ContentRendered="Window_ContentRendered">
<Window.Resources> <Window.Resources>
<!-- 버튼 스타일 --> <!-- 버튼 스타일 -->
<Style x:Key="ModernButtonStyle" TargetType="Button"> <Style x:Key="ModernButtonStyle" TargetType="Button">
@ -78,6 +79,38 @@
<Setter Property="Padding" Value="20"/> <Setter Property="Padding" Value="20"/>
<Setter Property="Margin" Value="10"/> <Setter Property="Margin" Value="10"/>
</Style> </Style>
<!-- 로그아웃용 빨간색 버튼 스타일 -->
<Style x:Key="RedButtonStyle" TargetType="Button">
<Setter Property="Background" Value="#EF4444"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="FontSize" Value="12"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Focusable" Value="False"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Padding" Value="10,5"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border Background="{TemplateBinding Background}"
CornerRadius="4"
BorderThickness="{TemplateBinding BorderThickness}"
BorderBrush="{TemplateBinding BorderBrush}">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#DC2626"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Background" Value="#D1D5DB"/>
<Setter Property="Foreground" Value="#9CA3AF"/>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources> </Window.Resources>
<Grid> <Grid>
@ -102,11 +135,13 @@
<StackPanel Orientation="Horizontal" VerticalAlignment="Center"> <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="Marking" Foreground="White" FontSize="20" FontWeight="Bold" VerticalAlignment="Center"/> <TextBlock Text="Marking" Foreground="White" FontSize="20" FontWeight="Bold" VerticalAlignment="Center"/>
<TextBlock Text="v1.0.0 (Updated: 2026-06-05)" Foreground="#9CA3AF" FontSize="12" VerticalAlignment="Bottom" Margin="12,0,0,2"/> <TextBlock Text="v1.0.0 (Updated: 2026-06-05)" Foreground="#9CA3AF" FontSize="12" VerticalAlignment="Bottom" Margin="12,0,0,2"/>
<TextBlock x:Name="txtLoginInfo" Text="[작업자: --- | 모델: --- | 라인: ---]" Foreground="#9CA3AF" FontSize="13" FontWeight="Medium" VerticalAlignment="Bottom" Margin="25,0,0,2"/> <TextBlock x:Name="txtCurrentTime" Text="0000-00-00 00:00:00" Foreground="White" FontSize="15" FontWeight="Bold" VerticalAlignment="Bottom" Margin="25,0,0,2"/>
<TextBlock Text="상태: 대기 중" x:Name="txtSystemStatus" Foreground="#10B981" FontSize="15" FontWeight="Bold" VerticalAlignment="Bottom" Margin="25,0,0,2"/>
</StackPanel> </StackPanel>
<StackPanel Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center"> <StackPanel Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock x:Name="txtCurrentTime" Text="0000-00-00 00:00:00" Foreground="White" FontSize="16" FontWeight="Bold" VerticalAlignment="Center" Margin="0,0,20,0"/> <TextBlock x:Name="txtOperatorInfo" Text="[작업자: ---]" Foreground="#9CA3AF" FontSize="13" FontWeight="Medium" VerticalAlignment="Center" Margin="0,0,15,0"/>
<TextBlock Text="상태: 대기 중" x:Name="txtSystemStatus" Foreground="#10B981" FontSize="16" FontWeight="Bold" VerticalAlignment="Center"/> <TextBlock x:Name="txtModelLineInfo" Text="[모델: --- | 라인: ---]" Foreground="#9CA3AF" FontSize="13" FontWeight="Medium" VerticalAlignment="Center" Margin="0,0,20,0"/>
<Button x:Name="btnLogout" Content="로그아웃" Style="{StaticResource RedButtonStyle}" Click="btnLogout_Click" VerticalAlignment="Center" Width="70" Height="28"/>
</StackPanel> </StackPanel>
</Grid> </Grid>
</Border> </Border>
@ -131,15 +166,8 @@
<Border Grid.Row="0" Style="{StaticResource CardBorderStyle}"> <Border Grid.Row="0" Style="{StaticResource CardBorderStyle}">
<StackPanel> <StackPanel>
<TextBlock Text="S/N 입력" FontSize="16" FontWeight="Bold" Foreground="#374151" Margin="0,0,0,10"/> <TextBlock Text="S/N 입력" FontSize="16" FontWeight="Bold" Foreground="#374151" Margin="0,0,0,10"/>
<Grid> <TextBox x:Name="txtSerial" FontSize="18" Padding="8,6"
<Grid.ColumnDefinitions> VerticalContentAlignment="Center" BorderBrush="#D1D5DB" BorderThickness="1" IsReadOnly="True"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="65"/>
</Grid.ColumnDefinitions>
<TextBox x:Name="txtSerial" Grid.Column="0" FontSize="18" Padding="8,6" Margin="0,0,8,0"
VerticalContentAlignment="Center" BorderBrush="#D1D5DB" BorderThickness="1" GotFocus="txtSerial_GotFocus" KeyDown="txtSerial_KeyDown"/>
<Button x:Name="btnSearchSerial" Grid.Column="1" Content="조회" Style="{StaticResource ModernButtonStyle}" Click="btnSearchSerial_Click"/>
</Grid>
<TextBlock Text="※ 테스트 S/N: PASS1234 / FAIL5678" Foreground="#9CA3AF" FontSize="11" Margin="0,8,0,0"/> <TextBlock Text="※ 테스트 S/N: PASS1234 / FAIL5678" Foreground="#9CA3AF" FontSize="11" Margin="0,8,0,0"/>
</StackPanel> </StackPanel>
</Border> </Border>
@ -225,7 +253,7 @@
<TextBlock Grid.Row="0" Text="측정 전압 (Voltage)" FontSize="14" Foreground="#6B7280" HorizontalAlignment="Center"/> <TextBlock Grid.Row="0" Text="측정 전압 (Voltage)" FontSize="14" Foreground="#6B7280" HorizontalAlignment="Center"/>
<Viewbox Grid.Row="1" Stretch="Uniform" Margin="0,5"> <Viewbox Grid.Row="1" Stretch="Uniform" Margin="0,5">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center"> <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<TextBlock x:Name="txtVoltage" Text="---.-" FontSize="54" FontWeight="Bold" Foreground="#1F2937"/> <TextBlock x:Name="txtVoltage" Text="-.--" FontSize="54" FontWeight="Bold" Foreground="#1F2937"/>
<TextBlock Text=" V" FontSize="20" FontWeight="Bold" Foreground="#9CA3AF" VerticalAlignment="Bottom" Margin="5,0,0,8"/> <TextBlock Text=" V" FontSize="20" FontWeight="Bold" Foreground="#9CA3AF" VerticalAlignment="Bottom" Margin="5,0,0,8"/>
</StackPanel> </StackPanel>
</Viewbox> </Viewbox>
@ -244,7 +272,7 @@
<TextBlock Grid.Row="0" Text="측정 전류 (Current)" FontSize="14" Foreground="#6B7280" HorizontalAlignment="Center"/> <TextBlock Grid.Row="0" Text="측정 전류 (Current)" FontSize="14" Foreground="#6B7280" HorizontalAlignment="Center"/>
<Viewbox Grid.Row="1" Stretch="Uniform" Margin="0,5"> <Viewbox Grid.Row="1" Stretch="Uniform" Margin="0,5">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center"> <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<TextBlock x:Name="txtCurrent" Text="--.-" FontSize="54" FontWeight="Bold" Foreground="#1F2937"/> <TextBlock x:Name="txtCurrent" Text="-.--" FontSize="54" FontWeight="Bold" Foreground="#1F2937"/>
<TextBlock Text=" A" FontSize="20" FontWeight="Bold" Foreground="#9CA3AF" VerticalAlignment="Bottom" Margin="5,0,0,8"/> <TextBlock Text=" A" FontSize="20" FontWeight="Bold" Foreground="#9CA3AF" VerticalAlignment="Bottom" Margin="5,0,0,8"/>
</StackPanel> </StackPanel>
</Viewbox> </Viewbox>
@ -275,7 +303,7 @@
<!-- 3. 하단 푸터 (전체 영역이 스타트 버튼) --> <!-- 3. 하단 푸터 (전체 영역이 스타트 버튼) -->
<Border Grid.Row="2" BorderBrush="#D1D5DB" BorderThickness="0,1,0,0"> <Border Grid.Row="2" BorderBrush="#D1D5DB" BorderThickness="0,1,0,0">
<Button x:Name="btnStart" Content="▶ 검사 시작 (START)" <Button x:Name="btnStart" Content="▶ 검사 시작 (START)"
Style="{StaticResource StartButtonStyle}" IsEnabled="False" Click="btnStart_Click" Style="{StaticResource StartButtonStyle}" IsEnabled="True" Click="btnStart_Click"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/> HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
</Border> </Border>

174
marking_gui/MainWindow.xaml.cs

@ -19,17 +19,14 @@ namespace marking_gui
// 비즈니스 로직 및 가상 하드웨어/DB 서비스 분리 // 비즈니스 로직 및 가상 하드웨어/DB 서비스 분리
private readonly MssqlDatabaseService _database = new MssqlDatabaseService(); private readonly MssqlDatabaseService _database = new MssqlDatabaseService();
private readonly MockMeasurer _measurer = new MockMeasurer(); private readonly MockMeasurer _measurer = new MockMeasurer();
private readonly MemoryReaderService _memoryReader = new MemoryReaderService();
private MeasurementLimits _limits = new MeasurementLimits(); private MeasurementLimits _limits = new MeasurementLimits();
private readonly Housing.Login.StartupLoginWindowResult _loginInfo; private Housing.Login.StartupLoginWindowResult _loginInfo;
public MainWindow() : this(new Housing.Login.StartupLoginWindowResult { Operator = "SYSTEM", Model = "DEFAULT", LineNo = "DEFAULT" }) public MainWindow()
{
}
public MainWindow(Housing.Login.StartupLoginWindowResult loginResult)
{ {
InitializeComponent(); InitializeComponent();
_loginInfo = loginResult ?? new Housing.Login.StartupLoginWindowResult { Operator = "SYSTEM", Model = "DEFAULT", LineNo = "DEFAULT" }; _loginInfo = new Housing.Login.StartupLoginWindowResult { Operator = "---", Model = "---", LineNo = "---" };
InitializeTimer(); InitializeTimer();
InitializeClock(); InitializeClock();
@ -40,10 +37,13 @@ namespace marking_gui
private void DisplayLoginInfo() private void DisplayLoginInfo()
{ {
if (txtLoginInfo != null) if (txtOperatorInfo != null)
{ {
txtLoginInfo.Text = string.Format("[작업자: {0} | 모델: {1} | 라인: {2}]", txtOperatorInfo.Text = string.Format("[작업자: {0}]", _loginInfo.Operator);
_loginInfo.Operator, }
if (txtModelLineInfo != null)
{
txtModelLineInfo.Text = string.Format("[모델: {0} | 라인: {1}]",
string.IsNullOrEmpty(_loginInfo.Model) ? "N/A" : _loginInfo.Model, string.IsNullOrEmpty(_loginInfo.Model) ? "N/A" : _loginInfo.Model,
string.IsNullOrEmpty(_loginInfo.LineNo) ? "N/A" : _loginInfo.LineNo); string.IsNullOrEmpty(_loginInfo.LineNo) ? "N/A" : _loginInfo.LineNo);
} }
@ -104,9 +104,9 @@ namespace marking_gui
txtPrevEol.Text = "대기"; txtPrevEol.Text = "대기";
txtPrevEol.Foreground = new SolidColorBrush(Color.FromRgb(156, 163, 175)); txtPrevEol.Foreground = new SolidColorBrush(Color.FromRgb(156, 163, 175));
txtVoltage.Text = "---.-"; txtVoltage.Text = "-.--";
txtVoltage.Foreground = new SolidColorBrush(Color.FromRgb(31, 41, 55)); txtVoltage.Foreground = new SolidColorBrush(Color.FromRgb(31, 41, 55));
txtCurrent.Text = "--.-"; txtCurrent.Text = "-.--";
txtCurrent.Foreground = new SolidColorBrush(Color.FromRgb(31, 41, 55)); txtCurrent.Foreground = new SolidColorBrush(Color.FromRgb(31, 41, 55));
txtFinalResult.Text = "대 기 중"; txtFinalResult.Text = "대 기 중";
@ -114,30 +114,40 @@ namespace marking_gui
borderFinalResult.Background = new SolidColorBrush(Color.FromRgb(229, 231, 235)); // Light Gray borderFinalResult.Background = new SolidColorBrush(Color.FromRgb(229, 231, 235)); // Light Gray
txtFinalSerial.Text = "S/N: ---"; txtFinalSerial.Text = "S/N: ---";
btnStart.IsEnabled = false; btnStart.IsEnabled = true;
} }
// 시리얼 텍스트 박스 포커스 이벤트
private void txtSerial_GotFocus(object sender, RoutedEventArgs e)
// 스타트 버튼 클릭
private void btnStart_Click(object sender, RoutedEventArgs e)
{
// 새로운 검사 진행을 위해 UI 상태를 초기화
ResetUI();
// 1. 메모리에서 S/N 자동 획득
string serial = "";
try
{ {
txtSerial.SelectAll(); serial = _memoryReader.ReadSerialNumber();
} }
catch (Exception ex)
// S/N 조회 버튼 클릭
private void btnSearchSerial_Click(object sender, RoutedEventArgs e)
{ {
string serial = txtSerial.Text.Trim().ToUpper(); MessageBox.Show("메모리에서 S/N을 읽는 중 오류가 발생했습니다: " + ex.Message, "오류", MessageBoxButton.OK, MessageBoxImage.Error);
return;
}
if (string.IsNullOrEmpty(serial)) if (string.IsNullOrEmpty(serial))
{ {
MessageBox.Show("S/N을 입력해주세요.", "알림", MessageBoxButton.OK, MessageBoxImage.Warning); MessageBox.Show("메모리에서 유효한 S/N을 읽지 못했습니다.", "경고", MessageBoxButton.OK, MessageBoxImage.Warning);
return; return;
} }
ResetUI(); // UI에 S/N 표시
txtSerial.Text = serial;
txtFinalSerial.Text = "S/N: " + serial; txtFinalSerial.Text = "S/N: " + serial;
// 데이터베이스 서비스 조회 호출 (예외 방어 처리) // 2. DB에서 이전 결과값 확인
Product product = null; Product product = null;
try try
{ {
@ -169,15 +179,8 @@ namespace marking_gui
? new SolidColorBrush(Color.FromRgb(16, 185, 129)) ? new SolidColorBrush(Color.FromRgb(16, 185, 129))
: new SolidColorBrush(Color.FromRgb(239, 68, 68)); : new SolidColorBrush(Color.FromRgb(239, 68, 68));
if (product.IsPreviousStepsPassed) // 3. 불합격 존재 시 즉시 팝업 창 출력 및 진행 불가 표시 후 중단
{ if (!product.IsPreviousStepsPassed)
txtSystemStatus.Text = "상태: 검사 가능 (이전 단계 합격)";
txtSystemStatus.Foreground = new SolidColorBrush(Color.FromRgb(16, 185, 129));
// 스타트 버튼 활성화
btnStart.IsEnabled = true;
}
else
{ {
string failedStep = string.Empty; string failedStep = string.Empty;
if (product.HousingResult == "FAIL") failedStep = "Housing 검사"; if (product.HousingResult == "FAIL") failedStep = "Housing 검사";
@ -187,32 +190,12 @@ namespace marking_gui
txtSystemStatus.Text = "상태: 진행 불가 (이전 단계 불합격)"; txtSystemStatus.Text = "상태: 진행 불가 (이전 단계 불합격)";
txtSystemStatus.Foreground = new SolidColorBrush(Color.FromRgb(239, 68, 68)); txtSystemStatus.Foreground = new SolidColorBrush(Color.FromRgb(239, 68, 68));
// 스타트 버튼 비활성화
btnStart.IsEnabled = false;
MessageBox.Show(string.Format("이전 공정 단계({0})가 불합격 상태이므로 최종 성능 검사를 시작할 수 없습니다.", failedStep), "검사 제한", MessageBoxButton.OK, MessageBoxImage.Error); MessageBox.Show(string.Format("이전 공정 단계({0})가 불합격 상태이므로 최종 성능 검사를 시작할 수 없습니다.", failedStep), "검사 제한", MessageBoxButton.OK, MessageBoxImage.Error);
} return;
}
else
{
MessageBox.Show("등록되지 않은 S/N입니다.\n테스트용 S/N(PASS1234 또는 FAIL5678)을 입력해 주세요.", "조회 실패", MessageBoxButton.OK, MessageBoxImage.Information);
}
}
// 엔터 키 입력 시 조회 처리
private void txtSerial_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
if (e.Key == System.Windows.Input.Key.Enter)
{
btnSearchSerial_Click(sender, e);
}
} }
// 스타트 버튼 클릭 // 4. 모두 합격(PASS) 시 자동으로 최종 성능 검사(타이머) 진행
private void btnStart_Click(object sender, RoutedEventArgs e)
{
btnStart.IsEnabled = false; btnStart.IsEnabled = false;
btnSearchSerial.IsEnabled = false;
txtSerial.IsEnabled = false; txtSerial.IsEnabled = false;
txtSystemStatus.Text = "상태: 검사 진행 중..."; txtSystemStatus.Text = "상태: 검사 진행 중...";
@ -226,6 +209,26 @@ namespace marking_gui
_timerTickCount = 0; _timerTickCount = 0;
_measurementTimer.Start(); _measurementTimer.Start();
} }
else
{
// 등록되지 않은 S/N일 경우, UI의 이전 결과 상태는 대기로 리셋하고 팝업 안내
txtPrevHousing.Text = "대기";
txtPrevHousing.Foreground = new SolidColorBrush(Color.FromRgb(156, 163, 175));
txtPrevCal.Text = "대기";
txtPrevCal.Foreground = new SolidColorBrush(Color.FromRgb(156, 163, 175));
txtPrevEol.Text = "대기";
txtPrevEol.Foreground = new SolidColorBrush(Color.FromRgb(156, 163, 175));
txtSystemStatus.Text = "상태: 미등록 제품";
txtSystemStatus.Foreground = new SolidColorBrush(Color.FromRgb(239, 68, 68));
MessageBox.Show("등록되지 않은 S/N입니다.\n데모 모드 시나리오가 순환됩니다. 다시 시도해 주세요.", "조회 실패", MessageBoxButton.OK, MessageBoxImage.Information);
// 대기 상태로 복구
txtSystemStatus.Text = "상태: 대기 중";
txtSystemStatus.Foreground = new SolidColorBrush(Color.FromRgb(156, 163, 175));
}
}
// 타이머 틱 이벤트 (측정값 변화 시뮬레이션) // 타이머 틱 이벤트 (측정값 변화 시뮬레이션)
private void MeasurementTimer_Tick(object sender, EventArgs e) private void MeasurementTimer_Tick(object sender, EventArgs e)
@ -237,8 +240,8 @@ namespace marking_gui
double tempVoltage, tempCurrent; double tempVoltage, tempCurrent;
_measurer.GenerateNoiseValues(_limits, out tempVoltage, out tempCurrent); _measurer.GenerateNoiseValues(_limits, out tempVoltage, out tempCurrent);
txtVoltage.Text = tempVoltage.ToString("F1"); txtVoltage.Text = tempVoltage.ToString("F2");
txtCurrent.Text = tempCurrent.ToString("F1"); txtCurrent.Text = tempCurrent.ToString("F2");
} }
else // 최종 측정 완료 및 판정 else // 최종 측정 완료 및 판정
{ {
@ -247,8 +250,8 @@ namespace marking_gui
double finalVoltage, finalCurrent; double finalVoltage, finalCurrent;
_measurer.GenerateFinalValues(_limits, out finalVoltage, out finalCurrent); _measurer.GenerateFinalValues(_limits, out finalVoltage, out finalCurrent);
txtVoltage.Text = finalVoltage.ToString("F1"); txtVoltage.Text = finalVoltage.ToString("F2");
txtCurrent.Text = finalCurrent.ToString("F1"); txtCurrent.Text = finalCurrent.ToString("F2");
// 합/불 판정 // 합/불 판정
bool isVoltageOk = finalVoltage >= _limits.MinVoltage && finalVoltage <= _limits.MaxVoltage; bool isVoltageOk = finalVoltage >= _limits.MinVoltage && finalVoltage <= _limits.MaxVoltage;
@ -278,11 +281,64 @@ namespace marking_gui
borderFinalResult.Background = new SolidColorBrush(Color.FromRgb(254, 226, 226)); // Light Red borderFinalResult.Background = new SolidColorBrush(Color.FromRgb(254, 226, 226)); // Light Red
} }
// 데이터베이스에 최종 검사 결과 저장 (소수점 2자리 반올림 포맷 반영)
try
{
string serial = txtSerial.Text.Trim();
_database.SaveProductResult(serial, finalVoltage, finalCurrent, isFinalPass ? "PASS" : "FAIL");
// 합격 판정 시 최종 SUCCESS 신호 전달 시뮬레이션
if (isFinalPass)
{
System.Diagnostics.Debug.WriteLine(string.Format("[설비 통신] S/N: {0} | 최종 SUCCESS 신호를 외부 메모리에 전달했습니다.", serial));
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine("DB 결과 저장 중 예외 발생: " + ex.Message);
}
// 컨트롤 원상 복구 (재검사를 위해) // 컨트롤 원상 복구 (재검사를 위해)
btnSearchSerial.IsEnabled = true;
txtSerial.IsEnabled = true; txtSerial.IsEnabled = true;
btnStart.IsEnabled = true; btnStart.IsEnabled = true;
} }
} }
// 화면 렌더링 완료 시 최초 로그인 팝업 구동
private void Window_ContentRendered(object sender, EventArgs e)
{
ShowLoginPopup();
}
// 공통 로그인 팝업 처리
private void ShowLoginPopup()
{
var loginWindow = new Housing.Login.StartupLoginWindow();
loginWindow.Owner = this; // 메인 윈도우 중앙 위에 표시되도록 Owner 지정
if (loginWindow.ShowDialog() == true)
{
_loginInfo = loginWindow.Result;
DisplayLoginInfo();
ResetUI();
}
else
{
// 로그인 창 닫거나 취소 시 프로그램 종료
Application.Current.Shutdown();
}
}
// 로그아웃 버튼 클릭 핸들러
private void btnLogout_Click(object sender, RoutedEventArgs e)
{
// 로그인 정보 클리어
_loginInfo = new Housing.Login.StartupLoginWindowResult { Operator = "---", Model = "---", LineNo = "---" };
DisplayLoginInfo();
ResetUI();
// 로그인 화면 다시 팝업
ShowLoginPopup();
}
} }
} }

33
marking_gui/Services/MemoryReaderService.cs

@ -0,0 +1,33 @@
using System;
namespace marking_gui.Services
{
/// <summary>
/// 데모 모드용 메모리 읽기 서비스
/// </summary>
public class MemoryReaderService
{
private static int _callCount = 0;
/// <summary>
/// 메모리에서 S/N를 자동으로 읽어옵니다. (데모 모드로 순환 반환)
/// 1회차: PASS1234 (이전 공정 모두 PASS)
/// 2회차: FAIL5678 (이전 공정 FAIL 존재)
/// 3회차: UNKNOWN999 (미등록 S/N)
/// </summary>
public string ReadSerialNumber()
{
_callCount++;
switch (_callCount % 3)
{
case 1:
return "PASS1234";
case 2:
return "FAIL5678";
default:
return "UNKNOWN999";
}
}
}
}

36
marking_gui/Services/MssqlDatabaseService.cs

@ -59,5 +59,41 @@ namespace marking_gui.Services
return null; return null;
} }
/// <summary>
/// 최종 성능 검출 값을 데이터베이스에 저장합니다.
/// 전압과 전류 수치는 3,2 포맷(DECIMAL(3, 2) 등)에 대응하기 위해 소수점 이하 2자리로 반올림하여 처리합니다.
/// </summary>
public bool SaveProductResult(string serial, double voltage, double current, string result)
{
// 전압과 전류를 소수점 이하 2자리(3,2 포맷 규격)로 반올림 처리
decimal roundedVoltage = Math.Round((decimal)voltage, 2);
decimal roundedCurrent = Math.Round((decimal)current, 2);
// TODO: 실제 MSSQL DB 적재를 위해 SQL 명령문 구현 템플릿 준비
/*
string query = "INSERT INTO ProductResults (SerialNumber, Voltage, Current, FinalResult, TestTime) VALUES (@Serial, @Voltage, @Current, @Result, GETDATE())";
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("@Result", result);
conn.Open();
cmd.ExecuteNonQuery();
}
}
*/
// 데모 단계 로그 출력 및 성공 반환
System.Diagnostics.Debug.WriteLine(string.Format("[DB 저장 로그] S/N: {0} | 전압: {1:F2}V | 전류: {2:F2}A | 결과: {3}",
serial, roundedVoltage, roundedCurrent, result));
return true;
}
} }
} }

BIN
marking_gui/bin/Debug/marking_gui.exe

Binary file not shown.

BIN
marking_gui/bin/Debug/marking_gui.pdb

Binary file not shown.

1
marking_gui/marking_gui.csproj

@ -88,6 +88,7 @@
<Compile Include="Models\MeasurementLimits.cs" /> <Compile Include="Models\MeasurementLimits.cs" />
<Compile Include="Services\MssqlDatabaseService.cs" /> <Compile Include="Services\MssqlDatabaseService.cs" />
<Compile Include="Services\MockMeasurer.cs" /> <Compile Include="Services\MockMeasurer.cs" />
<Compile Include="Services\MemoryReaderService.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs"> <Compile Include="Properties\AssemblyInfo.cs">

BIN
marking_gui/obj/Debug/App.baml

Binary file not shown.

2
marking_gui/obj/Debug/App.g.cs

@ -1,4 +1,4 @@
#pragma checksum "..\..\App.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "A61411B8AB14958BA568EF114F2A2F2B2CD0F100D1BBE3D75A4D0A5950AA97F0" #pragma checksum "..\..\App.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "7901E81250AFB6085C580D5F91E3114E104640F12456214E674506A1451A61E4"
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다. // 이 코드는 도구를 사용하여 생성되었습니다.

2
marking_gui/obj/Debug/App.g.i.cs

@ -1,4 +1,4 @@
#pragma checksum "..\..\App.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "A61411B8AB14958BA568EF114F2A2F2B2CD0F100D1BBE3D75A4D0A5950AA97F0" #pragma checksum "..\..\App.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "7901E81250AFB6085C580D5F91E3114E104640F12456214E674506A1451A61E4"
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다. // 이 코드는 도구를 사용하여 생성되었습니다.

BIN
marking_gui/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache

Binary file not shown.

BIN
marking_gui/obj/Debug/MainWindow.baml

Binary file not shown.

115
marking_gui/obj/Debug/MainWindow.g.cs

@ -1,4 +1,4 @@
#pragma checksum "..\..\MainWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "91D3EFB5F855ECB843447939E03D0FB956CA4155D34ABB2AD6ECC0C1038A3CB3" #pragma checksum "..\..\MainWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "4CDD2CF11DE0113F519A2E056CC537A47D29160F4556FDA78FE0307C695D33F2"
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다. // 이 코드는 도구를 사용하여 생성되었습니다.
@ -41,47 +41,55 @@ namespace marking_gui {
public partial class MainWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { public partial class MainWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
#line 105 "..\..\MainWindow.xaml" #line 138 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtLoginInfo; internal System.Windows.Controls.TextBlock txtCurrentTime;
#line default #line default
#line hidden #line hidden
#line 108 "..\..\MainWindow.xaml" #line 139 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtCurrentTime; internal System.Windows.Controls.TextBlock txtSystemStatus;
#line default #line default
#line hidden #line hidden
#line 109 "..\..\MainWindow.xaml" #line 142 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtSystemStatus; internal System.Windows.Controls.TextBlock txtOperatorInfo;
#line default #line default
#line hidden #line hidden
#line 139 "..\..\MainWindow.xaml" #line 143 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtSerial; internal System.Windows.Controls.TextBlock txtModelLineInfo;
#line default #line default
#line hidden #line hidden
#line 141 "..\..\MainWindow.xaml" #line 144 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnSearchSerial; internal System.Windows.Controls.Button btnLogout;
#line default
#line hidden
#line 169 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtSerial;
#line default #line default
#line hidden #line hidden
#line 172 "..\..\MainWindow.xaml" #line 200 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtPrevHousing; internal System.Windows.Controls.TextBlock txtPrevHousing;
@ -89,7 +97,7 @@ namespace marking_gui {
#line hidden #line hidden
#line 183 "..\..\MainWindow.xaml" #line 211 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtPrevCal; internal System.Windows.Controls.TextBlock txtPrevCal;
@ -97,7 +105,7 @@ namespace marking_gui {
#line hidden #line hidden
#line 194 "..\..\MainWindow.xaml" #line 222 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtPrevEol; internal System.Windows.Controls.TextBlock txtPrevEol;
@ -105,7 +113,7 @@ namespace marking_gui {
#line hidden #line hidden
#line 228 "..\..\MainWindow.xaml" #line 256 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtVoltage; internal System.Windows.Controls.TextBlock txtVoltage;
@ -113,7 +121,7 @@ namespace marking_gui {
#line hidden #line hidden
#line 232 "..\..\MainWindow.xaml" #line 260 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtVoltageRangeGuide; internal System.Windows.Controls.TextBlock txtVoltageRangeGuide;
@ -121,7 +129,7 @@ namespace marking_gui {
#line hidden #line hidden
#line 247 "..\..\MainWindow.xaml" #line 275 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtCurrent; internal System.Windows.Controls.TextBlock txtCurrent;
@ -129,7 +137,7 @@ namespace marking_gui {
#line hidden #line hidden
#line 251 "..\..\MainWindow.xaml" #line 279 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtCurrentRangeGuide; internal System.Windows.Controls.TextBlock txtCurrentRangeGuide;
@ -137,7 +145,7 @@ namespace marking_gui {
#line hidden #line hidden
#line 257 "..\..\MainWindow.xaml" #line 285 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Border borderFinalResult; internal System.Windows.Controls.Border borderFinalResult;
@ -145,7 +153,7 @@ namespace marking_gui {
#line hidden #line hidden
#line 266 "..\..\MainWindow.xaml" #line 294 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtFinalResult; internal System.Windows.Controls.TextBlock txtFinalResult;
@ -153,7 +161,7 @@ namespace marking_gui {
#line hidden #line hidden
#line 267 "..\..\MainWindow.xaml" #line 295 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtFinalSerial; internal System.Windows.Controls.TextBlock txtFinalSerial;
@ -161,7 +169,7 @@ namespace marking_gui {
#line hidden #line hidden
#line 277 "..\..\MainWindow.xaml" #line 305 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnStart; internal System.Windows.Controls.Button btnStart;
@ -169,7 +177,7 @@ namespace marking_gui {
#line hidden #line hidden
#line 286 "..\..\MainWindow.xaml" #line 314 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnOpenSettings; internal System.Windows.Controls.Button btnOpenSettings;
@ -207,7 +215,12 @@ namespace marking_gui {
switch (connectionId) switch (connectionId)
{ {
case 1: case 1:
this.txtLoginInfo = ((System.Windows.Controls.TextBlock)(target));
#line 11 "..\..\MainWindow.xaml"
((marking_gui.MainWindow)(target)).ContentRendered += new System.EventHandler(this.Window_ContentRendered);
#line default
#line hidden
return; return;
case 2: case 2:
this.txtCurrentTime = ((System.Windows.Controls.TextBlock)(target)); this.txtCurrentTime = ((System.Windows.Controls.TextBlock)(target));
@ -216,72 +229,66 @@ namespace marking_gui {
this.txtSystemStatus = ((System.Windows.Controls.TextBlock)(target)); this.txtSystemStatus = ((System.Windows.Controls.TextBlock)(target));
return; return;
case 4: case 4:
this.txtSerial = ((System.Windows.Controls.TextBox)(target)); this.txtOperatorInfo = ((System.Windows.Controls.TextBlock)(target));
#line 140 "..\..\MainWindow.xaml"
this.txtSerial.GotFocus += new System.Windows.RoutedEventHandler(this.txtSerial_GotFocus);
#line default
#line hidden
#line 140 "..\..\MainWindow.xaml"
this.txtSerial.KeyDown += new System.Windows.Input.KeyEventHandler(this.txtSerial_KeyDown);
#line default
#line hidden
return; return;
case 5: case 5:
this.btnSearchSerial = ((System.Windows.Controls.Button)(target)); this.txtModelLineInfo = ((System.Windows.Controls.TextBlock)(target));
return;
case 6:
this.btnLogout = ((System.Windows.Controls.Button)(target));
#line 141 "..\..\MainWindow.xaml" #line 144 "..\..\MainWindow.xaml"
this.btnSearchSerial.Click += new System.Windows.RoutedEventHandler(this.btnSearchSerial_Click); this.btnLogout.Click += new System.Windows.RoutedEventHandler(this.btnLogout_Click);
#line default #line default
#line hidden #line hidden
return; return;
case 6: case 7:
this.txtSerial = ((System.Windows.Controls.TextBox)(target));
return;
case 8:
this.txtPrevHousing = ((System.Windows.Controls.TextBlock)(target)); this.txtPrevHousing = ((System.Windows.Controls.TextBlock)(target));
return; return;
case 7: case 9:
this.txtPrevCal = ((System.Windows.Controls.TextBlock)(target)); this.txtPrevCal = ((System.Windows.Controls.TextBlock)(target));
return; return;
case 8: case 10:
this.txtPrevEol = ((System.Windows.Controls.TextBlock)(target)); this.txtPrevEol = ((System.Windows.Controls.TextBlock)(target));
return; return;
case 9: case 11:
this.txtVoltage = ((System.Windows.Controls.TextBlock)(target)); this.txtVoltage = ((System.Windows.Controls.TextBlock)(target));
return; return;
case 10: case 12:
this.txtVoltageRangeGuide = ((System.Windows.Controls.TextBlock)(target)); this.txtVoltageRangeGuide = ((System.Windows.Controls.TextBlock)(target));
return; return;
case 11: case 13:
this.txtCurrent = ((System.Windows.Controls.TextBlock)(target)); this.txtCurrent = ((System.Windows.Controls.TextBlock)(target));
return; return;
case 12: case 14:
this.txtCurrentRangeGuide = ((System.Windows.Controls.TextBlock)(target)); this.txtCurrentRangeGuide = ((System.Windows.Controls.TextBlock)(target));
return; return;
case 13: case 15:
this.borderFinalResult = ((System.Windows.Controls.Border)(target)); this.borderFinalResult = ((System.Windows.Controls.Border)(target));
return; return;
case 14: case 16:
this.txtFinalResult = ((System.Windows.Controls.TextBlock)(target)); this.txtFinalResult = ((System.Windows.Controls.TextBlock)(target));
return; return;
case 15: case 17:
this.txtFinalSerial = ((System.Windows.Controls.TextBlock)(target)); this.txtFinalSerial = ((System.Windows.Controls.TextBlock)(target));
return; return;
case 16: case 18:
this.btnStart = ((System.Windows.Controls.Button)(target)); this.btnStart = ((System.Windows.Controls.Button)(target));
#line 278 "..\..\MainWindow.xaml" #line 306 "..\..\MainWindow.xaml"
this.btnStart.Click += new System.Windows.RoutedEventHandler(this.btnStart_Click); this.btnStart.Click += new System.Windows.RoutedEventHandler(this.btnStart_Click);
#line default #line default
#line hidden #line hidden
return; return;
case 17: case 19:
this.btnOpenSettings = ((System.Windows.Controls.Button)(target)); this.btnOpenSettings = ((System.Windows.Controls.Button)(target));
#line 287 "..\..\MainWindow.xaml" #line 315 "..\..\MainWindow.xaml"
this.btnOpenSettings.Click += new System.Windows.RoutedEventHandler(this.btnOpenSettings_Click); this.btnOpenSettings.Click += new System.Windows.RoutedEventHandler(this.btnOpenSettings_Click);
#line default #line default

14
marking_gui/obj/Debug/MainWindow.g.i.cs

@ -1,4 +1,4 @@
#pragma checksum "..\..\MainWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "91D3EFB5F855ECB843447939E03D0FB956CA4155D34ABB2AD6ECC0C1038A3CB3" #pragma checksum "..\..\MainWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "8EE9B0D077C65F0A6ECE7B0CF99EADE8D3584BEB5C5ACE53A6444D7C659E9A91"
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다. // 이 코드는 도구를 사용하여 생성되었습니다.
@ -217,18 +217,6 @@ namespace marking_gui {
return; return;
case 4: case 4:
this.txtSerial = ((System.Windows.Controls.TextBox)(target)); this.txtSerial = ((System.Windows.Controls.TextBox)(target));
#line 140 "..\..\MainWindow.xaml"
this.txtSerial.GotFocus += new System.Windows.RoutedEventHandler(this.txtSerial_GotFocus);
#line default
#line hidden
#line 140 "..\..\MainWindow.xaml"
this.txtSerial.KeyDown += new System.Windows.Input.KeyEventHandler(this.txtSerial_KeyDown);
#line default
#line hidden
return; return;
case 5: case 5:
this.btnSearchSerial = ((System.Windows.Controls.Button)(target)); this.btnSearchSerial = ((System.Windows.Controls.Button)(target));

BIN
marking_gui/obj/Debug/SettingsWindow.baml

Binary file not shown.

2
marking_gui/obj/Debug/SettingsWindow.g.cs

@ -1,4 +1,4 @@
#pragma checksum "..\..\SettingsWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "AC6538A2C0A00B7969947C0D3443BD3193841A2C8C686CCFDFA02EC6FBBC00CD" #pragma checksum "..\..\SettingsWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "33961FE01569FF3D7FDD670A40AE2AB5450B6E4881EBA8EABD242BBB6EA0F36D"
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다. // 이 코드는 도구를 사용하여 생성되었습니다.

2
marking_gui/obj/Debug/SettingsWindow.g.i.cs

@ -1,4 +1,4 @@
#pragma checksum "..\..\SettingsWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "AC6538A2C0A00B7969947C0D3443BD3193841A2C8C686CCFDFA02EC6FBBC00CD" #pragma checksum "..\..\SettingsWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "33961FE01569FF3D7FDD670A40AE2AB5450B6E4881EBA8EABD242BBB6EA0F36D"
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다. // 이 코드는 도구를 사용하여 생성되었습니다.

BIN
marking_gui/obj/Debug/StartupLoginWindow.baml

Binary file not shown.

2
marking_gui/obj/Debug/StartupLoginWindow.g.cs

@ -1,4 +1,4 @@
#pragma checksum "..\..\StartupLoginWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "18F783C1E7444D1DAC0CC2289DBE06704F900E72532F317934C31FA36062A944" #pragma checksum "..\..\StartupLoginWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "79E8A6E048755DAD2C14DA7C41DFC6A5FC9DE46DE190A1192894F5DCFCB3E54D"
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다. // 이 코드는 도구를 사용하여 생성되었습니다.

2
marking_gui/obj/Debug/StartupLoginWindow.g.i.cs

@ -1,4 +1,4 @@
#pragma checksum "..\..\StartupLoginWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "18F783C1E7444D1DAC0CC2289DBE06704F900E72532F317934C31FA36062A944" #pragma checksum "..\..\StartupLoginWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "79E8A6E048755DAD2C14DA7C41DFC6A5FC9DE46DE190A1192894F5DCFCB3E54D"
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다. // 이 코드는 도구를 사용하여 생성되었습니다.

BIN
marking_gui/obj/Debug/marking_gui.csproj.AssemblyReference.cache

Binary file not shown.

2
marking_gui/obj/Debug/marking_gui.csproj.CoreCompileInputs.cache

@ -1 +1 @@
982128101b0badcfbf7c93653177ef0ec5346dc5c76459cb5549ee27de8385af ec6dd6e1649354a88820f29fa99f449377f51e4d5e8d8707b3c7326a682c80e1

1
marking_gui/obj/Debug/marking_gui.csproj.FileListAbsolute.txt

@ -37,3 +37,4 @@ C:\Users\wjddn\Desktop\amosense\marking_gui\marking_gui\obj\Debug\marking_gui.cs
C:\Users\wjddn\Desktop\amosense\marking_gui\marking_gui\obj\Debug\marking_gui.exe C:\Users\wjddn\Desktop\amosense\marking_gui\marking_gui\obj\Debug\marking_gui.exe
C:\Users\wjddn\Desktop\amosense\marking_gui\marking_gui\obj\Debug\marking_gui.pdb C:\Users\wjddn\Desktop\amosense\marking_gui\marking_gui\obj\Debug\marking_gui.pdb
C:\Users\wjddn\Desktop\amosense\marking_gui\marking_gui\obj\Debug\App.baml C:\Users\wjddn\Desktop\amosense\marking_gui\marking_gui\obj\Debug\App.baml
C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\obj\Debug\App.baml

BIN
marking_gui/obj/Debug/marking_gui.csproj.GenerateResource.cache

Binary file not shown.

BIN
marking_gui/obj/Debug/marking_gui.exe

Binary file not shown.

BIN
marking_gui/obj/Debug/marking_gui.g.resources

Binary file not shown.

BIN
marking_gui/obj/Debug/marking_gui.pdb

Binary file not shown.

10
marking_gui/obj/Debug/marking_gui_MarkupCompile.cache

@ -4,16 +4,16 @@
winexe winexe
C# C#
.cs .cs
C:\Users\wjddn\Desktop\amosense\marking_gui\marking_gui\obj\Debug\ C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\obj\Debug\
marking_gui marking_gui
none none
false false
DEBUG;TRACE DEBUG;TRACE
C:\Users\wjddn\Desktop\amosense\marking_gui\marking_gui\App.xaml C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\App.xaml
3-1210742192 31238780151
11-2023606741 12-1027158311
14-207034072 141066371409
MainWindow.xaml;SettingsWindow.xaml;StartupLoginWindow.xaml; MainWindow.xaml;SettingsWindow.xaml;StartupLoginWindow.xaml;
False False

2
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 C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\App.xaml
3-1210742192 3-1210742192
12189271937 13735417974
14-207034072 14-207034072
MainWindow.xaml;SettingsWindow.xaml;StartupLoginWindow.xaml; MainWindow.xaml;SettingsWindow.xaml;StartupLoginWindow.xaml;

2
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;; FC:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\MainWindow.xaml;;

4
marking_gui/obj/Debug/marking_gui_MarkupCompile.lref

@ -1,4 +1,4 @@
 
FC:\Users\wjddn\Desktop\amosense\marking_gui\marking_gui\App.xaml;; FC:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\App.xaml;;
FC:\Users\wjddn\Desktop\amosense\marking_gui\marking_gui\MainWindow.xaml;; FC:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\MainWindow.xaml;;

142
program_flow.md

@ -1,153 +1,95 @@
# 양산형 테스트 기기 모니터링 시스템 사용자 설명서 (User Manual) # 양산형 테스트 기기 모니터링 시스템 사용자 설명서 (User Manual)
본 문서는 **양산형 테스트 기기 모니터링 시스템**을 사용하는 작업자 및 검사자를 위한 운영 설명서입니다. 프로그램의 시작부터 제품 조회, 성능 검사 수행, 판정 기준 설정까지 내부 프로그램 코드를 몰라도 누구나 쉽게 작동법을 이해할 수 있도록 사용자 화면 관점에서 기술되었습니다. 본 문서는 **양산형 테스트 기기 모니터링 시스템**을 사용하는 작업자 및 검사자를 위한 운영 설명서입니다. 프로그램의 시작부터 제품 조회, 성능 검사 수행, 판정 기준 설정까지 내부 프로그램 코드를 몰라도 누구나 쉽게 작동법을 이해할 수 있도록 사용자 화면 관점에서 기술되었습니다.
--- ---
## 1. 시스템 개요 (Introduction) ## 1. 시스템 개요 (Introduction)
본 시스템은 제조 라인의 최종 단계에서 제품의 전기적 성능(측정 전압 및 전류)을 검사하고 최종 합격/불합격 여부를 판정하는 모니터링 프로그램입니다. 본 시스템은 제조 라인의 최종 단계에서 제품의 전기적 성능(측정 전압 및 전류)을 검사하고 최종 합격/불합격 여부를 판정하는 모니터링 프로그램입니다.
- **이전 단계 확인:** 제품의 바코드(S/N)를 조회하여 이전 주요 공정(Housing, Calibration, EOL)을 모두 통과했는지 자동으로 검증합니다. - **이전 단계 확인:** 제품의 바코드(S/N)를 조회하여 이전 주요 공정(Housing, Calibration, EOL)을 모두 통과했는지 자동으로 검증합니다.
- **실시간 계측 및 판정:** 검사를 시작하면 전기적 신호가 측정되며, 설정된 범위 이내인 경우 최종 `PASS`(합격), 범위를 벗어나면 `FAIL`(불합격) 판정을 내립니다. - **실시간 계측 및 판정:** 검사를 시작하면 전기적 신호가 측정되며, 설정된 범위 이내인 경우 최종 `PASS`(합격), 범위를 벗어나면 `FAIL`(불합격) 판정을 내립니다.
- **파라미터 조율:** 생산 제품 사양에 맞춰 합격 판정 기준 범위(최소/최대 전압 및 전류)를 간편하게 변경할 수 있습니다. - **파라미터 조율:** 생산 제품 사양에 맞춰 합격 판정 기준 범위(최소/최대 전압 및 전류)를 간편하게 변경할 수 있습니다.
--- ---
## 2. 전체 동작 흐름도 (Operational Flow) ## 2. 전체 동작 흐름도 (Operational Flow)
검사자가 프로그램을 구동하여 최종 검사를 완료하기까지의 전체 프로세스는 다음과 같습니다. 검사자가 프로그램을 구동하여 최종 검사를 완료하기까지의 전체 프로세스는 다음과 같습니다.
```mermaid ```mermaid
graph TD graph TD
A([1. 프로그램 실행]) --> B[시작 설정 및 로그인 팝업] A([1. 프로그램 실행]) --> B[메인 모니터링 화면 기동]
B --> C{로그인 및 설정 완료?} B --> C[화면 중앙에 로그인 팝업 활성화]
C -- 취소/종료 --> D([프로그램 종료]) C --> D{로그인}
C -- 로그인 완료 클릭 --> E[메인 모니터링 화면 기동] D -- 취소/닫기 --> E([프로그램 종료])
E --> F[상단바에서 작업자 및 모델 정보 확인] D -- 로그인 성공 --> F[상단바 우측에 작업자/모델/라인 정보 표출 및 메인 활성화]
F --> G[S/N 입력 칸에 바코드 스캔 또는 직접 입력] F --> G[▶ 검사 시작 START 버튼 클릭]
G --> H[조회 버튼 클릭 또는 엔터 키 입력] G --> H[UI 화면 상태 및 측정 수치 -.-- 로 강제 초기화]
H --> I{이전 검사 결과 확인} H --> I[메모리로부터 S/N를 자동으로 읽어서 입력받음]
I -- 이전 단계 중 불합격 존재 --> J[경고 팝업 창 출력 및 진행 불가 표시] I --> J[데이터베이스에서 이전 검사 결과 조회]
J --> K[START 버튼 비활성화 상태 유지 -> 검사 불가] J --> K{이전 검사 결과 확인}
K --> G K -- 이전 단계 중 FAIL 불합격 존재 --> L[경고 팝업 창 출력 및 검사 중단]
I -- 이전 단계 모두 합격 PASS --> L[상태: 검사 가능 표시 및 START 버튼 활성화] L --> G
L --> M[▶ 검사 시작 START 버튼 클릭] K -- 이전 단계 모두 PASS 합격 --> M[자동으로 검사 시작 및 2초간 수치 측정]
M --> N[상태: 검사 진행 중 표시 및 수치 측정 시작] M --> N[측정 완료 및 최종값 소수점 둘째 자리 표시]
N --> O[전압/전류 계측값이 2초간 흔들리며 측정 동작 연출] N --> O{측정 전압/전류가 기준범위 이내인가?}
O --> P[측정 완료 및 최종값 표시] O -- 합격 범위 내 PASS --> P[대형 화면 PASS 표시 및 최종 합격 판정]
P --> Q{측정 전압/전류가 기준범위 이내인가?} O -- 범위 이탈 FAIL --> Q[대형 화면 FAIL 표시 및 최종 불합격 판정]
Q -- 합격 범위 내 --> R[대형 화면에 PASS 녹색 표시 및 합격 판정] P --> R[데이터베이스에 측정값 3,2 포맷팅 반올림 및 PASS 저장]
Q -- 범위 이탈 --> S[대형 화면에 FAIL 적색 표시 및 불합격 판정] Q --> S[데이터베이스에 측정값 3,2 포맷팅 반올림 및 FAIL 저장]
R --> T[시스템 원상 복구 및 다음 제품 검사 대기] R --> T[최종 설비에 SUCCESS 신호 전달]
S --> T S --> U[시스템 대기 상태 복구 및 다음 검사 준비]
T --> G T --> U
U --> G
``` ```
--- ---
## 3. 상세 기능별 동작 가이드 ## 3. 상세 기능별 동작 가이드
### 3.1. 시스템 시작 설정 및 로그인 ### 3.1. 시스템 시작 설정 및 로그인
1. **프로그램 기동:** 프로그램을 켜면 메인 화면이 뜨기 전, **[시스템 시작 설정 & 로그인]** 화면이 화면 중앙에 먼저 나타납니다. 1. **메인 화면 로드 및 로그인 팝업:** 프로그램을 실행하면 백그라운드에 메인 모니터링 화면이 먼저 켜져서 깔리며, 그 위에 **[시스템 시작 설정 & 로그인]** 화면이 화면 정중앙에 팝업(모달) 형태로 활성화됩니다.
2. **설정값 기입:** 제조사, 모델명, 색상 코드, 라인 번호, LOT 번호, 지그 번호를 확인 및 기입하고, 담당 **작업자명**과 **비밀번호**를 입력합니다. (빠른 실행을 위해 테스트 계정 `test` / `test`가 미리 기입되어 있습니다.)
2. **설정값 기입:** 제조사, 모델명, 색상 코드, 라인 번호, LOT 번호, 지그 번호를 확인 및 기입하고, 담당 **작업자명**과 **비밀번호**를 입력합니다. 3. **팝업 취소 시 앱 종료:** 최초 로그인 시 창을 그냥 닫거나 취소를 누르면 프로그램 전체가 안전하게 종료됩니다.
4. **정보 연동 및 로그아웃:** 로그인이 완료되면 로그인 창이 닫히며 메인 화면 상단바 우측 영역에 `[작업자: test] [모델: MOBI-EV-01 | 라인: LINE-3]` 형태로 정돈되어 정보가 표시됩니다. 또한 바로 우측에 빨간색 **[로그아웃]** 버튼이 생성됩니다.
3. **빠른 테스트 실행 (테스트 계정):** - [로그아웃] 버튼을 클릭하면 현재 화면의 수치들이 초기화되고 로그인 팝업창이 다시 정중앙에 호출됩니다.
   - 검사 편의를 위해 작업자(`test`)와 비밀번호(`test`)가 미리 입력되어 있습니다.
   - 별도 수정 없이 곧바로 하단의 **[시스템 시작 및 로그인]** 단추를 누르면 로그인이 완료됩니다.
4. **정보 연동:** 로그인이 완료되면 로그인 창이 닫히고 메인 화면이 자동으로 최대화되어 열립니다. 메인 화면 좌측 상단바 영역에 입력했던 정보가 `[작업자: test | 모델: MOBI-EV-01 | 라인: LINE-3]` 형태로 상시 노출됩니다.
--- ---
### 3.2. 제품 조회 및 이전 공정 이력 검증 ### 3.2. 제품 조회 및 이전 공정 이력 검증
1. **S/N(시리얼 번호) 스캔:** 메인 화면 좌측의 **'S/N 입력'** 상자에 제품 바코드를 스캔하거나 입력합니다. (키보드의 엔터 키 또는 **[조회]** 버튼 클릭) 1. **검사 시작 및 UI 초기화:** [▶ 검사 시작 (START)] 버튼(기본 활성화 상태)을 클릭합니다. 클릭 즉시 이전 제품의 수치와 결과가 오인되는 것을 방지하기 위해 화면의 전압/전류 수치(`-.--`), 최종 판정(`대 기 중`), 이전 공정 단계(`대기`)가 깨끗이 초기화됩니다.
2. **메모리 자동 읽기:** UI 초기화가 끝나면 시스템은 메모리로부터 바코드(S/N) 정보를 자동으로 읽어와 `S/N 입력` 창에 자동으로 입력합니다. (조회 버튼은 완전히 제거되었으며 수동 입력을 거치지 않습니다.)
2. **이전 단계 확인:** 시스템이 이전 공정 단계들의 결과를 불러와 화면 좌측 **'이전 시험 단계 결과'** 표에 표시합니다. 3. **이전 단계 자동 검증:** 조회된 S/N으로 데이터베이스를 즉시 탐색하여 이전 공정 단계 결과를 확인합니다.
- **합격 제품 테스트 (S/N: `PASS1234`):** Housing, Calibration, EOL 단계가 모두 초록색 `PASS`로 채워지며, 별도 조작 대기 없이 **최종 성능 검사를 자동으로 바로 가동**합니다.
   - **합격 제품 테스트 (S/N: `PASS1234`):** Housing, Calibration, EOL 단계가 모두 초록색 `PASS`로 채워지며, 하단의 대형 **[▶ 검사 시작 (START)]** 버튼이 초록색으로 활성화되어 성능 검사를 수행할 수 있습니다. - **불합격 제품 테스트 (S/N: `FAIL5678`):** 이전 단계 중 실패한 항목이 빨간색 `FAIL`로 표시되며, 즉시 경고 팝업 창이 출력되고 검사 시작을 전면 차단합니다.
   - **불합격 제품 테스트 (S/N: `FAIL5678`):** 이전 단계 중 실패한 항목이 빨간색 `FAIL`로 표시되며, 경고 창이 나타납니다. 하단의 검사 시작 버튼은 비활성화되어 최종 검사 진행이 전면 차단됩니다.
--- ---
### 3.3. 최종 성능 검사 및 합불 판정 ### 3.3. 최종 성능 검사 및 합불 판정
1. **검사 시작:** 초록색으로 활성화된 **[▶ 검사 시작 (START)]** 버튼을 클릭합니다. 1. **자동 계측 시작:** 이전 공정 결과가 모두 합격인 경우, 상태창이 파란색 **'측정 중'**으로 자동 변경되고 전압 및 전류 측정 영역의 수치가 소수점 둘째 자리(`-.--`) 상태에서 약 2초간 흔들리며 측정 동작을 연출합니다.
2. **측정 완료 및 판정:** 2초가 지나면 측정이 끝나고 최종 검출된 전압과 전류 수치가 소수점 둘째 자리 포맷(`F2`)으로 화면에 표시됩니다.
2. **측정 중 상태 (2초간):** - 측정된 전압(디폴트 `4.00V ~ 6.00V`)과 전류(디폴트 `8.00A ~ 10.00A`)가 모두 가이드 범위 이내이면 대형 판정 영역이 초록색 배경의 **`PASS`**로 표시됩니다. 범위를 벗어날 경우 빨간색 배경의 **`FAIL`** 판정을 내립니다.
3. **데이터베이스 적재 (3,2 포맷팅):** 최종 판정이 이루어지는 순간, 측정된 전압과 전류 수치를 **소수점 이하 2자리(3,2 포맷에 대응)로 반올림 처리**하여 최종 판정 결과(PASS/FAIL) 및 S/N 정보와 함께 데이터베이스에 안전하게 기록합니다.
   - 검사가 시작되면 상태창이 파란색 **'측정 중'**으로 변경되고 전압 및 전류 측정 영역의 수치들이 약 2초간 측정됩니다. 4. **SUCCESS 완료 신호 전달:** 최종 합격(`PASS`) 판정 건에 한하여, 데이터베이스 저장이 끝난 후 외부 설비 제어기(PLC 등) 측 메모리에 **최종 SUCCESS 완료 신호**를 송신하여 제품 이동 및 라인 흐름을 자동 제어하도록 구성했습니다.
5. **자동 대기 복구:** 모든 저장 및 신호 전달 프로세스가 완료되면 시스템은 자동으로 대기 상태로 복구되어 다음 제품 검사를 진행할 준비를 마칩니다.
3. **최종 판정:**
   - 2초가 지나면 측정이 끝나고 최종 검출된 전압과 전류 수치가 화면에 고정됩니다.
   - **합격 (`PASS`):** 측정된 전압(디폴트 `4.0V ~ 6.0V`)과 전류(디폴트 `8.0A ~ 10.0A`)가 모두 가이드 범위 내에 도달하면 대형 판정 영역이 초록색 배경의 **`PASS`**로 갱신되며 최종 합격 판정이 완료됩니다.
   - **불합격 (`FAIL`):** 전압이나 전류 중 하나라도 기준 범위를 벗어나면 해당 측정 텍스트와 대형 판정 영역이 빨간색 배경의 **`FAIL`**로 변하여 경보를 나타냅니다.
   - 판정이 종료되면 시스템은 자동으로 대기 상태로 복구되어 다음 제품 검사를 진행할 준비를 마칩니다.
--- ---
### 3.4. 판정 기준 파라미터 설정 ### 3.4. 판정 기준 파라미터 설정
1. **설정창 열기:** 최하단 바 좌측에 있는 파란색 **[⚙ 파라미터 설정]** 버튼을 클릭합니다. 1. **설정창 열기:** 최하단 바 좌측에 있는 파란색 **[⚙ 파라미터 설정]** 버튼을 클릭합니다.
2. **기준값 수정:** 화면에 팝업창이 나타나며 전압의 최소/최대값 및 전류의 최소/최대 기준 범위를 키보드로 입력하여 수정할 수 있습니다. 2. **기준값 수정:** 화면에 팝업창이 나타나며 전압의 최소/최대값 및 전류의 최소/최대 기준 범위를 키보드로 입력하여 수정할 수 있습니다.
3. **유효성 체크 및 저장:** 3. **유효성 체크 및 저장:**
- 입력한 값은 음수여서는 안 되며, 최소값이 최대값보다 작아야 저장할 수 있습니다.
   - 입력한 값은 음수여서는 안 되며, 최소값이 최대값보다 작아야 저장할 수 있습니다. - **[저장]**을 누르면 변경 사항이 적용되며, 메인 화면 전압/전류 카드 하단에 표시되는 가이드 문구(`기준범위: X.XXV ~ Y.YYV`)가 실시간으로 자동 변경되어 즉시 새로운 판정 기준으로 적용됩니다.
   - **[저장]**을 누르면 변경 사항이 적용되며, 메인 화면 전압/전류 카드 하단에 표시되는 가이드 문구(`기준범위: X.XV ~ Y.YV`)가 실시간으로 자동 변경되어 즉시 새로운 판정 기준으로 적용됩니다.
--- ---
### 4. GUI ### 4. GUI
#### 메인 화면 #### 메인 화면
![[Pasted image 20260605142629.png]] ![[Pasted image 20260605142629.png]]

Loading…
Cancel
Save