From 2423aa27c3ddc8f0e1e0a07595f73ecfa83328d8 Mon Sep 17 00:00:00 2001 From: JF Date: Fri, 10 May 2019 16:47:43 -0400 Subject: [PATCH] Dev --- .../Microsoft/Windows/Caches/cversions.2.db | Bin 0 -> 16384 bytes ...C-3716689AF493}.2.ver0x0000000000000001.db | Bin 0 -> 191120 bytes ...8-1A9A39C3FDA2}.2.ver0x0000000000000001.db | Bin 0 -> 415096 bytes CableTestBench.pro.user | 2 +- Makefile | 2 +- Makefile.Debug | 32 ++- Makefile.Release | 32 ++- .../190510_164434_1S52CABLE_XX_NO_AA_BB.c.txt | 52 +++++ .../190510_164450_1S52CABLE_XX_NO_AA_BB.c.txt | 68 ++++++ Sources/AutomatedTestReport.cpp | 194 +++++++++++++++++- Sources/AutomatedTestReport.h | 39 +++- Sources/CableParametersData.cpp | 3 +- Sources/CableParametersData.h | 4 +- Sources/CableTestBench.cpp | 48 ++++- Sources/CableTestBench.h | 7 + Sources/CableTestBenchDefs.cpp | 5 +- Sources/CableTestBenchDefs.h | 1 + Sources/CableTestEngine.cpp | 88 ++++++-- Sources/CableTestEngine.h | 2 + Sources/CableTestPage.cpp | 64 +++++- Sources/CableTestPage.h | 6 + Sources/CableTestPage.ui | 98 +++++---- Sources/TestReport.cpp | 148 +++++++++++++ Sources/TestReport.h | 17 +- Sources/VisualInspectionResult.cpp | 21 +- Sources/VisualInspectionResult.h | 2 + object_script.CableTestBench.Debug | 1 + object_script.CableTestBench.Release | 1 + ui_CMainPage.h | 2 +- ui_CableTestPage.h | 36 +++- ui_OptionsPage.h | 2 +- ui_VisualInspectionPage.h | 2 +- 32 files changed, 876 insertions(+), 103 deletions(-) create mode 100644 %SystemDrive%/ProgramData/Microsoft/Windows/Caches/cversions.2.db create mode 100644 %SystemDrive%/ProgramData/Microsoft/Windows/Caches/{6AF0698E-D558-4F6E-9B3C-3716689AF493}.2.ver0x0000000000000001.db create mode 100644 %SystemDrive%/ProgramData/Microsoft/Windows/Caches/{DDF571F2-BE98-426D-8288-1A9A39C3FDA2}.2.ver0x0000000000000001.db create mode 100644 Rapports/190510_164434_1S52CABLE_XX_NO_AA_BB.c.txt create mode 100644 Rapports/190510_164450_1S52CABLE_XX_NO_AA_BB.c.txt diff --git a/%SystemDrive%/ProgramData/Microsoft/Windows/Caches/cversions.2.db b/%SystemDrive%/ProgramData/Microsoft/Windows/Caches/cversions.2.db new file mode 100644 index 0000000000000000000000000000000000000000..6493406c669cd7152ecc4d20552ffbb539807be1 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/%SystemDrive%/ProgramData/Microsoft/Windows/Caches/{DDF571F2-BE98-426D-8288-1A9A39C3FDA2}.2.ver0x0000000000000001.db b/%SystemDrive%/ProgramData/Microsoft/Windows/Caches/{DDF571F2-BE98-426D-8288-1A9A39C3FDA2}.2.ver0x0000000000000001.db new file mode 100644 index 0000000000000000000000000000000000000000..111d14743d9fbd86e7c2724fd7c40c1e1d73ae67 GIT binary patch literal 415096 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 lSFnZgyT1FWZ!NaHkDZcu4cF;ipL(CGzG - + ProjectExplorer.Project.ActiveTarget diff --git a/Makefile b/Makefile index 8d5242b..58177ff 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ ############################################################################# # Makefile for building: CableTestBench -# Generated by qmake (2.01a) (Qt 4.8.1) on: Wed May 8 14:10:10 2019 +# Generated by qmake (2.01a) (Qt 4.8.1) on: Fri May 10 14:02:01 2019 # Project: CableTestBench.pro # Template: app # Command: c:\Qt\4.8.1\bin\qmake.exe -spec ..\..\Qt\4.8.1\mkspecs\win32-g++ CONFIG+=declarative_debug -o Makefile CableTestBench.pro diff --git a/Makefile.Debug b/Makefile.Debug index bb838b9..4f83db7 100644 --- a/Makefile.Debug +++ b/Makefile.Debug @@ -1,6 +1,6 @@ ############################################################################# # Makefile for building: CableTestBench -# Generated by qmake (2.01a) (Qt 4.8.1) on: Wed May 8 14:10:10 2019 +# Generated by qmake (2.01a) (Qt 4.8.1) on: Fri May 10 14:02:01 2019 # Project: CableTestBench.pro # Template: app ############################################################################# @@ -71,6 +71,7 @@ SOURCES = Sources\MainWindow.cpp \ debug\moc_ConnectorClickZoneWidget.cpp \ debug\moc_ONOFFStatusWidget.cpp \ debug\moc_ConnectorTestVisualizationWidget.cpp \ + debug\moc_TestReport.cpp \ debug\moc_CableTestEngine.cpp \ debug\moc_OptionsPage.cpp \ debug\moc_IOModulesInterface.cpp \ @@ -106,6 +107,7 @@ OBJECTS = debug/MainWindow.o \ debug/moc_ConnectorClickZoneWidget.o \ debug/moc_ONOFFStatusWidget.o \ debug/moc_ConnectorTestVisualizationWidget.o \ + debug/moc_TestReport.o \ debug/moc_CableTestEngine.o \ debug/moc_OptionsPage.o \ debug/moc_IOModulesInterface.o \ @@ -147,7 +149,7 @@ dist: $(ZIP) CableTestBench.zip $(SOURCES) $(DIST) CableTestBench.pro ..\..\Qt\4.8.1\mkspecs\qconfig.pri ..\..\Qt\4.8.1\mkspecs\modules\qt_webkit_version.pri ..\..\Qt\4.8.1\mkspecs\features\qt_functions.prf ..\..\Qt\4.8.1\mkspecs\features\qt_config.prf ..\..\Qt\4.8.1\mkspecs\features\exclusive_builds.prf ..\..\Qt\4.8.1\mkspecs\features\default_pre.prf ..\..\Qt\4.8.1\mkspecs\features\win32\default_pre.prf ..\..\Qt\4.8.1\mkspecs\features\debug.prf ..\..\Qt\4.8.1\mkspecs\features\debug_and_release.prf ..\..\Qt\4.8.1\mkspecs\features\default_post.prf ..\..\Qt\4.8.1\mkspecs\features\win32\default_post.prf ..\..\Qt\4.8.1\mkspecs\features\build_pass.prf ..\..\Qt\4.8.1\mkspecs\features\declarative_debug.prf ..\..\Qt\4.8.1\mkspecs\features\win32\rtti.prf ..\..\Qt\4.8.1\mkspecs\features\win32\exceptions.prf ..\..\Qt\4.8.1\mkspecs\features\win32\stl.prf ..\..\Qt\4.8.1\mkspecs\features\shared.prf ..\..\Qt\4.8.1\mkspecs\features\warn_on.prf ..\..\Qt\4.8.1\mkspecs\features\qt.prf ..\..\Qt\4.8.1\mkspecs\features\win32\thread.prf ..\..\Qt\4.8.1\mkspecs\features\moc.prf ..\..\Qt\4.8.1\mkspecs\features\win32\windows.prf ..\..\Qt\4.8.1\mkspecs\features\resources.prf ..\..\Qt\4.8.1\mkspecs\features\uic.prf ..\..\Qt\4.8.1\mkspecs\features\yacc.prf ..\..\Qt\4.8.1\mkspecs\features\lex.prf ..\..\Qt\4.8.1\mkspecs\features\include_source_dir.prf c:\Qt\4.8.1\lib\qtmaind.prl HEADERS RESOURCES IMAGES SOURCES OBJECTIVE_SOURCES FORMS YACCSOURCES YACCSOURCES LEXSOURCES clean: compiler_clean - -$(DEL_FILE) debug\MainWindow.o debug\main.o debug\MainPage.o debug\CableTestBench.o debug\VisualInspectionPage.o debug\ConnectorSelectWidget.o debug\CableTestPage.o debug\ConnectorClickZoneWidget.o debug\ONOFFStatusWidget.o debug\ConnectorTestVisualizationWidget.o debug\Connector.o debug\Cable.o debug\VisualInspectionResult.o debug\TestReport.o debug\CableTestEngine.o debug\OptionsPage.o debug\CableTestBenchDefs.o debug\IOModulesInterface.o debug\InputConnector.o debug\OutputConnector.o debug\CableParametersData.o debug\AutomatedTestReport.o debug\moc_MainWindow.o debug\moc_MainPage.o debug\moc_CableTestBench.o debug\moc_VisualInspectionPage.o debug\moc_ConnectorSelectWidget.o debug\moc_CableTestPage.o debug\moc_ConnectorClickZoneWidget.o debug\moc_ONOFFStatusWidget.o debug\moc_ConnectorTestVisualizationWidget.o debug\moc_CableTestEngine.o debug\moc_OptionsPage.o debug\moc_IOModulesInterface.o debug\moc_AutomatedTestReport.o + -$(DEL_FILE) debug\MainWindow.o debug\main.o debug\MainPage.o debug\CableTestBench.o debug\VisualInspectionPage.o debug\ConnectorSelectWidget.o debug\CableTestPage.o debug\ConnectorClickZoneWidget.o debug\ONOFFStatusWidget.o debug\ConnectorTestVisualizationWidget.o debug\Connector.o debug\Cable.o debug\VisualInspectionResult.o debug\TestReport.o debug\CableTestEngine.o debug\OptionsPage.o debug\CableTestBenchDefs.o debug\IOModulesInterface.o debug\InputConnector.o debug\OutputConnector.o debug\CableParametersData.o debug\AutomatedTestReport.o debug\moc_MainWindow.o debug\moc_MainPage.o debug\moc_CableTestBench.o debug\moc_VisualInspectionPage.o debug\moc_ConnectorSelectWidget.o debug\moc_CableTestPage.o debug\moc_ConnectorClickZoneWidget.o debug\moc_ONOFFStatusWidget.o debug\moc_ConnectorTestVisualizationWidget.o debug\moc_TestReport.o debug\moc_CableTestEngine.o debug\moc_OptionsPage.o debug\moc_IOModulesInterface.o debug\moc_AutomatedTestReport.o distclean: clean -$(DEL_FILE) $(DESTDIR_TARGET) @@ -159,9 +161,9 @@ mocclean: compiler_moc_header_clean compiler_moc_source_clean mocables: compiler_moc_header_make_all compiler_moc_source_make_all -compiler_moc_header_make_all: debug/moc_MainWindow.cpp debug/moc_MainPage.cpp debug/moc_CableTestBench.cpp debug/moc_VisualInspectionPage.cpp debug/moc_ConnectorSelectWidget.cpp debug/moc_CableTestPage.cpp debug/moc_ConnectorClickZoneWidget.cpp debug/moc_ONOFFStatusWidget.cpp debug/moc_ConnectorTestVisualizationWidget.cpp debug/moc_CableTestEngine.cpp debug/moc_OptionsPage.cpp debug/moc_IOModulesInterface.cpp debug/moc_AutomatedTestReport.cpp +compiler_moc_header_make_all: debug/moc_MainWindow.cpp debug/moc_MainPage.cpp debug/moc_CableTestBench.cpp debug/moc_VisualInspectionPage.cpp debug/moc_ConnectorSelectWidget.cpp debug/moc_CableTestPage.cpp debug/moc_ConnectorClickZoneWidget.cpp debug/moc_ONOFFStatusWidget.cpp debug/moc_ConnectorTestVisualizationWidget.cpp debug/moc_TestReport.cpp debug/moc_CableTestEngine.cpp debug/moc_OptionsPage.cpp debug/moc_IOModulesInterface.cpp debug/moc_AutomatedTestReport.cpp compiler_moc_header_clean: - -$(DEL_FILE) debug\moc_MainWindow.cpp debug\moc_MainPage.cpp debug\moc_CableTestBench.cpp debug\moc_VisualInspectionPage.cpp debug\moc_ConnectorSelectWidget.cpp debug\moc_CableTestPage.cpp debug\moc_ConnectorClickZoneWidget.cpp debug\moc_ONOFFStatusWidget.cpp debug\moc_ConnectorTestVisualizationWidget.cpp debug\moc_CableTestEngine.cpp debug\moc_OptionsPage.cpp debug\moc_IOModulesInterface.cpp debug\moc_AutomatedTestReport.cpp + -$(DEL_FILE) debug\moc_MainWindow.cpp debug\moc_MainPage.cpp debug\moc_CableTestBench.cpp debug\moc_VisualInspectionPage.cpp debug\moc_ConnectorSelectWidget.cpp debug\moc_CableTestPage.cpp debug\moc_ConnectorClickZoneWidget.cpp debug\moc_ONOFFStatusWidget.cpp debug\moc_ConnectorTestVisualizationWidget.cpp debug\moc_TestReport.cpp debug\moc_CableTestEngine.cpp debug\moc_OptionsPage.cpp debug\moc_IOModulesInterface.cpp debug\moc_AutomatedTestReport.cpp debug/moc_MainWindow.cpp: Sources/MainPage.h \ Sources/VisualInspectionPage.h \ Sources/VisualInspectionResult.h \ @@ -191,6 +193,7 @@ debug/moc_CableTestBench.cpp: Sources/MainWindow.h \ Sources/TestReport.h \ Sources/CableParametersData.h \ Sources/TestBenchVersion.h \ + Sources/AutomatedTestReport.h \ Sources/CableTestEngine.h \ Sources/CableTestBench.h C:\Qt\4.8.1\bin\moc.exe $(DEFINES) $(INCPATH) -D__GNUC__ -DWIN32 Sources\CableTestBench.h -o debug\moc_CableTestBench.cpp @@ -218,6 +221,14 @@ debug/moc_ConnectorTestVisualizationWidget.cpp: Sources/Widgets/ONOFFStatusWidge Sources/Widgets/ConnectorTestVisualizationWidget.h C:\Qt\4.8.1\bin\moc.exe $(DEFINES) $(INCPATH) -D__GNUC__ -DWIN32 Sources\Widgets\ConnectorTestVisualizationWidget.h -o debug\moc_ConnectorTestVisualizationWidget.cpp +debug/moc_TestReport.cpp: Sources/GlobalDefine.h \ + Sources/VisualInspectionResult.h \ + Sources/CableParametersData.h \ + Sources/TestBenchVersion.h \ + Sources/AutomatedTestReport.h \ + Sources/TestReport.h + C:\Qt\4.8.1\bin\moc.exe $(DEFINES) $(INCPATH) -D__GNUC__ -DWIN32 Sources\TestReport.h -o debug\moc_TestReport.cpp + debug/moc_CableTestEngine.cpp: Sources/Cable.h \ Sources/CableTestBenchDefs.h \ Sources/InputConnector.h \ @@ -229,6 +240,7 @@ debug/moc_CableTestEngine.cpp: Sources/Cable.h \ Sources/VisualInspectionResult.h \ Sources/CableParametersData.h \ Sources/TestBenchVersion.h \ + Sources/AutomatedTestReport.h \ Sources/CableTestEngine.h C:\Qt\4.8.1\bin\moc.exe $(DEFINES) $(INCPATH) -D__GNUC__ -DWIN32 Sources\CableTestEngine.h -o debug\moc_CableTestEngine.cpp @@ -292,6 +304,7 @@ debug/MainWindow.o: Sources/MainWindow.cpp Sources/MainWindow.h \ Sources/TestReport.h \ Sources/CableParametersData.h \ Sources/TestBenchVersion.h \ + Sources/AutomatedTestReport.h \ Sources/CableTestEngine.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o debug\MainWindow.o Sources\MainWindow.cpp @@ -312,6 +325,7 @@ debug/main.o: Sources/main.cpp Sources/CableTestBench.h \ Sources/TestReport.h \ Sources/CableParametersData.h \ Sources/TestBenchVersion.h \ + Sources/AutomatedTestReport.h \ Sources/CableTestEngine.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o debug\main.o Sources\main.cpp @@ -336,6 +350,7 @@ debug/CableTestBench.o: Sources/CableTestBench.cpp Sources/CableTestBench.h \ Sources/TestReport.h \ Sources/CableParametersData.h \ Sources/TestBenchVersion.h \ + Sources/AutomatedTestReport.h \ Sources/CableTestEngine.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o debug\CableTestBench.o Sources\CableTestBench.cpp @@ -357,6 +372,7 @@ debug/VisualInspectionPage.o: Sources/VisualInspectionPage.cpp Sources/VisualIns Sources/TestReport.h \ Sources/CableParametersData.h \ Sources/TestBenchVersion.h \ + Sources/AutomatedTestReport.h \ Sources/CableTestEngine.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o debug\VisualInspectionPage.o Sources\VisualInspectionPage.cpp @@ -382,6 +398,7 @@ debug/CableTestPage.o: Sources/CableTestPage.cpp Sources/CableTestPage.h \ Sources/TestReport.h \ Sources/CableParametersData.h \ Sources/TestBenchVersion.h \ + Sources/AutomatedTestReport.h \ Sources/CableTestEngine.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o debug\CableTestPage.o Sources\CableTestPage.cpp @@ -418,7 +435,8 @@ debug/TestReport.o: Sources/TestReport.cpp Sources/TestReport.h \ Sources/GlobalDefine.h \ Sources/VisualInspectionResult.h \ Sources/CableParametersData.h \ - Sources/TestBenchVersion.h + Sources/TestBenchVersion.h \ + Sources/AutomatedTestReport.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o debug\TestReport.o Sources\TestReport.cpp debug/CableTestEngine.o: Sources/CableTestEngine.cpp Sources/CableTestEngine.h \ @@ -433,6 +451,7 @@ debug/CableTestEngine.o: Sources/CableTestEngine.cpp Sources/CableTestEngine.h \ Sources/VisualInspectionResult.h \ Sources/CableParametersData.h \ Sources/TestBenchVersion.h \ + Sources/AutomatedTestReport.h \ Sources/CableTestBench.h \ Sources/MainWindow.h \ Sources/MainPage.h \ @@ -500,6 +519,9 @@ debug/moc_ONOFFStatusWidget.o: debug/moc_ONOFFStatusWidget.cpp debug/moc_ConnectorTestVisualizationWidget.o: debug/moc_ConnectorTestVisualizationWidget.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o debug\moc_ConnectorTestVisualizationWidget.o debug\moc_ConnectorTestVisualizationWidget.cpp +debug/moc_TestReport.o: debug/moc_TestReport.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o debug\moc_TestReport.o debug\moc_TestReport.cpp + debug/moc_CableTestEngine.o: debug/moc_CableTestEngine.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o debug\moc_CableTestEngine.o debug\moc_CableTestEngine.cpp diff --git a/Makefile.Release b/Makefile.Release index e5a5daf..c4a926f 100644 --- a/Makefile.Release +++ b/Makefile.Release @@ -1,6 +1,6 @@ ############################################################################# # Makefile for building: CableTestBench -# Generated by qmake (2.01a) (Qt 4.8.1) on: Wed May 8 14:10:10 2019 +# Generated by qmake (2.01a) (Qt 4.8.1) on: Fri May 10 14:02:01 2019 # Project: CableTestBench.pro # Template: app ############################################################################# @@ -71,6 +71,7 @@ SOURCES = Sources\MainWindow.cpp \ release\moc_ConnectorClickZoneWidget.cpp \ release\moc_ONOFFStatusWidget.cpp \ release\moc_ConnectorTestVisualizationWidget.cpp \ + release\moc_TestReport.cpp \ release\moc_CableTestEngine.cpp \ release\moc_OptionsPage.cpp \ release\moc_IOModulesInterface.cpp \ @@ -106,6 +107,7 @@ OBJECTS = release/MainWindow.o \ release/moc_ConnectorClickZoneWidget.o \ release/moc_ONOFFStatusWidget.o \ release/moc_ConnectorTestVisualizationWidget.o \ + release/moc_TestReport.o \ release/moc_CableTestEngine.o \ release/moc_OptionsPage.o \ release/moc_IOModulesInterface.o \ @@ -147,7 +149,7 @@ dist: $(ZIP) CableTestBench.zip $(SOURCES) $(DIST) CableTestBench.pro ..\..\Qt\4.8.1\mkspecs\qconfig.pri ..\..\Qt\4.8.1\mkspecs\modules\qt_webkit_version.pri ..\..\Qt\4.8.1\mkspecs\features\qt_functions.prf ..\..\Qt\4.8.1\mkspecs\features\qt_config.prf ..\..\Qt\4.8.1\mkspecs\features\exclusive_builds.prf ..\..\Qt\4.8.1\mkspecs\features\default_pre.prf ..\..\Qt\4.8.1\mkspecs\features\win32\default_pre.prf ..\..\Qt\4.8.1\mkspecs\features\release.prf ..\..\Qt\4.8.1\mkspecs\features\debug_and_release.prf ..\..\Qt\4.8.1\mkspecs\features\default_post.prf ..\..\Qt\4.8.1\mkspecs\features\win32\default_post.prf ..\..\Qt\4.8.1\mkspecs\features\build_pass.prf ..\..\Qt\4.8.1\mkspecs\features\declarative_debug.prf ..\..\Qt\4.8.1\mkspecs\features\win32\rtti.prf ..\..\Qt\4.8.1\mkspecs\features\win32\exceptions.prf ..\..\Qt\4.8.1\mkspecs\features\win32\stl.prf ..\..\Qt\4.8.1\mkspecs\features\shared.prf ..\..\Qt\4.8.1\mkspecs\features\warn_on.prf ..\..\Qt\4.8.1\mkspecs\features\qt.prf ..\..\Qt\4.8.1\mkspecs\features\win32\thread.prf ..\..\Qt\4.8.1\mkspecs\features\moc.prf ..\..\Qt\4.8.1\mkspecs\features\win32\windows.prf ..\..\Qt\4.8.1\mkspecs\features\resources.prf ..\..\Qt\4.8.1\mkspecs\features\uic.prf ..\..\Qt\4.8.1\mkspecs\features\yacc.prf ..\..\Qt\4.8.1\mkspecs\features\lex.prf ..\..\Qt\4.8.1\mkspecs\features\include_source_dir.prf c:\Qt\4.8.1\lib\qtmain.prl HEADERS RESOURCES IMAGES SOURCES OBJECTIVE_SOURCES FORMS YACCSOURCES YACCSOURCES LEXSOURCES clean: compiler_clean - -$(DEL_FILE) release\MainWindow.o release\main.o release\MainPage.o release\CableTestBench.o release\VisualInspectionPage.o release\ConnectorSelectWidget.o release\CableTestPage.o release\ConnectorClickZoneWidget.o release\ONOFFStatusWidget.o release\ConnectorTestVisualizationWidget.o release\Connector.o release\Cable.o release\VisualInspectionResult.o release\TestReport.o release\CableTestEngine.o release\OptionsPage.o release\CableTestBenchDefs.o release\IOModulesInterface.o release\InputConnector.o release\OutputConnector.o release\CableParametersData.o release\AutomatedTestReport.o release\moc_MainWindow.o release\moc_MainPage.o release\moc_CableTestBench.o release\moc_VisualInspectionPage.o release\moc_ConnectorSelectWidget.o release\moc_CableTestPage.o release\moc_ConnectorClickZoneWidget.o release\moc_ONOFFStatusWidget.o release\moc_ConnectorTestVisualizationWidget.o release\moc_CableTestEngine.o release\moc_OptionsPage.o release\moc_IOModulesInterface.o release\moc_AutomatedTestReport.o + -$(DEL_FILE) release\MainWindow.o release\main.o release\MainPage.o release\CableTestBench.o release\VisualInspectionPage.o release\ConnectorSelectWidget.o release\CableTestPage.o release\ConnectorClickZoneWidget.o release\ONOFFStatusWidget.o release\ConnectorTestVisualizationWidget.o release\Connector.o release\Cable.o release\VisualInspectionResult.o release\TestReport.o release\CableTestEngine.o release\OptionsPage.o release\CableTestBenchDefs.o release\IOModulesInterface.o release\InputConnector.o release\OutputConnector.o release\CableParametersData.o release\AutomatedTestReport.o release\moc_MainWindow.o release\moc_MainPage.o release\moc_CableTestBench.o release\moc_VisualInspectionPage.o release\moc_ConnectorSelectWidget.o release\moc_CableTestPage.o release\moc_ConnectorClickZoneWidget.o release\moc_ONOFFStatusWidget.o release\moc_ConnectorTestVisualizationWidget.o release\moc_TestReport.o release\moc_CableTestEngine.o release\moc_OptionsPage.o release\moc_IOModulesInterface.o release\moc_AutomatedTestReport.o distclean: clean -$(DEL_FILE) $(DESTDIR_TARGET) @@ -159,9 +161,9 @@ mocclean: compiler_moc_header_clean compiler_moc_source_clean mocables: compiler_moc_header_make_all compiler_moc_source_make_all -compiler_moc_header_make_all: release/moc_MainWindow.cpp release/moc_MainPage.cpp release/moc_CableTestBench.cpp release/moc_VisualInspectionPage.cpp release/moc_ConnectorSelectWidget.cpp release/moc_CableTestPage.cpp release/moc_ConnectorClickZoneWidget.cpp release/moc_ONOFFStatusWidget.cpp release/moc_ConnectorTestVisualizationWidget.cpp release/moc_CableTestEngine.cpp release/moc_OptionsPage.cpp release/moc_IOModulesInterface.cpp release/moc_AutomatedTestReport.cpp +compiler_moc_header_make_all: release/moc_MainWindow.cpp release/moc_MainPage.cpp release/moc_CableTestBench.cpp release/moc_VisualInspectionPage.cpp release/moc_ConnectorSelectWidget.cpp release/moc_CableTestPage.cpp release/moc_ConnectorClickZoneWidget.cpp release/moc_ONOFFStatusWidget.cpp release/moc_ConnectorTestVisualizationWidget.cpp release/moc_TestReport.cpp release/moc_CableTestEngine.cpp release/moc_OptionsPage.cpp release/moc_IOModulesInterface.cpp release/moc_AutomatedTestReport.cpp compiler_moc_header_clean: - -$(DEL_FILE) release\moc_MainWindow.cpp release\moc_MainPage.cpp release\moc_CableTestBench.cpp release\moc_VisualInspectionPage.cpp release\moc_ConnectorSelectWidget.cpp release\moc_CableTestPage.cpp release\moc_ConnectorClickZoneWidget.cpp release\moc_ONOFFStatusWidget.cpp release\moc_ConnectorTestVisualizationWidget.cpp release\moc_CableTestEngine.cpp release\moc_OptionsPage.cpp release\moc_IOModulesInterface.cpp release\moc_AutomatedTestReport.cpp + -$(DEL_FILE) release\moc_MainWindow.cpp release\moc_MainPage.cpp release\moc_CableTestBench.cpp release\moc_VisualInspectionPage.cpp release\moc_ConnectorSelectWidget.cpp release\moc_CableTestPage.cpp release\moc_ConnectorClickZoneWidget.cpp release\moc_ONOFFStatusWidget.cpp release\moc_ConnectorTestVisualizationWidget.cpp release\moc_TestReport.cpp release\moc_CableTestEngine.cpp release\moc_OptionsPage.cpp release\moc_IOModulesInterface.cpp release\moc_AutomatedTestReport.cpp release/moc_MainWindow.cpp: Sources/MainPage.h \ Sources/VisualInspectionPage.h \ Sources/VisualInspectionResult.h \ @@ -191,6 +193,7 @@ release/moc_CableTestBench.cpp: Sources/MainWindow.h \ Sources/TestReport.h \ Sources/CableParametersData.h \ Sources/TestBenchVersion.h \ + Sources/AutomatedTestReport.h \ Sources/CableTestEngine.h \ Sources/CableTestBench.h C:\Qt\4.8.1\bin\moc.exe $(DEFINES) $(INCPATH) -D__GNUC__ -DWIN32 Sources\CableTestBench.h -o release\moc_CableTestBench.cpp @@ -218,6 +221,14 @@ release/moc_ConnectorTestVisualizationWidget.cpp: Sources/Widgets/ONOFFStatusWid Sources/Widgets/ConnectorTestVisualizationWidget.h C:\Qt\4.8.1\bin\moc.exe $(DEFINES) $(INCPATH) -D__GNUC__ -DWIN32 Sources\Widgets\ConnectorTestVisualizationWidget.h -o release\moc_ConnectorTestVisualizationWidget.cpp +release/moc_TestReport.cpp: Sources/GlobalDefine.h \ + Sources/VisualInspectionResult.h \ + Sources/CableParametersData.h \ + Sources/TestBenchVersion.h \ + Sources/AutomatedTestReport.h \ + Sources/TestReport.h + C:\Qt\4.8.1\bin\moc.exe $(DEFINES) $(INCPATH) -D__GNUC__ -DWIN32 Sources\TestReport.h -o release\moc_TestReport.cpp + release/moc_CableTestEngine.cpp: Sources/Cable.h \ Sources/CableTestBenchDefs.h \ Sources/InputConnector.h \ @@ -229,6 +240,7 @@ release/moc_CableTestEngine.cpp: Sources/Cable.h \ Sources/VisualInspectionResult.h \ Sources/CableParametersData.h \ Sources/TestBenchVersion.h \ + Sources/AutomatedTestReport.h \ Sources/CableTestEngine.h C:\Qt\4.8.1\bin\moc.exe $(DEFINES) $(INCPATH) -D__GNUC__ -DWIN32 Sources\CableTestEngine.h -o release\moc_CableTestEngine.cpp @@ -292,6 +304,7 @@ release/MainWindow.o: Sources/MainWindow.cpp Sources/MainWindow.h \ Sources/TestReport.h \ Sources/CableParametersData.h \ Sources/TestBenchVersion.h \ + Sources/AutomatedTestReport.h \ Sources/CableTestEngine.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o release\MainWindow.o Sources\MainWindow.cpp @@ -312,6 +325,7 @@ release/main.o: Sources/main.cpp Sources/CableTestBench.h \ Sources/TestReport.h \ Sources/CableParametersData.h \ Sources/TestBenchVersion.h \ + Sources/AutomatedTestReport.h \ Sources/CableTestEngine.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o release\main.o Sources\main.cpp @@ -336,6 +350,7 @@ release/CableTestBench.o: Sources/CableTestBench.cpp Sources/CableTestBench.h \ Sources/TestReport.h \ Sources/CableParametersData.h \ Sources/TestBenchVersion.h \ + Sources/AutomatedTestReport.h \ Sources/CableTestEngine.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o release\CableTestBench.o Sources\CableTestBench.cpp @@ -357,6 +372,7 @@ release/VisualInspectionPage.o: Sources/VisualInspectionPage.cpp Sources/VisualI Sources/TestReport.h \ Sources/CableParametersData.h \ Sources/TestBenchVersion.h \ + Sources/AutomatedTestReport.h \ Sources/CableTestEngine.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o release\VisualInspectionPage.o Sources\VisualInspectionPage.cpp @@ -382,6 +398,7 @@ release/CableTestPage.o: Sources/CableTestPage.cpp Sources/CableTestPage.h \ Sources/TestReport.h \ Sources/CableParametersData.h \ Sources/TestBenchVersion.h \ + Sources/AutomatedTestReport.h \ Sources/CableTestEngine.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o release\CableTestPage.o Sources\CableTestPage.cpp @@ -418,7 +435,8 @@ release/TestReport.o: Sources/TestReport.cpp Sources/TestReport.h \ Sources/GlobalDefine.h \ Sources/VisualInspectionResult.h \ Sources/CableParametersData.h \ - Sources/TestBenchVersion.h + Sources/TestBenchVersion.h \ + Sources/AutomatedTestReport.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o release\TestReport.o Sources\TestReport.cpp release/CableTestEngine.o: Sources/CableTestEngine.cpp Sources/CableTestEngine.h \ @@ -433,6 +451,7 @@ release/CableTestEngine.o: Sources/CableTestEngine.cpp Sources/CableTestEngine.h Sources/VisualInspectionResult.h \ Sources/CableParametersData.h \ Sources/TestBenchVersion.h \ + Sources/AutomatedTestReport.h \ Sources/CableTestBench.h \ Sources/MainWindow.h \ Sources/MainPage.h \ @@ -500,6 +519,9 @@ release/moc_ONOFFStatusWidget.o: release/moc_ONOFFStatusWidget.cpp release/moc_ConnectorTestVisualizationWidget.o: release/moc_ConnectorTestVisualizationWidget.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o release\moc_ConnectorTestVisualizationWidget.o release\moc_ConnectorTestVisualizationWidget.cpp +release/moc_TestReport.o: release/moc_TestReport.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o release\moc_TestReport.o release\moc_TestReport.cpp + release/moc_CableTestEngine.o: release/moc_CableTestEngine.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o release\moc_CableTestEngine.o release\moc_CableTestEngine.cpp diff --git a/Rapports/190510_164434_1S52CABLE_XX_NO_AA_BB.c.txt b/Rapports/190510_164434_1S52CABLE_XX_NO_AA_BB.c.txt new file mode 100644 index 0000000..2b372d7 --- /dev/null +++ b/Rapports/190510_164434_1S52CABLE_XX_NO_AA_BB.c.txt @@ -0,0 +1,52 @@ +Rapport de test - Câble SEI +Date de l'essai: 2019-05-10 +Version du logiciel de test: V0.10_ING_DEV + +----------------------------------------- +Paramètres du câble: +Identification du câble: CABLE_XX_NO_AA_BB.c +Station: 1S52 - Frontenac +Type: Permanent +Opérateur du test: JFMartel +Connecteur d'entrée: Connecteur circulaire 6 contacts +Connecteur de sortie: Connecteur circulaire 6 contacts + +----------------------------------------- +Résultats de l'inspection visuelle: +Section 5.2 exécutée: N/A +Section 5.3 exécutée: N/A +Section 5.4 exécutée: N/A +Section 5.5 exécutée: N/A +Section 5.6 exécutée: N/A + +Notes d'inspection: + + + +----------------------------------------- +Résultats du test automatique du câble: +Lorsqu'applicable, les valeurs entre crochets [] correspondent aux contacts en défaut. + + No. Contact Continuité Isolation Assignation 2è test + 1 Succès Succès Succès N/A + 2 Succès Succès Succès N/A + 3 Succès Succès Succès N/A + 4 Succès Succès Succès N/A + 5 Succès Succès Succès N/A + 6 Succès Succès Succès N/A + + + + Signature de l'opérateur de test: _________________________________________ + +----------------------------------------- +Log du test: +16:44:31.062 - Démarrage du test automatique. +16:44:31.523 - Succès de l'auto test des modules d'I/O +16:44:32.015 - Succès du test du contact 1 +16:44:32.420 - Succès du test du contact 2 +16:44:32.832 - Succès du test du contact 3 +16:44:33.270 - Succès du test du contact 4 +16:44:33.708 - Succès du test du contact 5 +16:44:34.144 - Succès du test du contact 6 +16:44:34.304 - Test automatique terminé diff --git a/Rapports/190510_164450_1S52CABLE_XX_NO_AA_BB.c.txt b/Rapports/190510_164450_1S52CABLE_XX_NO_AA_BB.c.txt new file mode 100644 index 0000000..e3103a8 --- /dev/null +++ b/Rapports/190510_164450_1S52CABLE_XX_NO_AA_BB.c.txt @@ -0,0 +1,68 @@ +Rapport de test - Câble SEI +Date de l'essai: 2019-05-10 +Version du logiciel de test: V0.10_ING_DEV + +----------------------------------------- +Paramètres du câble: +Identification du câble: CABLE_XX_NO_AA_BB.c +Station: 1S52 - Frontenac +Type: Permanent +Opérateur du test: JFMartel +Connecteur d'entrée: Connecteur circulaire 14 contacts +Connecteur de sortie: Connecteur circulaire 14 contacts + +----------------------------------------- +Résultats de l'inspection visuelle: +Section 5.2 exécutée: N/A +Section 5.3 exécutée: N/A +Section 5.4 exécutée: N/A +Section 5.5 exécutée: N/A +Section 5.6 exécutée: N/A + +Notes d'inspection: + + + +----------------------------------------- +Résultats du test automatique du câble: +Lorsqu'applicable, les valeurs entre crochets [] correspondent aux contacts en défaut. + + No. Contact Continuité Isolation Assignation 2è test + 1 Succès Succès Succès N/A + 2 Succès Succès Succès N/A + 3 Succès Succès Succès N/A + 4 Succès Succès Succès N/A + 5 Succès Succès Succès N/A + 6 Succès Succès Succès N/A + 7 Succès Succès Succès N/A + 8 Succès Succès Succès N/A + 9 Succès Succès Succès N/A + 10 Succès Succès Succès N/A + 11 Succès Succès Succès N/A + 12 Succès Succès Succès N/A + 13 N/A N/A Échec[14] N/A + 14 N/A N/A Échec[13] N/A + + + + Signature de l'opérateur de test: _________________________________________ + +----------------------------------------- +Log du test: +16:44:44.052 - Démarrage du test automatique. +16:44:44.520 - Succès de l'auto test des modules d'I/O +16:44:44.996 - Succès du test du contact 1 +16:44:45.399 - Succès du test du contact 2 +16:44:45.827 - Succès du test du contact 3 +16:44:46.213 - Succès du test du contact 4 +16:44:46.616 - Succès du test du contact 5 +16:44:47.029 - Succès du test du contact 6 +16:44:47.470 - Succès du test du contact 7 +16:44:47.902 - Succès du test du contact 8 +16:44:48.339 - Succès du test du contact 9 +16:44:48.778 - Succès du test du contact 10 +16:44:49.255 - Succès du test du contact 11 +16:44:49.658 - Succès du test du contact 12 +16:44:50.088 - Échec du test d'assignation du contact 13: le contact 14 est activé. +16:44:50.522 - Échec du test d'assignation du contact 14: le contact 13 est activé. +16:44:50.616 - Test automatique terminé diff --git a/Sources/AutomatedTestReport.cpp b/Sources/AutomatedTestReport.cpp index e320a83..4df1eee 100644 --- a/Sources/AutomatedTestReport.cpp +++ b/Sources/AutomatedTestReport.cpp @@ -10,6 +10,7 @@ int CAutomatedTestReport::ClearAutomatedTestReport() { mTestPinsResult.clear(); mPinCount = 0; + mPreTestResult = AUTO_TEST_RESULT_UNKNOWN; return RET_OK; } @@ -39,6 +40,20 @@ int CAutomatedTestReport::SetPinResult(int PinNumber, bool ContinuityPassed, boo return RET_OK; } +int CAutomatedTestReport::SetPinTestAllPassed(int PinNumber) +{ + int ZeroBasedPinIndex = PinNumber - 1; + if(ZeroBasedPinIndex < 0 || ZeroBasedPinIndex >= mPinCount) //Try not to crash. + { + return RET_ERROR; + } + + mTestPinsResult[ZeroBasedPinIndex].mIsolationTestPass = true; + mTestPinsResult[ZeroBasedPinIndex].mContinuityTestPass = true; + mTestPinsResult[ZeroBasedPinIndex].mPinAssignationTestPass = true; + return RET_OK; +} + int CAutomatedTestReport::SetPinContinuityResult(int PinNumber,bool ContinuityPassed) { @@ -66,6 +81,23 @@ int CAutomatedTestReport::SetPinIsolationResult(int PinNumber, bool IsolationPas return RET_OK; } +int CAutomatedTestReport::SetPinConcordanceTestResult(int PinNumber, bool AssignationTestPassed, int WrongPinNbr) +{ + int ZeroBasedPinIndex = PinNumber - 1; + if(ZeroBasedPinIndex < 0 || ZeroBasedPinIndex >= mPinCount) //Try not to crash. + { + return RET_ERROR; + } + + mTestPinsResult[ZeroBasedPinIndex].mPinAssignationTestPass = AssignationTestPassed; + if(AssignationTestPassed == false) + { + mTestPinsResult[ZeroBasedPinIndex].mWrongAssignationPinNbr = WrongPinNbr; + } + + return RET_OK; +} + int CAutomatedTestReport::SetPinSecondTestResult(int PinNumber, bool SecondTestPassed) { int ZeroBasedPinIndex = PinNumber - 1; @@ -79,16 +111,172 @@ int CAutomatedTestReport::SetPinSecondTestResult(int PinNumber, bool SecondTestP return RET_OK; } +int CAutomatedTestReport::AddShortedPinToPinTest(int PinNumber, int ShortedPinNumber) +{ + int ZeroBasedPinIndex = PinNumber - 1; + if(ZeroBasedPinIndex < 0 || ZeroBasedPinIndex >= mPinCount) //Try not to crash. + { + return RET_ERROR; + } + + mTestPinsResult[ZeroBasedPinIndex].mShortedPinsList.append(ShortedPinNumber); + + return RET_OK; +} + +int CAutomatedTestReport::SetPreTestResult(bool PreTestPassed) +{ + mPreTestResult = PreTestPassed; + return RET_OK; +} + CPinTestResult::CPinTestResult(int PinNumber) { mPinNumber = PinNumber; - mContinuityTestPass = PIN_TEST_RESULT_UNKNOWN; - mIsolationTestPass = PIN_TEST_RESULT_UNKNOWN; - mSecondTestPass = PIN_TEST_RESULT_UNKNOWN; + mContinuityTestPass = AUTO_TEST_RESULT_UNKNOWN; + mIsolationTestPass = AUTO_TEST_RESULT_UNKNOWN; + mPinAssignationTestPass = AUTO_TEST_RESULT_UNKNOWN; + mSecondTestPass = AUTO_TEST_RESULT_UNKNOWN; mShortedPinsList.clear(); + mWrongAssignationPinNbr = 0; + } CPinTestResult::~CPinTestResult() { mShortedPinsList.clear(); } + +bool CPinTestResult::IsPinTestSuccess() +{ + if(mPinNumber > 0 && + mContinuityTestPass == AUTO_TEST_SUCCESS && + mIsolationTestPass == AUTO_TEST_SUCCESS && + mPinAssignationTestPass == AUTO_TEST_SUCCESS) //TODO: Add 2nd pass result. + { + return true; + } + + return false; +} + + + +QString CAutomatedTestReport::GetPinIsolationResult(int PinNumber) +{ + int ZeroBasedPinIndex = PinNumber - 1; + if(ZeroBasedPinIndex < 0 || ZeroBasedPinIndex >= mPinCount) //Try not to crash. + { + return QString("?"); + } + + if(mTestPinsResult[ZeroBasedPinIndex].mIsolationTestPass == AUTO_TEST_RESULT_UNKNOWN) + { + return QString("N/A"); + } + else if(mTestPinsResult[ZeroBasedPinIndex].mIsolationTestPass == AUTO_TEST_SUCCESS) + { + return QString("Succès"); + } + else if(mTestPinsResult[ZeroBasedPinIndex].mIsolationTestPass == AUTO_TEST_FAILED) + { + QString Result("Échec["); + for(int i = 0; i < mTestPinsResult[ZeroBasedPinIndex].mShortedPinsList.size(); i++) + { + Result.append(QString("%1").arg(mTestPinsResult[ZeroBasedPinIndex].mShortedPinsList.at(i))); + if(i != mTestPinsResult[ZeroBasedPinIndex].mShortedPinsList.size() - 1) + { + Result.append(","); + } + } + Result.append("]"); + return Result; + } + return QString("?"); +} + +QString CAutomatedTestReport::GetPinContinuityResult(int PinNumber) +{ + int ZeroBasedPinIndex = PinNumber - 1; + if(ZeroBasedPinIndex < 0 || ZeroBasedPinIndex >= mPinCount) //Try not to crash. + { + return QString("?"); + } + + if(mTestPinsResult[ZeroBasedPinIndex].mContinuityTestPass == AUTO_TEST_RESULT_UNKNOWN) + { + return QString("N/A"); + } + else if(mTestPinsResult[ZeroBasedPinIndex].mContinuityTestPass == AUTO_TEST_SUCCESS) + { + return QString("Succès"); + } + else if(mTestPinsResult[ZeroBasedPinIndex].mContinuityTestPass == AUTO_TEST_FAILED) + { + return QString("Échec"); + } + return QString("?"); +} +QString CAutomatedTestReport::GetPinConcordanceResult(int PinNumber) +{ + int ZeroBasedPinIndex = PinNumber - 1; + if(ZeroBasedPinIndex < 0 || ZeroBasedPinIndex >= mPinCount) //Try not to crash. + { + return QString("?"); + } + + if(mTestPinsResult[ZeroBasedPinIndex].mPinAssignationTestPass == AUTO_TEST_RESULT_UNKNOWN) + { + return QString("N/A"); + } + else if(mTestPinsResult[ZeroBasedPinIndex].mPinAssignationTestPass == AUTO_TEST_SUCCESS) + { + return QString("Succès"); + } + else if(mTestPinsResult[ZeroBasedPinIndex].mPinAssignationTestPass == AUTO_TEST_FAILED) + { + return QString("Échec[%1]").arg(mTestPinsResult[ZeroBasedPinIndex].mWrongAssignationPinNbr); + } + return QString("?"); +} +QString CAutomatedTestReport::GetPinSecondTestResult(int PinNumber) +{ + int ZeroBasedPinIndex = PinNumber - 1; + if(ZeroBasedPinIndex < 0 || ZeroBasedPinIndex >= mPinCount) //Try not to crash. + { + return QString("?"); + } + + if(mTestPinsResult[ZeroBasedPinIndex].mSecondTestPass == AUTO_TEST_RESULT_UNKNOWN) + { + return QString("N/A"); + } + else if(mTestPinsResult[ZeroBasedPinIndex].mSecondTestPass == AUTO_TEST_SUCCESS) + { + return QString("Succès"); + } + else if(mTestPinsResult[ZeroBasedPinIndex].mSecondTestPass == AUTO_TEST_FAILED) + { + return QString("Échec"); + } + return QString("?"); +} + +bool CAutomatedTestReport::IsAutomatedTestSuccess() +{ + if(mPinCount == 0) + { + return false; + } + + for(int i = 0; i < mTestPinsResult.size(); i++) + { + if(mTestPinsResult[i].IsPinTestSuccess() == false) + { + return false; + } + } + + + return true; +} diff --git a/Sources/AutomatedTestReport.h b/Sources/AutomatedTestReport.h index bd2db75..00ec31b 100644 --- a/Sources/AutomatedTestReport.h +++ b/Sources/AutomatedTestReport.h @@ -6,6 +6,13 @@ class CPinTestResult; +enum eAutoTestResultDef +{ + AUTO_TEST_FAILED, + AUTO_TEST_SUCCESS, + AUTO_TEST_RESULT_UNKNOWN +}; + class CAutomatedTestReport : public QObject { Q_OBJECT @@ -14,15 +21,29 @@ public: int ClearAutomatedTestReport(); int SetPinCount(int Pincount); + int GetPinCount(){return mPinCount;} int SetPinResult(int PinNumber,bool ContinuityPassed, bool IsolationPassed); + int SetPinTestAllPassed(int PinNumber); int SetPinContinuityResult(int PinNumber,bool ContinuityPassed); int SetPinIsolationResult(int PinNumber, bool IsolationPassed); + int SetPinConcordanceTestResult(int PinNumber, bool AssignationTestPassed, int WrongPinNbr); int SetPinSecondTestResult(int PinNumber, bool SecondTestPassed); + int AddShortedPinToPinTest(int PinNumber,int ShortedPinNumber); + bool IsAutomatedTestSuccess(); + + QString GetPinIsolationResult(int PinNumber); + QString GetPinContinuityResult(int PinNumber); + QString GetPinConcordanceResult(int PinNumber); + QString GetPinSecondTestResult(int PinNumber); + QString GetShortedPins(int PinNumber); + QString GetWrongPin(int PinNumber); + + int SetPreTestResult(bool PreTestPassed); -private: QList mTestPinsResult; int mPinCount; + int mPreTestResult; signals: @@ -33,22 +54,26 @@ public slots: class CPinTestResult { public: - enum ePinTestResultDef - { - PIN_TEST_FAILED, - PIN_TEST_SUCCESS, - PIN_TEST_RESULT_UNKNOWN - }; +// enum ePinTestResultDef +// { +// PIN_TEST_FAILED, +// PIN_TEST_SUCCESS, +// PIN_TEST_RESULT_UNKNOWN +// }; explicit CPinTestResult(int PinNumber); ~CPinTestResult(); + bool IsPinTestSuccess(); + int mPinNumber; int mContinuityTestPass; int mIsolationTestPass; + int mPinAssignationTestPass; int mSecondTestPass; QList mShortedPinsList; + int mWrongAssignationPinNbr; }; diff --git a/Sources/CableParametersData.cpp b/Sources/CableParametersData.cpp index 19eb484..0e57e60 100644 --- a/Sources/CableParametersData.cpp +++ b/Sources/CableParametersData.cpp @@ -19,9 +19,10 @@ int CCableParametersData::ResetData() return RET_OK; } -int CCableParametersData::SetCableParams(QString StationName, QString CableIdentification, QString CableType, QString OperatorName) +int CCableParametersData::SetCableParams(QString StationName, QString StationCode, QString CableIdentification, QString CableType, QString OperatorName) { mStationName = StationName; + mStationCodeName = StationCode; mCableIdentification = CableIdentification; mCableType = CableType; mTestOperatorName = OperatorName; diff --git a/Sources/CableParametersData.h b/Sources/CableParametersData.h index 532fd3c..ae3b8d1 100644 --- a/Sources/CableParametersData.h +++ b/Sources/CableParametersData.h @@ -11,13 +11,13 @@ public: int ResetData(); - int SetCableParams(QString StationName, QString CableIdentification, QString CableType, QString OperatorName); + int SetCableParams(QString StationName, QString StationCode, QString CableIdentification, QString CableType, QString OperatorName); int SetCableType(QString InputConnectortype, QString OutputConnectorType); -private: QString mStationName; + QString mStationCodeName; QString mCableIdentification; //Cable name QString mCableType; //permanent or temporary QString mTestOperatorName; diff --git a/Sources/CableTestBench.cpp b/Sources/CableTestBench.cpp index fd55770..91bebe5 100644 --- a/Sources/CableTestBench.cpp +++ b/Sources/CableTestBench.cpp @@ -1,6 +1,8 @@ #include "CableTestBench.h" #include #include "CableTestBenchDefs.h" +#include +#include CCableTestBench::CCableTestBench(QObject *parent) : QObject(parent), @@ -30,6 +32,7 @@ int CCableTestBench::Start() mIOInterface.OpenIOModules(); mCableTestPageHandle->mGuiRefreshTimer.start(); + connect(&mCableTestReport,SIGNAL(NewTestLogEntry(QString)),mCableTestPageHandle,SLOT(AddTestLogEntry(QString))); return 1; } @@ -39,6 +42,11 @@ CCable * CCableTestBench::GetActualCable() return &mActualCable; } +CTestReport *CCableTestBench::GetTestReportHandle() +{ + return &mCableTestReport; +} + quint8 CCableTestBench::DecToBCDByte(const quint8 byte) { quint8 out = 0; @@ -114,7 +122,7 @@ int CCableTestBench::StartPauseAutomaticTestRequest() mCableTestPageHandle->FillReportCableParametersData(mCableTestReport.GetReportCableParameters()); mCableTestReport.GetReportCableParameters()->SetCableType(CConnectorDefs::GetConnectorDescription(mActualCable.GetInputConnector()->GetConnectorType()), CConnectorDefs::GetConnectorDescription(mActualCable.GetOutputConnector()->GetConnectorType())); - mCableTestReport.GetAutomatedTestReport()->SetPinCount(mActualCable.mOutputConnector.GetPinCount()); + mCableTestReport.GetAutomatedTestReport()->SetPinCount(mActualCable.GetOutputConnector()->GetPinCount()); mCableTestEngine.StartAutomatedTest(); return RET_OK; @@ -200,6 +208,19 @@ int CCableTestBench::CableEngineModeChanged(CCableTestEngine::eCableTestEngineMo case CCableTestEngine::CABLE_TEST_STBY_MODE: { mCableTestPageHandle->CableTestEnded(); + if(mCableTestReport.IsAutoTestReportReady()) + { + SaveReportRequest(); + mCableTestPageHandle->EnableOpenReportBtn(); + if(mCableTestReport.GetGlobalAutoTestResult() == true) + { + mCableTestPageHandle->SetAutoTestResult("Succès!",Qt::darkGreen); + } + else + { + mCableTestPageHandle->SetAutoTestResult("Échec",Qt::red); + } + } break; } case CCableTestEngine::CABLE_AUTO_TEST_RUNNING_MODE: @@ -239,3 +260,28 @@ int CCableTestBench::RefreshConnectorsStateRequest() mCableTestPageHandle->SetOutputConnectorState(mActualCable.GetOutputConnector()->GetOutputPinsStates()); return RET_OK; } + +int CCableTestBench::SaveReportRequest() +{ + return mCableTestReport.SaveReportToFile(); +} + +int CCableTestBench::OpenReportRequest() +{ + QString ReportFile = mCableTestReport.GetLastReportFileName(); + if(ReportFile.isEmpty()) + { + return RET_ERROR; + } + + QFileInfo FileInfo(ReportFile); + QString Command =FileInfo.absoluteFilePath(); + Command.prepend("notepad.exe "); + + + QProcess *process = new QProcess; + process->start(Command); + //QProcess::execute(Command); + + return RET_OK; +} diff --git a/Sources/CableTestBench.h b/Sources/CableTestBench.h index 251ce71..fb556a5 100644 --- a/Sources/CableTestBench.h +++ b/Sources/CableTestBench.h @@ -32,6 +32,7 @@ public: CCable mActualCable; CCableTestEngine mCableTestEngine; + CIOModulesInterface mIOInterface; int ExecVisualInspectionRequest(); @@ -42,11 +43,17 @@ public: int StartStopManualTestRequest(); int ManualPinToggleRequest(int ConnectorPinNbr); int RefreshConnectorsStateRequest(); + int SaveReportRequest(); + int OpenReportRequest(); + + CCable *SetSelectedConnector(CConnectorDefs::eConnectorType ConType); CCable *GetActualCable(); + CTestReport* GetTestReportHandle(); + int CableEngineModeChanged(CCableTestEngine::eCableTestEngineMode Mode); diff --git a/Sources/CableTestBenchDefs.cpp b/Sources/CableTestBenchDefs.cpp index 52f4310..43f5220 100644 --- a/Sources/CableTestBenchDefs.cpp +++ b/Sources/CableTestBenchDefs.cpp @@ -20,14 +20,14 @@ const int CConnectorDefs::ConnPinCount[NB_CONNECTOR_TYPE] = {0, 6, 14, 24, 72, 9 const char* CConnectorDefs::ConnectorDescription[NB_CONNECTOR_TYPE] = {"Connecteur inconnu ou invalide", "Connecteur circulaire 6 contacts", - "Connecteur circulair 14 contacts", + "Connecteur circulaire 14 contacts", "Connecteur Amphenol rectangulaire 24 contacts", "Connecteur Amphenol rectangulaire 72 contacts", "Connecteur Souriau rectangulaire 90 contacts", "Connecteur Amphenol rectangulaire 108 contacts", "Connecteur Souriau rectangulaire 120 contacts", "Connecteur circulaire 6 contacts", - "Connecteur circulair 14 contacts", + "Connecteur circulaire 14 contacts", "Connecteur Amphenol rectangulaire 24 contacts", "Connecteur Amphenol rectangulaire 72 contacts", "Connecteur Amphenol rectangulaire 108 contacts"}; @@ -83,3 +83,4 @@ const char * CConnectorDefs::GetConnectorDescription(eConnectorType type) return ConnectorDescription[type]; } + diff --git a/Sources/CableTestBenchDefs.h b/Sources/CableTestBenchDefs.h index 73af806..da9b4e4 100644 --- a/Sources/CableTestBenchDefs.h +++ b/Sources/CableTestBenchDefs.h @@ -1,5 +1,6 @@ #ifndef CABLETESTBENCHDEFS_H #define CABLETESTBENCHDEFS_H +#include class CConnectorDefs diff --git a/Sources/CableTestEngine.cpp b/Sources/CableTestEngine.cpp index f8b3f69..9a3cfb5 100644 --- a/Sources/CableTestEngine.cpp +++ b/Sources/CableTestEngine.cpp @@ -18,6 +18,9 @@ int CCableTestEngine::InitCableTestEngine(CCableTestBench *ProgramHandle) mTestCable = ProgramHandle->GetActualCable(); mTestInputConnectorHandle = mTestCable->GetInputConnector(); mTestOutputConnectorHandle = mTestCable->GetOutputConnector(); + mTestReportHandle = ProgramHandle->GetTestReportHandle(); + mAutoTestReportHandle = mTestReportHandle->GetAutomatedTestReport(); + mCableTestSMTimer = new QTimer(); @@ -27,7 +30,7 @@ int CCableTestEngine::InitCableTestEngine(CCableTestBench *ProgramHandle) connect(mCableTestSMTimer,SIGNAL(timeout()),this,SLOT(SMTimerExpired())); //TODO: Get this from the options page... - mPinHoldTime = 500; //ms + mPinHoldTime = 300; //ms CableTestEngineStateMachine(CABLE_TEST_TICK_SM_EVENT); @@ -76,7 +79,8 @@ void CCableTestEngine::CableTestEngineStateMachine(int Event) mCableTestGPTimer.start(); - qDebug("Test automatique démarré..."); + //qDebug("Test automatique démarré..."); + mTestReportHandle->AddLogEntry(QString("Démarrage du test automatique.")); break; }//case CABLE_TEST_START_AUTOMATED_TEST_STATE @@ -88,15 +92,33 @@ void CCableTestEngine::CableTestEngineStateMachine(int Event) } else { - if(mTestOutputConnectorHandle->GetOutputPinsStates().count(true) != 0) + QBitArray Out = mTestOutputConnectorHandle->GetOutputPinsStates(); + if(Out.count(true) != 0) { //TODO: Manage this failure mode - qDebug("Échec de l'auto test des modules de sortie"); + mAutoTestReportHandle->SetPreTestResult(false); + // qDebug("Échec de l'auto test des modules d'I/O"); + QString LogString = QString("Échec de l'auto test des modules de sortie. %1 contacts sont activés : "); + + for(int pin = 0; pin < Out.count(); pin++) + { + if(Out.at(pin)) + { + mAutoTestReportHandle->AddShortedPinToPinTest(mCurPinUnderTest,pin+1); + LogString.append(QString("[%1], ")); + } + } + + mTestReportHandle->AddLogEntry(LogString); + mCableTestSMState = CABLE_AUTO_TEST_END_TEST_STATE; + break; } else { mCurPinUnderTest = 1; mTestOutputConnectorHandle->SetSinglePin(mCurPinUnderTest); + mAutoTestReportHandle->SetPreTestResult(true); + mTestReportHandle->AddLogEntry(QString("Succès de l'auto test des modules d'I/O")); //OK } @@ -125,27 +147,52 @@ void CCableTestEngine::CableTestEngineStateMachine(int Event) if(In.count(true) != 1) //check if only 1 input pin is active { - //TODO: Manage this failure mode - if(In.count(true) == 0) //Check if no input pin is active { - qDebug("Échec du test du contact %d : aucune pin activée en entrée",mCurPinUnderTest); + mAutoTestReportHandle->SetPinContinuityResult(mCurPinUnderTest,false); +// qDebug("Échec du test du contact %d : aucune pin activée en entrée",mCurPinUnderTest); + mTestReportHandle->AddLogEntry(QString("Échec du test du contact %1 : aucun contact activé en entrée").arg(mCurPinUnderTest)); } else //If here, many input pins are active... { - qDebug("Échec du test du contact %d : plusieurs (%d) pins activées en entrée",mCurPinUnderTest,In.count(true)); + QString LogString = QString("Échec du test d'isolation du contact %1 : (%2) contacts activés en entrée : ").arg(mCurPinUnderTest).arg(In.count(true)); + mAutoTestReportHandle->SetPinIsolationResult(mCurPinUnderTest,false); + for(int pin = 0; pin < In.count(); pin++) + { + if(In.at(pin)) + { + mAutoTestReportHandle->AddShortedPinToPinTest(mCurPinUnderTest,pin+1); + LogString.append(QString("[%1]").arg(pin+1)); + } + } + // qDebug("Échec du test d'isolation du contact %d : (%d) contacts activés en entrée",mCurPinUnderTest,In.count(true)); + mTestReportHandle->AddLogEntry(LogString); } } else if(In.at(mCurPinUnderTest-1) == false) { //TODO: Manage this failure mode - //the output pin isn't set... - qDebug("Échec du test du contact %d: mauvais contact activé en entrée",mCurPinUnderTest); + //the wrong pin is set on the input... find which + + int WrongPin = 0; + for(int pin = 0; pin < In.count(); pin++) + { + if(In.at(pin)) + { + WrongPin = pin+1; + break; + } + } + mAutoTestReportHandle->SetPinConcordanceTestResult(mCurPinUnderTest,false,WrongPin); + mTestReportHandle->AddLogEntry(QString("Échec du test d'assignation du contact %1: le contact %2 est activé.").arg(mCurPinUnderTest).arg(WrongPin)); + // qDebug("Échec du test d'assignation du contact %d: le contact %d est activé.",mCurPinUnderTest); } else { //Pin test passed. Test the next one - qDebug("Succès du test du contact %d", mCurPinUnderTest); + mAutoTestReportHandle->SetPinTestAllPassed(mCurPinUnderTest); + // qDebug("Succès du test du contact %d", mCurPinUnderTest); + mTestReportHandle->AddLogEntry(QString("Succès du test du contact %1").arg(mCurPinUnderTest)); } mCurPinUnderTest++; if(mCurPinUnderTest > (mTestOutputConnectorHandle->GetPinCount())) @@ -166,13 +213,15 @@ void CCableTestEngine::CableTestEngineStateMachine(int Event) { mCableTestSMState = CABLE_AUTO_TEST_PAUSE_STATE; mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode()); - qDebug("Test mis en pause..."); +// qDebug("Test mis en pause..."); + mTestReportHandle->AddLogEntry(QString("Test mis en pause")); break; } case CABLE_TEST_CANCEL_AUTO_TEST_SM_EVENT: { mCableTestSMState = CABLE_AUTO_TEST_END_TEST_STATE; - qDebug("Test annulé..."); +// qDebug("Test annulé..."); + mTestReportHandle->AddLogEntry(QString("Test annulé par l'utilisateur")); break; } default: @@ -193,13 +242,15 @@ void CCableTestEngine::CableTestEngineStateMachine(int Event) { mCableTestSMState = CABLE_AUTO_TEST_PINS_STATE; mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode()); - qDebug("Test redémarré..."); +// qDebug("Test redémarré..."); + mTestReportHandle->AddLogEntry(QString("Test redémarré...")); break; } case CABLE_TEST_CANCEL_AUTO_TEST_SM_EVENT: { mCableTestSMState = CABLE_AUTO_TEST_END_TEST_STATE; - qDebug("Test annulé..."); +// qDebug("Test annulé..."); + mTestReportHandle->AddLogEntry(QString("Test annulé par l'utilisateur")); break; } default: @@ -213,7 +264,8 @@ void CCableTestEngine::CableTestEngineStateMachine(int Event) case CABLE_AUTO_TEST_END_TEST_STATE: { - qDebug("Test automatique terminé..."); +// qDebug("Test automatique terminé..."); + mTestReportHandle->AddLogEntry(QString("Test automatique terminé")); mTestOutputConnectorHandle->ClearAllPins(); mCableTestSMState = CABLE_TEST_STBY_STATE; mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode()); @@ -223,7 +275,8 @@ void CCableTestEngine::CableTestEngineStateMachine(int Event) case CABLE_TEST_START_MANUAL_TEST_STATE: { mTestOutputConnectorHandle->ClearAllPins(); - qDebug("Entrée en mode test manuel"); + // qDebug("Entrée en mode test manuel"); + mTestReportHandle->AddLogEntry(QString("Entrée en mode test manuel")); mCableTestSMState = CABLE_MANUAL_TEST_PINS_STATE; mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode()); break; @@ -252,6 +305,7 @@ void CCableTestEngine::CableTestEngineStateMachine(int Event) mTestOutputConnectorHandle->ClearAllPins(); mCableTestSMState = CABLE_TEST_STBY_STATE; mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode()); + mTestReportHandle->AddLogEntry(QString("Fin du test manuel")); break; } } diff --git a/Sources/CableTestEngine.h b/Sources/CableTestEngine.h index 41f50e6..ee2678b 100644 --- a/Sources/CableTestEngine.h +++ b/Sources/CableTestEngine.h @@ -79,6 +79,8 @@ private: QTimer *mCableTestSMTimer; QElapsedTimer mCableTestGPTimer; + CAutomatedTestReport *mAutoTestReportHandle; + CTestReport *mTestReportHandle; void CableTestEngineStateMachine(int Event); diff --git a/Sources/CableTestPage.cpp b/Sources/CableTestPage.cpp index 569952f..ec4928a 100644 --- a/Sources/CableTestPage.cpp +++ b/Sources/CableTestPage.cpp @@ -3,6 +3,7 @@ #include "CableTestBench.h" #include #include "CableParametersData.h" +#include CCableTestPage::CCableTestPage(QWidget *parent) : QWidget(parent), @@ -14,6 +15,15 @@ CCableTestPage::CCableTestPage(QWidget *parent) : ui->setupUi(this); mProgramHandle = 0; + ui->mStationNameCombo->insertItem(0,"Frontenac",QVariant("1S52")); + ui->mStationNameCombo->insertItem(1,"Côte-Vertu",QVariant("2S22")); + ui->mStationNameCombo->insertItem(2,"Angrignon",QVariant("1S18")); + ui->mStationNameCombo->insertItem(3,"Garage Angrignon",QVariant("1G17")); + ui->mStationNameCombo->insertItem(4,"Atwater",QVariant("1S34")); + ui->mStationNameCombo->insertItem(5,"Lionel-Groulx",QVariant("1S32")); + ui->mStationNameCombo->insertItem(6,"Viau",QVariant("1S60")); + + mInspectionNotDonePixmap = QPixmap("./images/todo.png").scaled(ui->mInspectionDoneIcon->geometry().width(),ui->mInspectionDoneIcon->geometry().height()); mInspectionDonePixmap = QPixmap("./images/done1.png").scaled(ui->mInspectionDoneIcon->geometry().width(),ui->mInspectionDoneIcon->geometry().height()); ui->mInspectionDoneIcon->setPixmap(mInspectionNotDonePixmap); @@ -35,6 +45,8 @@ CCableTestPage::CCableTestPage(QWidget *parent) : connect(ui->mStartManualTestBtn,SIGNAL(clicked()),this,SLOT(StartManualTestBtnClicked())); connect(ui->mOutputTestVisualisationWidget,SIGNAL(PinClicked(int)),this,SLOT(OutputConnectorPinClicked(int))); connect(&mGuiRefreshTimer,SIGNAL(timeout()),this,SLOT(GuiRefreshTimerExpired())); + connect(ui->mSaveReportBtn,SIGNAL(clicked()),this,SLOT(SaveReportBtnClicked())); + connect(ui->mOpenReportBtn,SIGNAL(clicked()),this,SLOT(OpenReportBtnClicked())); @@ -44,6 +56,8 @@ CCableTestPage::CCableTestPage(QWidget *parent) : ui->mStartTestBtn->setEnabled(false); ui->mStartManualTestBtn->setEnabled(false); ui->mOutputTestVisualisationWidget->DisablePinClicks(); + // ui->mOpenReportBtn->setEnabled(false); + ResetCable(); @@ -127,6 +141,12 @@ int CCableTestPage::ResetCable() //Clear connector selection zone ui->mConnectorSelectWidget->ClearAllConnectorsSelections(); + ui->mTestLogTextBox->clear(); + + ui->mSaveReportBtn->setEnabled(false); + ui->mOpenReportBtn->setEnabled(false); + SetAutoTestResult(""); + return RET_OK; } @@ -149,7 +169,8 @@ int CCableTestPage::CableAutomaticTestStarted() { ui->mStartManualTestBtn->setEnabled(false); DisableGuiForTest(); - ui->mStartTestBtn->setText("Pauser Test"); + ui->mStartTestBtn->setText("Interrompre Test"); + SetAutoTestResult("En Cours...",Qt::black); return RET_OK; } @@ -168,6 +189,8 @@ int CCableTestPage::CableTestEnded() ui->mStartTestBtn->setText("Démarrer Test"); ui->mStartManualTestBtn->setText("Démarrer"); ui->mReinitTestBtn->setEnabled(true); + ui->mSaveReportBtn->setEnabled(true); + return RET_OK; } @@ -178,6 +201,7 @@ int CCableTestPage::CableManualTestStarted() DisableGuiForTest(); ui->mStartManualTestBtn->setText("Terminer"); ui->mReinitTestBtn->setEnabled(false); + ui->mSaveReportBtn->setEnabled(false); return RET_OK; } @@ -241,6 +265,42 @@ void CCableTestPage::hideEvent(QHideEvent *event) int CCableTestPage::FillReportCableParametersData(CCableParametersData *ReportPtr) { - ReportPtr->SetCableParams(ui->mStationNameCombo->currentText(),ui->mIdentCableEditBox->text(),ui->mTypeCableCombo->currentText(),ui->mNomTesteurEditBox->text()); + ReportPtr->SetCableParams(ui->mStationNameCombo->currentText(), + ui->mStationNameCombo->itemData(ui->mStationNameCombo->currentIndex()).toString(), + ui->mIdentCableEditBox->text(), + ui->mTypeCableCombo->currentText(), + ui->mNomTesteurEditBox->text()); + return RET_OK; +} + +void CCableTestPage::AddTestLogEntry(QString Entry) +{ + ui->mTestLogTextBox->insertPlainText(Entry); + ui->mTestLogTextBox->verticalScrollBar()->setValue(ui->mTestLogTextBox->verticalScrollBar()->maximum()); +} + +void CCableTestPage::SaveReportBtnClicked() +{ + mProgramHandle->SaveReportRequest(); +} + +void CCableTestPage::OpenReportBtnClicked() +{ + mProgramHandle->OpenReportRequest(); +} + +int CCableTestPage::EnableOpenReportBtn() +{ + ui->mOpenReportBtn->setEnabled(true); + return RET_OK; +} + +int CCableTestPage::SetAutoTestResult(QString Result, QColor color) +{ + QPalette pal; + pal.setColor(QPalette::WindowText,color); + ui->mAutoTestResultLabel->setPalette(pal); + ui->mAutoTestResultLabel->setText(Result); + return RET_OK; } diff --git a/Sources/CableTestPage.h b/Sources/CableTestPage.h index 2b54c86..e92e3e9 100644 --- a/Sources/CableTestPage.h +++ b/Sources/CableTestPage.h @@ -37,6 +37,9 @@ public: int CableTestEnded(); int CableManualTestStarted(); + int SetAutoTestResult(QString Result, QColor color = Qt::black); + int EnableOpenReportBtn(); + int SetInputConnectorState(QBitArray PinStates); int SetOutputConnectorState(QBitArray PinStates); @@ -66,6 +69,9 @@ public slots: void StartManualTestBtnClicked(); void OutputConnectorPinClicked(int PinNbr); void GuiRefreshTimerExpired(); + void AddTestLogEntry(QString Entry); + void SaveReportBtnClicked(); + void OpenReportBtnClicked(); }; #endif // CABLETESTPAGE_H diff --git a/Sources/CableTestPage.ui b/Sources/CableTestPage.ui index 0201977..93949da 100644 --- a/Sources/CableTestPage.ui +++ b/Sources/CableTestPage.ui @@ -82,43 +82,7 @@ - - - - Frontenac - - - - - Côte-Vertu - - - - - Angrignon - - - - - Garage Angrignon - - - - - Atwater - - - - - Lionel-Groulx - - - - - Viau - - - + @@ -478,6 +442,19 @@ + + + + 360 + 100 + 121 + 23 + + + + Sauvegarder Rapport + + @@ -513,6 +490,53 @@ QFrame::Plain + + + + 600 + 220 + 231 + 131 + + + + Résultat du test + + + + + 30 + 40 + 181 + 41 + + + + + 26 + + + + En cours... + + + Qt::AlignCenter + + + + + + 70 + 100 + 101 + 23 + + + + Ouvrir Rapport + + + diff --git a/Sources/TestReport.cpp b/Sources/TestReport.cpp index 49f4aca..e03a635 100644 --- a/Sources/TestReport.cpp +++ b/Sources/TestReport.cpp @@ -1,9 +1,16 @@ #include "TestReport.h" +#include +#include +#include +#include +#include CTestReport::CTestReport() { mSoftwareVersion = QString(TEST_BENCH_VERSION); CreateNewTestReport(); + mReportFileDirectory = "./Rapports/"; + QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); } CVisualInspectionResult * CTestReport::GetInspectionResult() @@ -21,6 +28,147 @@ int CTestReport::CreateNewTestReport() mVisualInspectionResultReport.ClearResults(); mCableParameters.ResetData(); mAutomatedTestReport.ClearAutomatedTestReport(); + mTestLog.clear(); + mLastReportName.clear(); return RET_OK; } + +int CTestReport::AddLogEntry(QString NewEntry, bool IncludeTime, bool Propagate) +{ + if(NewEntry.isEmpty()) + { + return RET_ERROR; + } + + if(IncludeTime) + { + QString Time = QDateTime::currentDateTime().toString("hh:mm:ss.zzz - "); + NewEntry.prepend(Time); + } + + qDebug(NewEntry.toAscii().data()); + + if(NewEntry.endsWith(QChar('\n')) == false) + { + NewEntry.append(QChar('\n')); + } + + if(Propagate) + { + emit NewTestLogEntry(NewEntry); + } + + mTestLog.append(NewEntry); + + + return RET_OK; +} + +CAutomatedTestReport *CTestReport::GetAutomatedTestReport() +{ + return &mAutomatedTestReport; +} + +int CTestReport::SaveReportToFile() +{ + QFile *ReportFile; + //QTextStream ReportStream; + + + QString Filename = QDateTime::currentDateTime().toString("yyMMdd_hhmmss_"); + Filename.append(mCableParameters.mStationCodeName); + Filename.append(mCableParameters.mCableIdentification); + Filename.append(".txt"); + Filename.prepend(mReportFileDirectory); + + + ReportFile = new QFile(Filename); + + if (!ReportFile->open(QIODevice::ReadWrite |QIODevice::Truncate | QIODevice::Text)) + { + AddLogEntry(QString("Impossible de sauvegarder le rapport %1").arg(Filename),false); + QMessageBox::critical(NULL,"Erreur de sauvegarde",QString("Impossible de sauvegarder le fichier rapport \n%1").arg(Filename)); + + return RET_ERROR; + } + + mLastReportName = Filename; + + QTextStream ReportStream(ReportFile); + ReportStream.setCodec(QTextCodec::codecForName("UTF-8")); + + ReportStream << QString("Rapport de test - Câble SEI\n"); + ReportStream << QString("Date de l'essai: ") << QDateTime::currentDateTime().toString("yyyy-MM-dd") << "\n"; + ReportStream << "Version du logiciel de test: " << mSoftwareVersion << "\n\n"; + ReportStream << "-----------------------------------------\n"; + ReportStream << QString("Paramètres du câble: \n"); + ReportStream << QString("Identification du câble: ") << mCableParameters.mCableIdentification << "\n"; + ReportStream << "Station: " << mCableParameters.mStationCodeName << " - "<< mCableParameters.mStationName << "\n"; + ReportStream << "Type: " << mCableParameters.mCableType << "\n"; + ReportStream << QString("Opérateur du test: ") << mCableParameters.mTestOperatorName << "\n"; + ReportStream << QString("Connecteur d'entrée: ") << mCableParameters.mInputConnectorType << "\n"; + ReportStream << "Connecteur de sortie: " << mCableParameters.mOutputConnectorType << "\n\n"; + ReportStream << "-----------------------------------------\n"; + ReportStream << QString("Résultats de l'inspection visuelle:\n"); + ReportStream << QString("Section 5.2 exécutée: ") << mVisualInspectionResultReport.mVerif52ExecResultText << "\n"; + ReportStream << QString("Section 5.3 exécutée: ") << mVisualInspectionResultReport.mVerif53ExecResultText << "\n"; + ReportStream << QString("Section 5.4 exécutée: ") << mVisualInspectionResultReport.mVerif54ExecResultText << "\n"; + ReportStream << QString("Section 5.5 exécutée: ") << mVisualInspectionResultReport.mVerif55ExecResultText << "\n"; + ReportStream << QString("Section 5.6 exécutée: ") << mVisualInspectionResultReport.mVerif56ExecResultText << "\n\n"; + ReportStream << "Notes d'inspection:\n\n"; + ReportStream << mVisualInspectionResultReport.mVerifNotesText << "\n\n"; + ReportStream << "-----------------------------------------\n"; + ReportStream << QString("Résultats du test automatique du câble:\n"); + ReportStream << QString("Lorsqu'applicable, les valeurs entre crochets [] correspondent aux contacts en défaut.\n\n"); + ReportStream.setFieldWidth(15); + ReportStream.setFieldAlignment(QTextStream::AlignCenter); + ReportStream << "No. Contact" << QString("Continuité") << "Isolation" << "Assignation" << QString("2è test") << qSetFieldWidth(0) << "\n"; + + + + for(int pin = 1; pin <= mAutomatedTestReport.mPinCount; pin++) + { + ReportStream.setFieldWidth(15); + ReportStream.setFieldAlignment(QTextStream::AlignCenter); + + ReportStream << QString("%1").arg(pin) << + mAutomatedTestReport.GetPinContinuityResult(pin) << + mAutomatedTestReport.GetPinIsolationResult(pin) << + mAutomatedTestReport.GetPinConcordanceResult(pin) << + mAutomatedTestReport.GetPinSecondTestResult(pin) << qSetFieldWidth(0) << + " \n"; + + } + + + + ReportStream << QString("\n\n\n Signature de l'opérateur de test: _________________________________________\n\n"); + ReportStream << "-----------------------------------------\n"; + ReportStream << "Log du test:\n"; + ReportStream << mTestLog; + + ReportFile->close(); + delete ReportFile; + + return RET_OK; +} + +bool CTestReport::IsAutoTestReportReady() +{ + if(mAutomatedTestReport.GetPinCount() == 0) + { + return false; + } + return true; +} + +bool CTestReport::GetGlobalAutoTestResult() +{ + return mAutomatedTestReport.IsAutomatedTestSuccess(); +} + +QString CTestReport::GetLastReportFileName() +{ + return mLastReportName; +} diff --git a/Sources/TestReport.h b/Sources/TestReport.h index 8a6f912..6a3f7ef 100644 --- a/Sources/TestReport.h +++ b/Sources/TestReport.h @@ -6,9 +6,11 @@ #include "CableParametersData.h" #include "TestBenchVersion.h" #include "AutomatedTestReport.h" +#include -class CTestReport +class CTestReport : public QObject { + Q_OBJECT public: CTestReport(); @@ -17,12 +19,25 @@ public: CAutomatedTestReport *GetAutomatedTestReport(); int CreateNewTestReport(); + int AddLogEntry(QString NewEntry,bool IncludeTime = true,bool Propagate = true); + bool IsAutoTestReportReady(); + bool GetGlobalAutoTestResult(); + + int SaveReportToFile(); + + QString GetLastReportFileName(); private: CVisualInspectionResult mVisualInspectionResultReport; CCableParametersData mCableParameters; CAutomatedTestReport mAutomatedTestReport; QString mSoftwareVersion; + QString mTestLog; + QString mReportFileDirectory; + QString mLastReportName; + +signals: + void NewTestLogEntry(QString NewEntry); }; #endif // TESTREPORT_H diff --git a/Sources/VisualInspectionResult.cpp b/Sources/VisualInspectionResult.cpp index ff1d44a..177c63c 100644 --- a/Sources/VisualInspectionResult.cpp +++ b/Sources/VisualInspectionResult.cpp @@ -1,6 +1,8 @@ #include "VisualInspectionResult.h" #include +const char * CVisualInspectionResult::mTextualResults[3] = {"N/A","Oui","Non"}; + CVisualInspectionResult::CVisualInspectionResult() { ClearResults(); @@ -9,6 +11,7 @@ CVisualInspectionResult::CVisualInspectionResult() int CVisualInspectionResult::ClearResults() { mVerif52ExecResult = mVerif53ExecResult = mVerif54ExecResult = mVerif55ExecResult = mVerif56ExecResult = VERIF_UNKNOWN_RESULT; + mVerif52ExecResultText = mVerif53ExecResultText = mVerif54ExecResultText = mVerif55ExecResultText = mVerif56ExecResultText = "Non"; mVerifNotesText.clear(); return RET_OK; @@ -17,10 +20,10 @@ int CVisualInspectionResult::ClearResults() bool CVisualInspectionResult::IsVisualInspectionResultComplete() { if(mVerif52ExecResult != VERIF_UNKNOWN_RESULT && - mVerif53ExecResult != VERIF_UNKNOWN_RESULT && - mVerif54ExecResult != VERIF_UNKNOWN_RESULT && - mVerif55ExecResult != VERIF_UNKNOWN_RESULT && - mVerif56ExecResult != VERIF_UNKNOWN_RESULT ) + mVerif53ExecResult != VERIF_UNKNOWN_RESULT && + mVerif54ExecResult != VERIF_UNKNOWN_RESULT && + mVerif55ExecResult != VERIF_UNKNOWN_RESULT && + mVerif56ExecResult != VERIF_UNKNOWN_RESULT ) { return true; } @@ -31,10 +34,20 @@ bool CVisualInspectionResult::IsVisualInspectionResultComplete() int CVisualInspectionResult::SetVisualInspectionResult(eVerifExecResult Verif52, eVerifExecResult Verif53, eVerifExecResult Verif54, eVerifExecResult Verif55, eVerifExecResult Verif56, QString Notes) { mVerif52ExecResult = Verif52; + mVerif52ExecResultText = mTextualResults[Verif52]; + mVerif53ExecResult = Verif53; + mVerif53ExecResultText = mTextualResults[Verif53]; + mVerif54ExecResult = Verif54; + mVerif54ExecResultText = mTextualResults[Verif54]; + mVerif55ExecResult = Verif55; + mVerif55ExecResultText = mTextualResults[Verif55]; + mVerif56ExecResult = Verif56; + mVerif56ExecResultText = mTextualResults[Verif56]; + mVerifNotesText = Notes; return RET_OK; } diff --git a/Sources/VisualInspectionResult.h b/Sources/VisualInspectionResult.h index 6cde2a9..fc58437 100644 --- a/Sources/VisualInspectionResult.h +++ b/Sources/VisualInspectionResult.h @@ -15,10 +15,12 @@ public: VERIF_NOT_DONE_RESULT }; + static const char* mTextualResults[3]; CVisualInspectionResult(); eVerifExecResult mVerif52ExecResult, mVerif53ExecResult, mVerif54ExecResult, mVerif55ExecResult, mVerif56ExecResult; + QString mVerif52ExecResultText, mVerif53ExecResultText, mVerif54ExecResultText, mVerif55ExecResultText, mVerif56ExecResultText; QString mVerifNotesText; int ClearResults(); diff --git a/object_script.CableTestBench.Debug b/object_script.CableTestBench.Debug index a12e37c..42658a8 100644 --- a/object_script.CableTestBench.Debug +++ b/object_script.CableTestBench.Debug @@ -30,6 +30,7 @@ INPUT( ./debug\moc_ConnectorClickZoneWidget.o ./debug\moc_ONOFFStatusWidget.o ./debug\moc_ConnectorTestVisualizationWidget.o +./debug\moc_TestReport.o ./debug\moc_CableTestEngine.o ./debug\moc_OptionsPage.o ./debug\moc_IOModulesInterface.o diff --git a/object_script.CableTestBench.Release b/object_script.CableTestBench.Release index 81e3640..06048cf 100644 --- a/object_script.CableTestBench.Release +++ b/object_script.CableTestBench.Release @@ -30,6 +30,7 @@ INPUT( ./release\moc_ConnectorClickZoneWidget.o ./release\moc_ONOFFStatusWidget.o ./release\moc_ConnectorTestVisualizationWidget.o +./release\moc_TestReport.o ./release\moc_CableTestEngine.o ./release\moc_OptionsPage.o ./release\moc_IOModulesInterface.o diff --git a/ui_CMainPage.h b/ui_CMainPage.h index adabfe0..628004c 100644 --- a/ui_CMainPage.h +++ b/ui_CMainPage.h @@ -1,7 +1,7 @@ /******************************************************************************** ** Form generated from reading UI file 'CMainPage.ui' ** -** Created: Wed May 8 10:13:26 2019 +** Created: Fri May 10 14:02:03 2019 ** by: Qt User Interface Compiler version 4.8.1 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! diff --git a/ui_CableTestPage.h b/ui_CableTestPage.h index 80ce69c..9aa88ae 100644 --- a/ui_CableTestPage.h +++ b/ui_CableTestPage.h @@ -1,7 +1,7 @@ /******************************************************************************** ** Form generated from reading UI file 'CableTestPage.ui' ** -** Created: Wed May 8 11:18:26 2019 +** Created: Fri May 10 15:48:28 2019 ** by: Qt User Interface Compiler version 4.8.1 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! @@ -66,8 +66,12 @@ public: QPushButton *mReinitTestBtn; QGroupBox *groupBox_2; QPushButton *mStartManualTestBtn; + QPushButton *mSaveReportBtn; QLabel *mInspVisuelleLabel_2; QTextBrowser *mTestLogTextBox; + QGroupBox *groupBox_3; + QLabel *mAutoTestResultLabel; + QPushButton *mOpenReportBtn; void setupUi(QWidget *CCableTestPage) { @@ -218,6 +222,9 @@ public: mStartManualTestBtn = new QPushButton(groupBox_2); mStartManualTestBtn->setObjectName(QString::fromUtf8("mStartManualTestBtn")); mStartManualTestBtn->setGeometry(QRect(20, 30, 75, 23)); + mSaveReportBtn = new QPushButton(frame); + mSaveReportBtn->setObjectName(QString::fromUtf8("mSaveReportBtn")); + mSaveReportBtn->setGeometry(QRect(360, 100, 121, 23)); mInspVisuelleLabel_2 = new QLabel(CCableTestPage); mInspVisuelleLabel_2->setObjectName(QString::fromUtf8("mInspVisuelleLabel_2")); mInspVisuelleLabel_2->setGeometry(QRect(50, 200, 221, 20)); @@ -227,6 +234,19 @@ public: mTestLogTextBox->setGeometry(QRect(970, 550, 381, 201)); mTestLogTextBox->setFrameShape(QFrame::Box); mTestLogTextBox->setFrameShadow(QFrame::Plain); + groupBox_3 = new QGroupBox(CCableTestPage); + groupBox_3->setObjectName(QString::fromUtf8("groupBox_3")); + groupBox_3->setGeometry(QRect(600, 220, 231, 131)); + mAutoTestResultLabel = new QLabel(groupBox_3); + mAutoTestResultLabel->setObjectName(QString::fromUtf8("mAutoTestResultLabel")); + mAutoTestResultLabel->setGeometry(QRect(30, 40, 181, 41)); + QFont font2; + font2.setPointSize(26); + mAutoTestResultLabel->setFont(font2); + mAutoTestResultLabel->setAlignment(Qt::AlignCenter); + mOpenReportBtn = new QPushButton(groupBox_3); + mOpenReportBtn->setObjectName(QString::fromUtf8("mOpenReportBtn")); + mOpenReportBtn->setGeometry(QRect(70, 100, 101, 23)); retranslateUi(CCableTestPage); @@ -242,16 +262,6 @@ public: << QApplication::translate("CCableTestPage", "Permanent", 0, QApplication::UnicodeUTF8) << QApplication::translate("CCableTestPage", "Temporaire", 0, QApplication::UnicodeUTF8) ); - mStationNameCombo->clear(); - mStationNameCombo->insertItems(0, QStringList() - << QApplication::translate("CCableTestPage", "Frontenac", 0, QApplication::UnicodeUTF8) - << QApplication::translate("CCableTestPage", "C\303\264te-Vertu", 0, QApplication::UnicodeUTF8) - << QApplication::translate("CCableTestPage", "Angrignon", 0, QApplication::UnicodeUTF8) - << QApplication::translate("CCableTestPage", "Garage Angrignon", 0, QApplication::UnicodeUTF8) - << QApplication::translate("CCableTestPage", "Atwater", 0, QApplication::UnicodeUTF8) - << QApplication::translate("CCableTestPage", "Lionel-Groulx", 0, QApplication::UnicodeUTF8) - << QApplication::translate("CCableTestPage", "Viau", 0, QApplication::UnicodeUTF8) - ); StationNameLabel->setText(QApplication::translate("CCableTestPage", "Station", 0, QApplication::UnicodeUTF8)); mTypeCableLabel->setText(QApplication::translate("CCableTestPage", "Type c\303\242ble", 0, QApplication::UnicodeUTF8)); mIdentCableLabel->setText(QApplication::translate("CCableTestPage", "Identification du c\303\242ble", 0, QApplication::UnicodeUTF8)); @@ -274,7 +284,11 @@ public: mReinitTestBtn->setText(QApplication::translate("CCableTestPage", "R\303\251initialiser test", 0, QApplication::UnicodeUTF8)); groupBox_2->setTitle(QApplication::translate("CCableTestPage", "Test Manuel", 0, QApplication::UnicodeUTF8)); mStartManualTestBtn->setText(QApplication::translate("CCableTestPage", "Ex\303\251cuter", 0, QApplication::UnicodeUTF8)); + mSaveReportBtn->setText(QApplication::translate("CCableTestPage", "Sauvegarder Rapport", 0, QApplication::UnicodeUTF8)); mInspVisuelleLabel_2->setText(QApplication::translate("CCableTestPage", "Contr\303\264le du test \303\251lectrique", 0, QApplication::UnicodeUTF8)); + groupBox_3->setTitle(QApplication::translate("CCableTestPage", "R\303\251sultat du test", 0, QApplication::UnicodeUTF8)); + mAutoTestResultLabel->setText(QApplication::translate("CCableTestPage", "En cours...", 0, QApplication::UnicodeUTF8)); + mOpenReportBtn->setText(QApplication::translate("CCableTestPage", "Ouvrir Rapport", 0, QApplication::UnicodeUTF8)); } // retranslateUi }; diff --git a/ui_OptionsPage.h b/ui_OptionsPage.h index 554a801..27f08ed 100644 --- a/ui_OptionsPage.h +++ b/ui_OptionsPage.h @@ -1,7 +1,7 @@ /******************************************************************************** ** Form generated from reading UI file 'OptionsPage.ui' ** -** Created: Wed May 8 10:13:26 2019 +** Created: Fri May 10 14:02:03 2019 ** by: Qt User Interface Compiler version 4.8.1 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! diff --git a/ui_VisualInspectionPage.h b/ui_VisualInspectionPage.h index 8ed39f1..ff7fe16 100644 --- a/ui_VisualInspectionPage.h +++ b/ui_VisualInspectionPage.h @@ -1,7 +1,7 @@ /******************************************************************************** ** Form generated from reading UI file 'VisualInspectionPage.ui' ** -** Created: Wed May 8 10:13:26 2019 +** Created: Fri May 10 14:02:03 2019 ** by: Qt User Interface Compiler version 4.8.1 ** ** WARNING! All changes made in this file will be lost when recompiling UI file!