From 861cbe1f68cffa0a5cbafe695733250c33a98413 Mon Sep 17 00:00:00 2001 From: JF Date: Thu, 20 Jul 2017 11:11:06 -0400 Subject: [PATCH] Creation --- .gitignore | 14 + Configuration/Settings.ozs | Bin 0 -> 406 bytes Images/GuiBackground.jpg | Bin 0 -> 80906 bytes Images/Play Normal.png | Bin 0 -> 12480 bytes Images/Save-icon.png | Bin 0 -> 24805 bytes Images/Slider_Green.png | Bin 0 -> 4561 bytes Images/Slider_Red.png | Bin 0 -> 4274 bytes Images/csv.png | Bin 0 -> 34700 bytes Images/database.png | Bin 0 -> 85471 bytes Images/ethernet.png | Bin 0 -> 76745 bytes Images/file_delete.png | Bin 0 -> 17973 bytes Images/gps_disconnected-.png | Bin 0 -> 16109 bytes Images/green-led-off-md.png | Bin 0 -> 26020 bytes Images/green-led-on-md.png | Bin 0 -> 24094 bytes Images/green_check.png | Bin 0 -> 33461 bytes Images/log.png | Bin 0 -> 24977 bytes Images/open-file-icon.png | Bin 0 -> 14964 bytes Images/pushbutton-green.png | Bin 0 -> 151453 bytes Images/red-led-off-md.png | Bin 0 -> 25321 bytes Images/red-led-on-md.png | Bin 0 -> 24226 bytes Images/red_cross.png | Bin 0 -> 69821 bytes Images/tools.png | Bin 0 -> 9408 bytes Makefile | 147 ++ Makefile.Debug | 709 ++++++++++ Makefile.Release | 709 ++++++++++ OutilZT.pro | 84 ++ sources/DirParserThread.cpp | 103 ++ sources/DirParserThread.h | 34 + sources/GlobalDefine.h | 77 ++ sources/GuiElements/AnalogGraphItem.cpp | 412 ++++++ sources/GuiElements/AnalogGraphItem.h | 60 + sources/GuiElements/DatabaseMgrPage.cpp | 904 ++++++++++++ sources/GuiElements/DatabaseMgrPage.h | 157 +++ sources/GuiElements/EventsRulerWidget.cpp | 127 ++ sources/GuiElements/EventsRulerWidget.h | 65 + sources/GuiElements/GraphCursorWidget.cpp | 138 ++ sources/GuiElements/GraphCursorWidget.h | 76 + sources/GuiElements/GraphItem.cpp | 254 ++++ sources/GuiElements/GraphItem.h | 56 + sources/GuiElements/GraphRulerWidget.cpp | 228 +++ sources/GuiElements/GraphRulerWidget.h | 60 + sources/GuiElements/GuiPage.cpp | 42 + sources/GuiElements/Guipage.h | 52 + sources/GuiElements/LogViewPage.cpp | 1229 +++++++++++++++++ sources/GuiElements/LogViewPage.h | 205 +++ sources/GuiElements/LogsListPage.cpp | 802 +++++++++++ sources/GuiElements/LogsListPage.h | 104 ++ sources/GuiElements/MainPage.cpp | 133 ++ sources/GuiElements/MainPage.h | 77 ++ sources/GuiElements/NetworkCtrlPage.cpp | 216 +++ sources/GuiElements/NetworkCtrlPage.h | 87 ++ sources/GuiElements/NetworkZTListPage.cpp | 490 +++++++ sources/GuiElements/NetworkZTListPage.h | 85 ++ sources/GuiElements/OptionsPage.cpp | 211 +++ sources/GuiElements/OptionsPage.h | 83 ++ sources/GuiElements/ProgressBarPage.cpp | 118 ++ sources/GuiElements/ProgressBarPage.h | 78 ++ sources/GuiElements/PushButton.cpp | 258 ++++ sources/GuiElements/PushButton.h | 77 ++ sources/GuiElements/RankRulerWidget.cpp | 293 ++++ sources/GuiElements/RankRulerWidget.h | 74 + sources/GuiElements/RemoteZTCtrlPage.cpp | 395 ++++++ sources/GuiElements/RemoteZTCtrlPage.h | 82 ++ sources/GuiElements/RemoteZTPage.cpp | 182 +++ sources/GuiElements/RemoteZTPage.h | 74 + sources/GuiElements/TextButtonWidget.cpp | 277 ++++ sources/GuiElements/TextButtonWidget.h | 64 + sources/GuiElements/ToggleButtonWidget.cpp | 130 ++ sources/GuiElements/ToggleButtonWidget.h | 47 + .../GuiElements/ToggleTextButtonWidget.cpp | 91 ++ sources/GuiElements/ToggleTextButtonWidget.h | 44 + sources/GuiElements/TxRxWidget.cpp | 92 ++ sources/GuiElements/TxRxWidget.h | 33 + sources/GuiElements/ZTLogViewerPage.cpp | 165 +++ sources/GuiElements/ZTLogViewerPage.h | 74 + sources/GuiElements/ZTLogsListPage.cpp | 272 ++++ sources/GuiElements/ZTLogsListPage.h | 91 ++ sources/LogMgr.cpp | 643 +++++++++ sources/LogMgr.h | 143 ++ sources/MainPanel.cpp | 226 +++ sources/MainPanel.h | 101 ++ sources/NetworkManager.cpp | 500 +++++++ sources/NetworkManager.h | 127 ++ sources/OutilZT.cpp | 736 ++++++++++ sources/OutilZT.h | 158 +++ sources/OutilZTVersion.h | 6 + sources/Settings.cpp | 140 ++ sources/Settings.h | 22 + sources/TCPProtocol.cpp | 330 +++++ sources/TCPProtocol.h | 146 ++ sources/TrainLogFileMgr.cpp | 952 +++++++++++++ sources/TrainLogFileMgr.h | 61 + sources/UDPProtocol.cpp | 41 + sources/UDPProtocol.h | 33 + sources/ZTData.cpp | 373 +++++ sources/ZTData.h | 348 +++++ sources/ZTLogFilesMgr.cpp | 391 ++++++ sources/ZTLogFilesMgr.h | 83 ++ sources/main.cpp | 73 + 99 files changed, 16874 insertions(+) create mode 100644 .gitignore create mode 100644 Configuration/Settings.ozs create mode 100644 Images/GuiBackground.jpg create mode 100644 Images/Play Normal.png create mode 100644 Images/Save-icon.png create mode 100644 Images/Slider_Green.png create mode 100644 Images/Slider_Red.png create mode 100644 Images/csv.png create mode 100644 Images/database.png create mode 100644 Images/ethernet.png create mode 100644 Images/file_delete.png create mode 100644 Images/gps_disconnected-.png create mode 100644 Images/green-led-off-md.png create mode 100644 Images/green-led-on-md.png create mode 100644 Images/green_check.png create mode 100644 Images/log.png create mode 100644 Images/open-file-icon.png create mode 100644 Images/pushbutton-green.png create mode 100644 Images/red-led-off-md.png create mode 100644 Images/red-led-on-md.png create mode 100644 Images/red_cross.png create mode 100644 Images/tools.png create mode 100644 Makefile create mode 100644 Makefile.Debug create mode 100644 Makefile.Release create mode 100644 OutilZT.pro create mode 100644 sources/DirParserThread.cpp create mode 100644 sources/DirParserThread.h create mode 100644 sources/GlobalDefine.h create mode 100644 sources/GuiElements/AnalogGraphItem.cpp create mode 100644 sources/GuiElements/AnalogGraphItem.h create mode 100644 sources/GuiElements/DatabaseMgrPage.cpp create mode 100644 sources/GuiElements/DatabaseMgrPage.h create mode 100644 sources/GuiElements/EventsRulerWidget.cpp create mode 100644 sources/GuiElements/EventsRulerWidget.h create mode 100644 sources/GuiElements/GraphCursorWidget.cpp create mode 100644 sources/GuiElements/GraphCursorWidget.h create mode 100644 sources/GuiElements/GraphItem.cpp create mode 100644 sources/GuiElements/GraphItem.h create mode 100644 sources/GuiElements/GraphRulerWidget.cpp create mode 100644 sources/GuiElements/GraphRulerWidget.h create mode 100644 sources/GuiElements/GuiPage.cpp create mode 100644 sources/GuiElements/Guipage.h create mode 100644 sources/GuiElements/LogViewPage.cpp create mode 100644 sources/GuiElements/LogViewPage.h create mode 100644 sources/GuiElements/LogsListPage.cpp create mode 100644 sources/GuiElements/LogsListPage.h create mode 100644 sources/GuiElements/MainPage.cpp create mode 100644 sources/GuiElements/MainPage.h create mode 100644 sources/GuiElements/NetworkCtrlPage.cpp create mode 100644 sources/GuiElements/NetworkCtrlPage.h create mode 100644 sources/GuiElements/NetworkZTListPage.cpp create mode 100644 sources/GuiElements/NetworkZTListPage.h create mode 100644 sources/GuiElements/OptionsPage.cpp create mode 100644 sources/GuiElements/OptionsPage.h create mode 100644 sources/GuiElements/ProgressBarPage.cpp create mode 100644 sources/GuiElements/ProgressBarPage.h create mode 100644 sources/GuiElements/PushButton.cpp create mode 100644 sources/GuiElements/PushButton.h create mode 100644 sources/GuiElements/RankRulerWidget.cpp create mode 100644 sources/GuiElements/RankRulerWidget.h create mode 100644 sources/GuiElements/RemoteZTCtrlPage.cpp create mode 100644 sources/GuiElements/RemoteZTCtrlPage.h create mode 100644 sources/GuiElements/RemoteZTPage.cpp create mode 100644 sources/GuiElements/RemoteZTPage.h create mode 100644 sources/GuiElements/TextButtonWidget.cpp create mode 100644 sources/GuiElements/TextButtonWidget.h create mode 100644 sources/GuiElements/ToggleButtonWidget.cpp create mode 100644 sources/GuiElements/ToggleButtonWidget.h create mode 100644 sources/GuiElements/ToggleTextButtonWidget.cpp create mode 100644 sources/GuiElements/ToggleTextButtonWidget.h create mode 100644 sources/GuiElements/TxRxWidget.cpp create mode 100644 sources/GuiElements/TxRxWidget.h create mode 100644 sources/GuiElements/ZTLogViewerPage.cpp create mode 100644 sources/GuiElements/ZTLogViewerPage.h create mode 100644 sources/GuiElements/ZTLogsListPage.cpp create mode 100644 sources/GuiElements/ZTLogsListPage.h create mode 100644 sources/LogMgr.cpp create mode 100644 sources/LogMgr.h create mode 100644 sources/MainPanel.cpp create mode 100644 sources/MainPanel.h create mode 100644 sources/NetworkManager.cpp create mode 100644 sources/NetworkManager.h create mode 100644 sources/OutilZT.cpp create mode 100644 sources/OutilZT.h create mode 100644 sources/OutilZTVersion.h create mode 100644 sources/Settings.cpp create mode 100644 sources/Settings.h create mode 100644 sources/TCPProtocol.cpp create mode 100644 sources/TCPProtocol.h create mode 100644 sources/TrainLogFileMgr.cpp create mode 100644 sources/TrainLogFileMgr.h create mode 100644 sources/UDPProtocol.cpp create mode 100644 sources/UDPProtocol.h create mode 100644 sources/ZTData.cpp create mode 100644 sources/ZTData.h create mode 100644 sources/ZTLogFilesMgr.cpp create mode 100644 sources/ZTLogFilesMgr.h create mode 100644 sources/main.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9a7ad59 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +ANG +BUQ4 +CVRT +HBGR +MMO +SMIC +SNW5 +/OutilZT.pro.user +/OutilZT.pro.user.0000000 +/debug +/release +/Temp +/Trains/ZTLogs.zdb +/Trains/Trains.zdb diff --git a/Configuration/Settings.ozs b/Configuration/Settings.ozs new file mode 100644 index 0000000000000000000000000000000000000000..2fe0bdcf401116cf644baf395d811ca1dd33d215 GIT binary patch literal 406 zcmdnB_S8QH1_l!bX9g>V7=|c@e1<%RRE7{BE@mhJiuf~>0_jYK9H3kXkRQTO#E=N& z=K4+qV_z(|xTCZbd^6QzoUC{?UPsbV8a6+2O?I0&l(04Gu> A)&Kwi literal 0 HcmV?d00001 diff --git a/Images/GuiBackground.jpg b/Images/GuiBackground.jpg new file mode 100644 index 0000000000000000000000000000000000000000..956c2bb9a480ca4efe4784cc2dcaabfbe0817021 GIT binary patch literal 80906 zcmce-2UJtRA1-)9fY58ugf1WuuuuXf)BsYYS1C%BrXodpF?7WcIzo&AA#?#z5D-w1 z4pIz=3Wz`=2uLpiqHg~0?c3e+cF&%-yJz3z-rUU0y>sWA%$fP-`~BwM=YR76kBNb? z0RRF40Eqqp{{02i^{n-EY%Q$S#C^QZ`v>0e5f4+mpdcl=zj_Uf$7gMGO;o-u|hf7IidfL!@o{| zmxUpo5decE00v$Vm>2Y~2N0u!WCHz{0Q|23#6YhjGlYeejh%i&6A!=u0)rVC!T+f> z{q9(LKETM!#CJwfhne5X9U>6~Rf^Ag$|9-T&?R8~VM|KcBRGMT?bK-)T=1;4j4VP9 zsiJxbg;vwMtZ!gwWNcz%YiI9p)zQh*>xQ?Fub+R&-O#Y`h{&kKq~w&;`w!Bxb8_?Y z9~Bf5N=nIPeJ^h(+i7K+V`d9A1kZd zJG*=P2fq%Fj{k!TM92Bx!hZ$!-{In=<6>ZB1T#YZgA2qEPCvoCj7(<~nfY|AAnrl@ z5=!wbP~EJj4PC5~%GO%~9>E{jPDvpb&Tjt)+J8azKL#w}{}r19n{^))N`=A+!9ezVe2_YCTWUm+kB52+IY^gX)sm|)v;F1NvyQObCRGgRPNx553 z%+1XJA+rnLqJU1?@+@U}4twg6uqCixn&AXEnOxWOrA}elWT{hlO<#aq_Fu0h^vM4q z`M*W~`@0t(WjLYsiy6}N3`H9OL0$8xpfz*qR1Upl7FfAJ#rB$!Ark1bn$BS$I!J{W zMWBiqk0+!6>J+j2T>IWqE^eF=1t+uPkE%?<`?XpsGe+CR`mpe3X@UW#QMblY)|LYj z#Li*uDM1?CS+0i?Gg0$F7~b7E90S)qwvb>nIrubeRhB`iWo?||=H@{(Uo~d}436ac zU84dNr-&??hht8#z{p~j{%>8D`igH{mI)E+$JV^<>zivBp4($cEXmw&9d1+P^f0q! z)C@S2{CZiUbl5AXd8)kYdTOmCV9_Klu`F{w%fi$XKB6zdkd$yw@M?kL{5Y_d(ROUj z+~;@1+t457J-c`EqlHa~l$$;{0=QSfXdFKECT_yZ)1?~x-&EvzAYai3u4m! zwTR_4rs8bIH{6sISN%`rgnb0PT=kV3+zl(4zk0Fl?K~nQQ?u%H&bs-nMXaQZB%^nx z4|1neSky0`LDewIP5q|Qmcm?0$*qmSzHv3%p6svwmxNxF)&h2qmT!$WoVNPxU18MP z&D~eDQ$OSq@KX-+pp=Ce{!|T!vTj(Ljk1BiP{qq(Zz?#5i|#F6y4Z2q!>yB)TBaTL z9#5Ui9HL)m0XJXFJcpNU%Y4pM3GSkB$eMKvtP_dFHpqzE zd>FXyd&?7CQHu_AAi#L5S-IemKlKrCF_W9B6F4d|fKhIKsepZor~vtG+c(QL?-gDl zEDS^zGkV`H4&5)mBNsx_l(SGS*MatXjRxg!$b#P7H2E^EOYx~kA5?yP9H-phWZW#7 zh~e~80N-6A^@!`L@fMYxQ{1@r%y6n;uvrof#pWxw1y#~Ah6-M3Z7ov>IFlC~3DL(k ziA9`N=@T2ZlgL=HPQilQ&A!AMF0VD?lxA|m;^K^c$CCGs3g6{|* zEz9r->5b(}yh2dMu*jB;z>676{!2=l%Lf8rf(SA21^wS9_d;7suzYDw^v4bS$War! zMzi=vV5ISOzr+)xU|CQ*sqtMYg)F}R2T_aR@hFrCFy$Vqa3|oFuo6HTOIHPzR6y

*8498%%loNA;=4X1k+cV73k&)Q>?_c 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 literal 0 HcmV?d00001 diff --git a/Images/Play Normal.png b/Images/Play Normal.png new file mode 100644 index 0000000000000000000000000000000000000000..616f42becd30eeaa1f5475f3b0e1a18921b503c1 GIT binary patch literal 12480 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 IwteLP02;W~_5c6? literal 0 HcmV?d00001 diff --git a/Images/Save-icon.png b/Images/Save-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b4e12d29a5bcd9a04fd2299af6896f3e83b10ced GIT binary patch literal 24805 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 literal 0 HcmV?d00001 diff --git a/Images/Slider_Green.png b/Images/Slider_Green.png new file mode 100644 index 0000000000000000000000000000000000000000..147bf7cb2c9dec9e4b70404094046fb59b17cb83 GIT binary patch literal 4561 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 literal 0 HcmV?d00001 diff --git a/Images/Slider_Red.png b/Images/Slider_Red.png new file mode 100644 index 0000000000000000000000000000000000000000..8902069cf0eb5c4859ec37add8f603ac6ab8e33a GIT binary patch literal 4274 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 UlYp?SrT_o{07*qoM6N<$f*m47C;$Ke literal 0 HcmV?d00001 diff --git a/Images/csv.png b/Images/csv.png new file mode 100644 index 0000000000000000000000000000000000000000..cd30e9330329bc5e364a2acb7aed35708fc606db GIT binary patch literal 34700 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 (_HeEW3* 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

xZfmj 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%0Dy1>{( zP)m(BzNEDAf`OEE=WWK0YaEfiRhw~XS#hByg=>A{oiDZ_-UXE@r9uA%))_k1W*Zwj zPQfb`1EnIoWYIj>J6eUK<_y4X8@9k7edWjS@9)2qC$%^eI&7rNj7`f>x=B>K5?%Cr zjExz1>!tZm{KG#rzPI6lcr?xX&)Vn&J8BU7R$Mk7kWoCtx=-8wQEh`X1bVom7Uf}4R1AD@ONMP0o<``6b|X{gF>MI zt5HoI>M4(_$*wZ|QKrb0lvXyTPbTQc^LkOPAWl+20}MyE4F6-nXxk&{hvqAJ9Xw`YVP8U{QZBRPuQ^e9j>J=#gjO zGe5WnRq>q6HO^C@ER1XaWc+)Rl5ys_eX8-A&bMo^H4i@1RugLvLqhX6wwG~7i_3Ej2{lpn59vi1N7IHcG>JNVb-+W*l z% zn@0CG8+m3;cesuN`XPgnddH0@p zTysGm7?U(~$hd=OpK>t|x8L&+eC8)NgYNBv3W7X`gL~1ee&{b3#BFWGrq3k6i1g)p z3d(_tBwOSMJy(KNN!>Ls;aG!6B&o~ocC59lvlv6BFS;?weZ&kTlLXQbuzf7N6(-C| z8zy(GC*@##oO;H~kYSxA>fG0mPfZoNrv(EQ7%b%>ZscJWs`I;W`RL_W!O@2`FAdUUE|Z^!~gujD{#4a2IvRJ-%p@(FZAhT z8ck*nOg4$o0G$Iz9{DwxGiND8aTAU@+QM&K9Q;A821S#Nq4p}Jj|_uMgG1}WQHO^| z;4@cT1$%7(^NJ;wTxC>K7tZQqmK~(33V?c!juDI67iR)Rl&IO3Sahz{ro}`^S#<8| zidVzgb;c%csN~66lN6Wq+PRj=%hiUfqgaYig6|8R z;V{zY@7efj)xh~L3*UeIDTRNz@6OuD_%TD*`WN83uHFDIET+A?V`qTg_HWyZ_}x3; z@y8#8M<1o8rlat#-7w({E}c>!8r0R zJgT6BN6+pp!p7Yp6v8}Ch6UDm{{5Ew;lfjnh1Z;X42;z4<73~o8lN+iX;9HbsXl8k zT>9sKTDXI}hpR|>@_ShF$%*5Awzd9F(;Q07d^;b?m=P=sjX?w{i zdFy$q@*3F;dF|rdD|j!Oufwp<-(+I=JxkBNe7qTQr6shTkaCete;dsmVPm$>ss4P7 z=WgQCgU<*bBK+OAuZGiBuYhtc=Lk?piNbMiai4dmT&6mYkX)NZK<@T|Ji z-c8!OOeDLKsww~R!=J;Z(I(7B2}QsTQJPb+h;kt(YPb)PwMm+&%Mf!JVJ(}6my!gh z49u2HERie?+1Hm$<72^ryJ?-@+Ddj=ByK;Sm=cRR?mvsbrJmB?{BjAF_ElgO0xkyk z-LzkbDn%bN;_g`#LX98{6424)MH9q|{vJ4Nu)>oAMR_VvQu>$kuazr3A8hJ9fR>lsQ&%SdP1+3>ThH)2?}OrLhyTZ$)79*3@`AazX} z!q-e=-*lM)`m_K)SqD|yVYZ!)eU(-1LL5x<;XB_OhVT5SaZauP$HXR12AIvbw~R^E zQXh;`L}`A{gO9_vZhsI8l^(7bLt(9cFc6MY7hnKw=Ow*8u)H?| zUgI>2rF}hcC<1#P?mLK++EM~IPHZLW_Ja2vi67o)_hkdcVws`1paw+)hOQiSF{il# zY%kjD|N7ILVAIaM{0y`1zJ&Bli^nJ6r_(m@L44r-rMGFVrx+V*ibc2CuG<_p`8j5Q z-VxvvXHU~+CN*vLpU%upe-t@21cx3Pz?o;|-%_thXA-X<8Yyld>Zr=JL1tAH)zvHh z>pB=|0hEh5u40;_$TtaX^(CmBf7>Q5F_xN{D~l{-faq-AND4kg;ueeiHtUY%W9VE| zN{!>uDNWm?WzfmZro3k0_Kl5A>cG)!9kqaAN#LRTokbm6dP>}?DeJ7VUX8X?)=IJ6 zz8Ha-XLTIEA8&|i!)sr4*4l9g8{aTeSouOA(Si7!sHh}OHbdnyJh^Q*eCxV9n8<|8 zvmTepEI!DjT@@wKR1F-pI=txZZ!Pss&jZu0xu>1>Ic9A1wtt^}5x!Hpbix3G{elZ~ zean{x7wq2Ca;_*}@dVVk_DJcNP#gjG;3I3{`)eMBVx<=)lN+!(?x+&DTyd54kvkwe z;!Wz3tI)Z`wDc{PP79nWV;m8sNefV!+KM`jP)j-dG}P6SeXE_Fo>aJz3N@~tx|WKx z?tb<(TWE6R!Hyg65^C$)ETtiQ;;V;*h$Cg5+CbHPm)L9|4`ekIPYFsqKNZ=aFkhDH zIcS7U=toWBE2zG|`TSF%zf=@+WPCPSHZI=ZvzQ?ZPdqvI@~>a6e-uS9P2R_L(Ehp; zSTjIx`}YOtE=gs&KJs>nG0VX9>;h)nUwTS-Hjb4ACib<-lcL2=3S|bj7Ize3@`t~? z4aS-=%;^uAta1`6bVVZqr^>bv0QsD#tl({I7a2z+7p11Upcu=nw93Sm2PFBG72mbX zFOQ5%ISoN2m0F0QZ+Vv#kz>XshXhFtb-rTfUl$*`76A4j&=OCU^~YEkMYN2zT3pP9 zG!g=48TakQ$t=)Hic+|9lzDPPjUvjV>?X-EHeu?GB)_^%P<4 zmL2fZJ0660zUoXEsnwFa0+k^Fv;E>hYV5aAeLwZI{6)CmkJ5^;)2#>h!g5k(fZq1+ znHT9hpT=b|EM1z1Gf&T7NUozeqo&8+kFBx=oZSE?sl9RYHu%Y%4(An>9-pwrz_Wljl#^7vQx~Z3Ky(Vciejzjgcr4bIku<%fnZZ!}C& zJR+8QXCcyjhONl)# zq+3Fkr8YZ#-mtDKYRgz5+fwq42)kIhiK!)^kA#r(`^6%8O9-wx2uhO5J^2t8l#7Yx zLf{)lHU7zcW3U@v;|aL(z1hc5LwS0n3eS$!q(!u||K}h;hsd3X=N`aUY7^x;sM*ZD zSk6-?4TMv01I-|Jpw~=d5=U^|lj~v46YIE@bJDRj(?@#KtD3_Mx8xPwI@6;(iI1~Z(m)kgp!wPD z_n~Odv+9{+spN9XL*>+VO26fXgw4p=kfIxhR5~hYG>U4p4U#bJ*sJa=`6m=kRL)+O zy;+?nD$GZXC6#7mBGB&aQasXWz>5$>)F!zpOurIRj{zJ<3}6B!@e4`Kb-5nragh9U z{I?0EK3(H{1b8IiTQOMiWnS5@e%F>=IC-S;^gL0;6s;FLiYT1mF z!O!n}0M0u4Fr3Mv)QLW!hn?pQRH8*_^~wwK=LUbOZjIxqns#EIOq33`%>9Gl3aK2Dz~l`k~X0iO9SA!N*}cO0a|~DR0@dER^v{F4l*ArYWu-QkDfkSJpjtkH(sE(Bz?y-NFr$F7-Ds0*pBwH|VUxb_;?+uGRUGq8HQl$@ z8?dZWb{$;gd-v6w@c5p6u&dT|@%YM3P}Hr}#ooK;!|Q=!&{O?-R^Rd24WLOuU1T3x z|16w-BhM4) zFJy8+X_MFRzV}u1tXcZFW;0GyX_IYmkn{|5WETz22tj+>{f|-92b2P0+cmd24wzWd z{OSjBAUWJ)triq*9?=q{t~6rK1w5=STL(v-QBRc=a8MFN?g1NW0k1IRftTI@$vPcH z;L|=NO}SE0PmYa26(!{1y=50-i)Y%?YO*>X0whfto!c+H4wFr3^?q^X+;fXW>!Ewz zI@W;uw(nsT9aPFSP|bHH;U;W3GD=30 z*=D`gCt)s`XCxI~lKhj`q$uT||hRqMLzf%*zLd_Se z0GF`Kes7WP38|;j&?MiwiPmcz0Avyuo$uyiC0M5=gkV$BVO_MFm>m>QL~1+P?D&1& zug<;Z3VFEW(WluzuYJO;%Jg-&X@iQSR%cAo-Reb)!s8|fEKJJUPpuiYljv#&==%rs zoxtC1nqy;}&>o_daH>DReW(D!Y^5 zI&>-Nlqi;oTPs2>Gfy}qLc}pJr2G!a}w>PnUo{@T=~Lj%1KCKq5~T`B2M5DDj(-U zes0ZR%7&kM*1Rc~l2@K_clS=~1EISHBK?f0``(TYtWEl;gG?d~8z<77%nQ2i2y7CR z;%mhF;FKuI12@TeV{rpgpo>@cY3EjK(KLveComGQ)AEsQGU++fMhnQ9nR5i5RuWa{ zs=cn?H4IN}+6GHzt>W&iDcEh25(_#_Bc_*H!@{YjhKC<>OdhViwmOLR)-S0mG z^tOM$KZ%64ZTy{`nmDvS&sk@k3m^aZdtu+cF_<$)9now_b``0SanfHj@u_R2GF3?} zJicxdby#qK7F(0SPA)ZKl39&+Ra>ptqe+89me7_X>;o^DBw|dl%P9@G4Zs(qaO7N( zeBk*Iwo`06#h8n`YXHCZ+}Q)na9_V?7KeEI^fbNwJiarK0}{ ztVSd?2;tX~dv=qF>kR8Fv0Bj-XaXn;&?5=$on0=#kpsQ(=$?_pB;bijyN)ybOk}cB zZ2Bmc?kY&?RJl6$Vy8d8aWkBE{1It;Wna5asd1W@Pq8I#q1jX`Kls6NZu|DQ_0U62 z=qA{uJ#p8Kxj7R8+u`r$2lU$>e)vYX`s&xf;fK$HLl)@8wYo`i!IOamzU`1ns4q$NphS;8x8l78ngcrCzP z0htFE3=P7Co7_`14WM({_lD{8@! zJw31>U*KyXb=ucpBNtg2myxI?`Ropy&We$aXj%w5i7hw68!RXl6Xlh*kq6?aS$!}I zCzM;a?u6ku;yO~K(fD(MsPHyWnSzwA#C0It2HW$v{?vx8iT0sv8r(B^Jzp!{0GPdc zb=Z62N%`Fl=$*jbNt$=^=GX%#(c9NY?=~3VzyIIv-F5iKf4l{bKmOJ5j(6r3C#fsG zhcEZs9?z~Q0shEHmD4DxZ+ak7h>18axdZ7>E(D!*m7AUIubFgb@S8w!zBjARUdoBe z9w%9n&hBR>9bYR50-7LR(pQ1?%_i(YP?qu7g~ehL+1-cN#kuPUPHMq?TyHNdL|_jU zVz_O17)l(-qsH}2_e}jF1neVYv5;(OstjnA0L*G>=73*DEc$XhW_CU&Zb6WauWs^K zP|kDe>aK>E7~Z3xg~1Pm=v0|!=0ki%y$|sCC%5lpw;b3^2ynI^btYoY$JUois{fOp z9GQFh<)gb@UBKdgaN8bK?zPEsx@Z2L%Z(1hvSmSt<8-iA_m#~|;*u0&v8uNs>b`UFJuy1U0YcQIqSk7{ zPE@_=8N}ZI?Kumd*(ausdoZpn4L(-a)Pn4Eyoc>O_P`jLD->hzy2PZVq{b1a$~Uy& z?7aNRC+7w)zq~*?94^;%0PYLzx_ZEYuDY;CI#pB!n0^J;ZaP`E^F?-(xn?_@tDE*s zp8PulR;{uX1XXWZ|IKwdF-f4OO?|iENTbowD(tE^pr^OMs;m+T3BtTnIcJtsBDn(B zPQ|IHo{bNkdx=?RKez?tG`LS2=!2D&GD_ePc)V6)DK?j?*66gI@hk*@za!ti*h|#K zg#s_JkYF?sjhdLbft@j_@R9G*#OFS|P!=}dqIOVXGvt}Ni;}bAiQtZ=zV;k$SWX}> zmAQW$eLv-;Z)-N-o{>>*uxMk;x%yfrN#+yC&4`GPbxNWcdF9kqr4u4l$;42^XSJnT zgW*~ODt$e!rhTUJt_zk?;1hQ_rU17!8XDg4hSIE0d;+KR;k$9?e>ouN3lFR`w{5no zHvYnHH39`wH(Rh1BRp0G~GMmf_Jc{whxtu}$gKP#T~CB!JeUx+lHJ<-PS2 z0}WTP*{y~|@~%TEeiW+2^xY>`Dk8PhT9{VnAJfQYH*KpoFLNX_izpPyKj^mP%9-gzLNi-#N*LO`#L-TyD2j~C+z1#G1 zuHyreifHmUUB0|;9Fdw0^Qc)xbu96>N6IF|BHec^gqxuxmmqx(q{$dw7gwM>OD*0B z$M6HE#wuwMZCuC!OK{(C5;93TzI-)W7Ug;Kw!-GkL%8LW`@tSR=v4P^_nB_Gp6y^F zOy`{4T*vb{SEuWu*X2;JuYxm9Z>4Pjea&zmCoVn9K z*Jwc!T1bVr{Ob0h%r=(dff6-dNo1T6hTU=_#zd2liZAr7k2Pzs2Enx3aGfMpkvYZF zrX{Gzk+j{kU}rOeCvZYoiXc7$ZSX$)(nuofoR40?CY0{GQRP0o)WhFPQ^Jn8#Zh!~ zP<1c(h7pojL-uyg5nZg-@55tP7F^K^G7DzqbFdL5ZE-QtNQ#WAz`_{=gB-H@Y_rKW?#l)T8SIgAfUM$3zPY*&C3!;tF16vorK(z; z_ACp0&vcT|xZjfq=507JyrfWpLlC?Xq{SAioEqx`coaN?D)N)9I)}bi@M8N>8(10^ z(OwT-WFBsRq&^1Qa5A7ww;H~uiQ?pPg#j0e=YiGw45%HTfk`-!a9z@3jF>D|CQJ6S zi{|4s2rV@LxCjRCtDRq8v>26?$`ayTChB}q!GjMC!*{;(I8dpu)bROlVWaB~vy_>^ zIRE_&CF&bt$+C)RMUoEX3$-QLYF>3GAR)w!N;;WK}RMHhdL$B-Jo$F^WieT2ch7ePxT8eRMdUgwUe&XdNh&;fln zisUuTDu?Vka#6#5^(sqt(iEP>NrGbpjD)@_|9qTA!oYWt!Oqs!kf`cLxte)?vW$Ej zyH2z6QvQS^cZ8Km`?P7_7y}e{X#L)I?}+R59pEbc)}Z_DEbUCu_El&O5YSBrHDl&4 zeI#39Fz7uTIoSg&#W&ONHa%iA1%GHQm2F z`_YXVflvMQw`=FU@|ZdmA$=}~s302>>#wa+>2d72M2E$aHc3`)_@7)Ejnl;3MFE$B2(Qqe9+NYuh11NDHNew$+C5dCvwfl|P zxX@CtLYgod>8h%wkj4Edk^2fERJ4n-qu|vNRiWi4qtTWR5s;09f!~9Oq=|;u^!296 zIz!W&3nuNr;+iO0iCnWzJ?BZuMI|s9C>eDI++xQiyhsYJ5S4D?blH1F3JS{Sq?~(Z zY|FFf`BtYbn(6;Wy$P>)<*_3R7WBcEE$z}!yQw-nSqbRLk3R_f=-HbgVxl60-nO~; zc1-V8@=s6Ai@y8}G1G zf?Tl(KC8y}qf052OcbASA;l4%V0Jk_yzOe~LsX&$m0$G5Y z{s-&ra~SX^pS)yrV6d`xc<<;!$f$r4OPRXdd|z=KXnmD3Cx7_H0$isYY*K+W6zN4v zPCMJvdKa7cmIJSvk_$^hUMWZ=`zt-%97EgMvXqT7($DLv)@Pb!tF($5A6lDqRSf}> za#)eL|2Cpsz7i$%EFB8dt>7^P_=Bw)^8((-o%Xl!ebwFb;ZE}6Z#PnP(kA`b-812o zTPaqd#6GvmtLAPyOK>W>5xAQ4R-`?Dm*@f%Pft~0D^il$7r8WH^eQ?%92os^ff&cA#%+$GEp7x{v|xCk%NW-fQ9g@w9)O zF@Y$XZhn6S`l%zWF_~_zo}*9+9F0v))i^@+MC+Z#?gp31KUE}WH@0`T;oS#Rbyw4P z?=MuhQGchJ{kkp1(@p+3K<7%XQ=PX{)ZN4%(EGMpI8Y4q_7pceja0jyYkm;fv=M@n zpRSr|Ur!n44feu@ZF_`}b7i4Ia6t2_JTdjorWO!rPsouvY+z-n0_P6S<&;k67k1K# zz`d>2gfToj^(4>sGG|6xY~tAZ#u5^=B3wcsw;JKSCB+|Y%1j$!?YEc~thP?Opuf36 z4jwTz{9b4G2XZ|=i_HiR!KQ;9Uo*}c-)dQLGYTuAu0}{qdd@U~7@|QFpcjh`W6r6R*ucZEPLfbkjW> zF1_?suuqL8RasMiEF?)CUNh_|mtgVy*>Kmh+j;P}Q2KKHH?I9g>be`u-i;PXuDK(l zY@*uthdExj-La^fzBb*?xW$q#bUm0dU=s%0mtTey?5^IsWqa5&=A6e4UfL_M#ocol z!RxN#9=#B-Yiy3r!7Fn89E`IGCxK^)Nf*^SnM}0wob+nAl;0wNCIuRO4u359>{8Y$ z78e>P$FP()JQ=zYR``D?{&p}@e#$*tN*P|ZU@iyh#E|3{rN6NC;mW?%jO40Y*t%xT z17pT?8ZYgFt-1~FdeIv=Oh!gc)>f9(xSevD6>r%c0FC2C^{+80xqiduwN#8yiKs|i zRyK{p_Sei3H_)(h(E@jyFTIE56y7aR3xRFVpii_{x!SYT)}wWMrolB)%LM? zKdPr6`VeH^9;U%OOidC1Q$Vc0u%1ns|!Q0(FoT4TH zGySAB$j?GxpQrP%68HUHV>g06=E)(F$T;71CAMC&3&4F@Cy5zW{=4`ylc@FJ-D}E` zYV?fQw{DzP}oF8#Zm&u;IxG+Ul?V z?*OyzYKobtU7WcQTLuRpEPzaZk}lj2oswRGWM){RQljRvEHkOX-6p(obHNz(!t z-xx3(RtafL&5_F&yE6l#){+yVgeH2zH>Fd}K!7^2r=V z2Co$|%LB`1B6fWzcO#%rLSr+5HAY;9%DP`yLmFI?*xC60k+=ryZ3ETz7Q5BF#?TTI zBDOZsc)VTB6P&Q;K~~FPV$p~@FwJ80Y`QC5?aZErm_HQH9$Az0aj!L-uzKDcSTtvl zx0&RZv>B3JT1-p!8oL;S0PeZxzDK%ur~TRiy@5WKg1K|x=!J9PX0p@cGJYKM zK+H??L`4-)mEoFfG&}?4CV@c6CW3&ITsWw;P6n$lL|JBH(D}WMuO9~~s3FsPEjtZ+ zmscSBYU_$RD&_cytXNW!@2^VKbuqeq3Pl-C8k^;&k zlR#`e$bp%=NV(?}3#g5>k7g#H3S8=!%(dXTMwVu@j}#;@&6<27(-%+cOIeD^z&k`yvVh?B6!x zy7Qp6BEg*K)<*pM{(5a%fFXSpX^(P8+-Vol$4rcdG6YGM+&-MFYPepIMvo=|x#I;Q zSvSI{v%PISDVN&eMjU_I`s+2kZ!FTBc?uIJ#jax^=(z5?kt#M~6443HTD=OjAK#uz zWV*2VMsnn{p)Fx9fL*(GZ+PU9wd*<)xSh1a$&Ryaux1amA6-2UDLmQnaR%^v#jf>~ zQTEkjmh85P>n8I)%A9}V;`fg;$4%Tn&b*H&Y%^1wH4kM zY6;lu#Ban-f=4#uZ4DD~TjkM46AJykaN>$3_>>r}IYdY&qVhRI`e+u7Jtx#K3Dn?Uj`xLRu^ zn7X12bdcKqKJs0<;#7wjv>R33wz;-|-~8u>qUN8a7c1wlTFq71o{Wpf=NMWkJ; z6~R#}mc#1#v*D4E8uUg*9Gns4DB&6hYRK(}V%PYPz{ir_xcAnv^K}~~1e&jmO42M6 zSJxbr>RWL_$Z^i5Nd~8P_4zh~8ZzOg07z*Q0lmo+p}E`pZjX90;kVB$PFxrV(+RN_6QSL+`0i zTZ?PW8J6hPdL7O`ay2ZSJ;;**SJ=&T&PiHDOFV(!RxA|Ynrm;k#!!jr!22ShjTYD~ ziQCC6P5kK3w}?VFgo186%j_Q;n)V-)<%RxfF$Y#>By6`qH2~eE8Fm8uW?XhL;dt-8 zk36+?>yAeU2m6n!HR~cdRKmRbbNi+agqPU^{czT?N5CW3+zO4T2Lc>eb({c7D2*Di z1HDG@)AqoGJjglV)HvpOSKNXh?%fQt3q>fPCb2Z%1FH%Z9+%`ZJ|fox8ykCEOt&v_ zY|}VB?IZA%5_MU*3aDU{_U_*HciO(2s7SKT#_wB(KyOLxYA9|iGA&LEdf|zv0gswG zPsed$uiK3K%c=5Oh(_OU&4JDN)-_9dX9O6M*51aqj<_TsHW=U$lbPK01z&4X3z{t) z6ZkC8KjCO7Ay^yI^~Do#iH$CK`Tm9}pa`|5){Qsca&t1w;% zpURDxEY}MUYi>N8pi7|IHq7%2 znN0S_-zJf&G*_P>>b!w&%JodmLv+)?p1xz2m?KIi8w)@B;V*uA@#`=65Cz1T*t6Uw zv4a`h(ngqVWE_yBzMqXY5_UB7b3IL@s~xObfpUdjtOfxD>rNdrQ( ziE;JlpaiRM5@|_0WvcM{^c>yAYh~PCLq(ZYD6?iwosy@RIk?I;?qxnr2~De(re$z#fRE@ zn@6RkxM_2#Sb{s(-2L;`-Z4XAiP@4B-QlC1X5CE$-E$=RbgH3Fhpp}e;7*~V&!++1 z3;iR&-F1LnZOdeG*(4K80j~PV4L5JyzH41ixwwo~M@cZ5*s(LIYlb7PjP~GbPd^E6 zeCoS6KvAwCz(YJXjzaD%Qox1Yw{n4GwgfEA0v_~EW1!U5I!gS*bG@)QEOAb^v!e|x zMD_aR`2qMD0x|Fbvc^|gNvq;m;m&=ak5}QXzXzZgK(xzM9?s77C%+>B^Z~TVpNX4L z;#_fJyWLpx_IOJOHixVmS%sY*GR?sjDPa$MAK2n1@$Y=5ld|SbWp;<)j)Pj?(v)g+bR2IBC=%o(oZ{ zt@ZuUOeSJCt=C3Tcq?=sUR#)jfYxa^D=vc+xZ^{1J=5;nHhZ#7!d+bpWg|pg8mih7 z$6AwvhawlFPMu){&~;|h9oXr4jFGk@65KsA{5DxeMn~bi)knZ7iw@zgtf@Bv(hS3- zY_D-11-zC#s_omh?|AU4Yp+=&V%3@+2^e_J7}0IU$W-HNvT^m?;}4K~ZL*%t(~R;8hdt^q4YHl z3fdiK`Zi4_2<_MXKpG*K!ChuYmC}_wYP| zb0)6S`A!$ce*~9@@q?;j_5I50?s$6rrn~0O8914wuk&iz1nAzyljY~)$in%jyac{? z``z%!XchX4IS85|Xj&RA2=WcEc`EsgYI~@l7@@L@syx}L1#aP#gIlY6pdW!w68q`6 z2D|YZUssw3M;7{Ap$EK>1*pcq0l~gDuEK+;Zf`+#n`7xG6kUi#u22=%qi_N_Cg_9t zK|ZPDPT6du;3kSe?bf@Z^Qt$iFYW0SxbE75zdW?US*38g9QdRE%A>yUsRr?$8f zkW)+n5p1NQt0-bEh$cKrIWG_BH`{B};oeKZ!yZ;5PMiEpagaR&60fF8KpqUFf{<@AJ*TgV4n;az5RIVW)j&k_H z-px2b11RI*&f~t{9oq`;!1cwslBn8_lsX!v@2ao|wxiVFW*gjMsm{e3$Ouu;OU)Y) z;PX`h`n4N&X;&41JqX_)*LT1+(}GjNUN{y({y;RsnuQN3HPYe5X55KB%gn3sEbXb{ zs&!J_6>4ZGDmq#&vBL{O5uQHhEkwVF5ywpfw_X*@U?ntBsP$7*;3d3f*Hr{goA z@6u`i#7tAgH0Tzj6Rm=BxdeBtx$CFbUU%cu_y8Ou8NE28Ih;PLHx<|?D-ShQ$*6Xd zKs(pMfig2}8$ae#xV-yU^xYrA<%7cbuVM!iz$lA>uYK)%-+BLgFZ)D3pPSpNH4?jA zoajPp8&|WDJ$HVFOJOHg!W_HZP!zHYjJl+jsc54-qEPJjrgTrCO0J8ch?+tgf9@(i`(hL(scGkb zZ`zMQ{xE6K|UoC-sWDI`$wA10VMT?l+3$mWH#8)l}Mm`2C z?Wu0R_U+66nVH0Lpinupu+MU|;)@9MUj-@Ft{qZ0c6U1|d7%H=HGS;HGto`w*3ZjN zay~A{;Idx1eEeSZ%-VZ*{Op<=zkc!SU-ic|1Zr#q1lEeXRx-FUr>DWzTPne2=ba6A ze*HTzh7&|Ds^_*AKqHS*9PNIabCQPq=mc7JZHaLmN@0jR3!;Gi+b8AwVL<1Tu-Nrc z73S$8RJ7}V-ty6JD(M&DfGJu>!1kg_^W5osNa7PPq|##<-&d)GvrukA@EX<5ih?)+T{KKHj~MFTm65p1JLcpM3W^=tC`_2bVJ5_eptxikVun zCrL5c*UY$^5I-^Lv5>VRlE^sS#Q^LUoTknGootM5vT$Ausct)HAJB$eoT%BT4yH>e z9Kd2(Uxpjk;bol)p|p^jJof#Nfl_DP=5ZjC#+ZjZ#m_7 z_{#0~Ks_IFO*mWC5TG=V(Qb^1U}}<74_M{QOGQ-3FcHLnw*tyw3wUCo1`aojZATk= zm{syKi?iT_{6KO|)T2GA?M~#OaZ+xK>dr-DY}22F`!CZarwOPc)a)=P+Zf4pHIjAb z|LT%*+7!ahaM~>qe2QP`SO&3#yEa*p8wPod69=X8hGc_#W*vcTnqqE)0^@S|B!Y!or^^-0wxD<;e_{I;e_)KHhn1MNYW&3fb z75ID)4|?<6f%2e((>4FC)a%Wk~h5O!z9%qlcl93 zA=@PK#xd9=6)AM}^=G~m9@wxE?%6$zYCGEMD8b{f?#eAu0eS6$RXN&Bh-H$ToY^L} zF)HzJ&BzwEn|Glt{xC}OKAaq=6Uu{n9~_Io1u+|LtM5YK#!yiq9FNS=JhS-M3hn?3megC*5Nyab+aA$5*`NFeBO@x0B1vN5W~2 zRgc((NcK4S#7T80)jZ##u+}E4>#cf=rF(=x&(~0u-?I-cI^kq^{gJEK8<8XLgP%;T zN^*(l8dWABj&>-bG=JvV^>_cv6<_`_^y8iP;k_@!J3c#rXaVlqawWOO!#v& z$5*h)ex4v|3W_M`3>e#`N;_TBZZeg4s*b4H&{=x`+-n-zrw>l0dFUzBeAUKBpFKC_ z+EW|dlOWOU^lltg+wrxEsIA#2Hf?+St(RW>4*b!JWMlf^6RXnHPw>eVN+n~6%2Lf8 z?1SqcTgzEj)MT+KEt^7Vp+rG4TzehT9%_N_K$=mvA8l1(cie!Y_=1VWUVu{l*unr$ zDo-{?;hWVh@FYs@hg)NCWWEOmQQfEG?`rI3Hyt%-*k@WCb@vQP_?udL`Q$zy+=wgA znb?-YSzBI(C+1v|PK;!!ftTF0jift0o5;D&6y9$jYP&&TBifyfUMI=j0EHkYB2rfy z0BGKf?A-?o=FEft{o2>SoLr8>jy0F04#sz)vDs1JCVz@`sPy*1=f3oR-gnK_1FR^oMcS_VTYy@6meU2J@40pbo;p1FkPSUxh+g_tgMGGOug+E1d~Zc z=)%QzAOdbWN%d|+fjdo>8m12Y&2Asfu<&K4zU!wEg~KRPo53S@+_vtU-@o#6@4WPq zzpCxnnRaRyKf21c=~X__L~}pyqn9j!-#_Ox`0O<|@t}!_AEKrLnu&FO4QyIClH=8_ zv!M-#qUKm?lFCofbXRs(?>ach}hRJU_xT%LM}BQWo+?}ZhW3Tpz}q8gtg z7FBagT!SYO=shY(^309(ar2f-jc6-5=te5GO1Wr|$TuYsZ}i$SE)U<6Z=||Y7;BCs zH+dEi*farH1bKj35i#o&L1L@ zO`b^8+N921Q;J-+#75_1aNm$K%{;@7k~?;B|D>*K0(r}@yO7F21!#K*2=EaCIKGDX z46C@9F*Icm@E?EmYvG)Qhp@Vz55wdc`fBaIuD%wn#}l9wJCG~n;?Mls=l)k?Cr->u za2lPbZLm53b9f2jfd=%Kw?YA0ZT01B$!L|t-Ho@xI~6UTxE}037Zh|Ls%!_+s-4SC zL8pA%0|Rsg?PL6>o0u~hk3mD{67qt(^#BKB4hKeV7)8Q9%AnArTh~{iRNisnc`tio zjYzpfea}>Okty95gYvo21b{_zXTjc)eelGV?Wi#Z47!$d7V$mN@>0VbB&y9MG4(0S zoYYXaF6?!b`k%)wSEEgAXSTah%0ArO2OCJ5`@)L?R`501q|bOPHSWk(4~$g7ky>|= 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 X_?-oQ!94x|00000NkvXXu0mjf>V=85 literal 0 HcmV?d00001 diff --git a/Images/file_delete.png b/Images/file_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..927ff2b10d95e8cc24cbaf7aab874b6c92bb103f GIT binary patch literal 17973 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 z zQK-3n@$XGvnz167q0ECZ?V8{vsO@U%@#ck$7R}1R9*Xx&zH?pC9DlLF1Coq~Yy!10wknA;H|yMAj=WsU_(!J!U!S zjk8n^4Sc&oOF#1C=60%R%F_=5+Ad#?mnVJyq_ZZ{91yvJi2&2;GroI;_J6IuL^wvM z?F`x;E3mSIw2c(_{g>jR*Rr_47pa_6V3mRnwit02A1ojclAQF+z{Dk}rENEgt*JVK z3VAHL`fC#B?ZO+s!h@vaOx}V|vsyiUccRU}a0I<1A&4lz8Hx(_k_#!*Y}bossU@Yh z+Sz?f+Aj&Raf+)WZIq9Y7;M0I#x$>EayvrWbTx9pqop;rKK0C&V-`xkjLA zq=yX@TT!mp!G`Gnw&p~{*j4rfVK6>oGSE3eY~a=vO%6=(QEmU%jOoixOswtzh`>i+ z2nwxRT$wMPuP|C9`jq53$(1v;yjN1d6^0S>C>s<WcXLzK|Y_^R$df$EE9QVkbdl`t}Ro&KF}Jh{;ZYz1@Tzwow&qeS=& zdWuD2CBo}lEniHQ3HE4U288r^QLzizj@&Pr38o65J^W|0dIokaLt;T8PftQ8Nz2@n zn&Y}WE7@|_FMi`n>y%=#JD%vwuLcv(YH~ogV^Jz5yMTK074v*dlCJqa(aUI^14XYQ zSAw^CL1j?Z*_e%b$p{Gi-n=S)cI0)0 z0@0@P>apH*J2pa=!}oZC@^8JDft7^DWZwJmeR`+vhQX@?PcBp_YSEB1JH?(z?`T+ zc(>Ofg?S?neb(Jk!@OrVi=oI+;+>p@m0NE%@vpx~5)5P7v4F8}=1A{4WFOPmOodmZ zplvFrXM&X7^RiOmM|7!U6@L>X2FT9E$xwbjl`Gr_qnM>5h@%#LZ7@%NFO>OP+!r?wFdGTjG+Ae`Ydbe zp6f*`N&*kQeX`$nFsA8R@+`o?x^>G6wexjw=Ec_B90gUKzX&$wdhA+ ziUvWi;mr!|<}Z)mhDS+A+Jh-A4Ifx{?@4D!pb7qO?Nv4sgnlkc%C>*HP!TT< QK23+*oc7@FI}k4XA4vVFJ^%m! literal 0 HcmV?d00001 diff --git a/Images/green-led-off-md.png b/Images/green-led-off-md.png new file mode 100644 index 0000000000000000000000000000000000000000..1b011789e79416e990b1c5031c19d72e85f1d17e GIT binary patch literal 26020 zcmXt918`(*u#Gm>#&c?QFZ*1GPtvCOB^(r%Ut8V4ahd!sfzwUD* ze#?m?z~aDyfPf%KN{A?efPm8d_l1T8-tq8>bpc)=4W-3JK)(O`%k3&j1m1zMm(Xwm z0V&4%?+fbdG8*&WO;>v%v;Th{W5f*?sM@%Pq-x*k${>Y`M+rZsKY} zOur6h<%g@#fglJ(xFAF%D9Ip%Vj)#zy|H8p{b~yNYKrk_!UZXz27iM2Xc83x&5JlH zgk+oq1Sko(NT>udoPI#o=4f7tlY5P?pK{OERW@SHyjP9cThu*Mmycd)dG%Yjm)&MN z`H7LzeudsAjXwyOAQm(zYA>Qb9Fr#J5X~1Ndi5>nS7c9j|D{t1sn#tAcqJ%pujAl0 zx;`i;3>_FXkw&Z7mhbze9ES!WB7jrJpZ`KA;4iNrgeW^t087ASZ*!y(1hk@@;N}%= zf@7dGctx+wpaU!?qD+AVBj||_$vWN%>Jp@Iz+b`mNo1xU7eAhoKQ@ErlKQFW%hcWi zL@YEVlf<4V?BU(J4zB4UN9sX<�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 literal 0 HcmV?d00001 diff --git a/Images/green-led-on-md.png b/Images/green-led-on-md.png new file mode 100644 index 0000000000000000000000000000000000000000..fa2b48845b5a028194a7d8ed1fb82041f9e9d055 GIT binary patch literal 24094 zcmXt919Y5Sw2j?nVl*};Y;0pEnC8ndx&+je8SF&m?C)4uuNTW@B4Yu5VK+z)r3 zv(LHvoExRADE$eA5CsYf>XWRDgenviH1NLz2?27(+dtkN@`GR^CoKW>@4s(BZ+SB0 z46>7qwks4=8UB9~JXkBc=Fls6V?dh&-nOH zrfIu(KdN!3ny75kscjq0v{h}d&g<%Wo0=G&BcI<7&CM*$Pcb_sCBUQQig}Yv20f9} zFDJdv+n)JkMw$<$EdIzMP#9#NM}lOHNLk@yQymXE|3yq~g$6mz{8R3HHF*VByyhcv z1#ud+p8O+hfFpuW3kH6tccgUed$p)n(hiD1s^QJ;9d4`UY=gZP5YD zyP+Q6yD2u9op_CiGwM5uVGUqUl#ANoGlIWgeTEs_G)@UaPFY8T{W>7JH(m7)Q8`VO z$ejAqLZ5j}xc^{t4|d@39$S(D|QW8G>&fv)erTB8ProF($hl?0HV{yU{~Z+pay3L zJs17#4PE;{T_3}pwC^E)A-uJF<%PL($rowRD*>wWF)06K-utLnU&bD^-1nqnfc+=B z$2icg0`2z|!2FEFoFw!x$`X*M1q@GNN6?GLth`Vu_Q$Ay$D7CSUOqdpAJ7a1C>7oJ zyzC(gpSkaPa0DAYM(H~CuJrMv=)wPl(W5NQDe>D0TPG+t1a+Fmmu`zo&v^d9y;U0c zsQ4uj?DQC=|H^bhYhH*sz~RIMs@OrG>b=$#F_eWxFATjtW>0m4O4gy+ZvVkEd)>$3JQDC-IJ@}GrWf- zeF<9A{~`l3Xp_tm_&W8pt(|i5yhOLgvTU3T-TjSXQsd8;lxiMy0FtIJ1o`g_g`gr# z!9WZztg35uksvjcfy04+qSQrYpvyG^@`i3BF@ zyHBlO_bd;}hZCYK75D<+rxta=qxF5mh^mTx!y6DTD1*X4TAP5|T_>D0!4Wer|3_Hm zA_gc&ary>RB{o7@&~y?LY-LXisA1OtuLSHh56l%ct-!+kw19qL+?#7}YdgV=k}$GQ zMTU!s){+b+g%wJux+GBljdqKPrGfm29tPNjbGh-|eebzWKE1RVd^^|dpIlwVjgmMB zO1a-HI?yofwc?LN|HLd5b5mP*pz{w^10!`CsMq(Z{_~{T@PnbE=JzvHKYWilcYXqt zA!V?1@UB#z z9Ehdyml_}1PNY_ss_BR^3b0OMXk1Q7q*7) zgd%#NR~7ZHp-hA433Tu3W9%ycA|DjS5cH(ntHly-YNq zpIm2TINzp`GIu&*(R}3687;G-16tYgR;abL)-`Vn8Z}`vX~f@m>M%*vaBP=jRdL1q zM_ENU5|7Ii==b$qM7suU4`I(UCx5m)&zAZ$*(vmM8;A7-w`iD!_%d`zE=U0I_kXMeZH1;Y`^$i@X;93J(0ZFl@ic`}D_i`7Kaq{L>qN ze1t0zRK8@!o(T%_YmZTK)=xXlrYeDOH7xR;I&-@vM(ncQB>GH1_h!NKC{yxO-7_CCC>a zb-sZ*Du`JX34G|ki*tkuElFuFSj2tu-7a@%2;4^vgQ--Hetdk4=ER9q|F__t>m@L| zzK%~xNf|m!OCyR_#i@J!OvG@tpC5GaiTmfCdpn=Stxzz#d1EwGz7#zEc<;3uw+#Kn zu}e*TeRErz6mvRi4Ly28Z5?D1Ar~qxE`}hTyT@Dy^N-*~j!d|si1WLqxOR<6MXK#z zEY<_}e7?bWC3AKHu%@PLsVc;tcmHO^Y}UurJm{g8Y@QvR`h|ZGNKjx%NlO!a`9evO zfbQdBppQo)o9Q`Kp7EGX*2O8VIqZh~#E7)xPm7YdY`3f3|Es)dS1`>-C;;%+= zTG<;v#AJjG8$)iLnUO(;8}q5jsWey^?l1m2A;$tC-5|q%)=GQ3%N`_WFG~;co0^)M z1_JuV;Y8pwd`<+?5HO>CRVSh_kwnTQcdOLg zjJOV~@gXtcU$vvdHnFpdy}NUUpf1uCEf&e7E;=9#wYX*&*t@3hvg29Lzn8M*(ESM# zc=ChhWa*0`oQ1rCC(e~^?(Ln~+RBL%7SjDufk`K)b@V7eKsgL@3rqchV!OZzrmU`! zT>XJh0MdynqBF5MdEzoVY||ybaO}DA-d;qW0EC+ZSVjq^64>%cErHx)5& z>`0M90oW+;5L3|B(VTJJh(lAAi$;qR{QEbFFJo38aLA`@dE1oiY1WNX5IUiOr zQLt3Dt&4P~lYf<%j%CZtHlz7E?Byl$Q%-F=DhQg@VjZ!zth=b7F#U%+cNn(Zb z1=_madx6CanV&;TkA44x5$45xZ?_OP=2p-H?8A_1;_RFVAqUOA={6ah-!R#Q3i0C! zu2jyUog+ky3pg%P@kM1nmHQ);)odhzW?_-3Ch|wL>;0|yAKCAjGt=zqgcNq+*TTEcu+H`GM=21Z!^Oqb zGBh0LnCa`HZId~E6tGR?G?42X`y%ehnx8>S3{sn)y0%0t_6aEWS!S~fm&Hw9qk*dtYWHc{Xtld-aE@UT<^r;oZ?0oSDA@K?~xrW(4derjU8t2aCfXl-)Sds#RhL#rMD+8>t@tbFE*~~JI0A=;H|c0XsCSN^n&SXbZvMh!Hy&zhW^EU%#O38WkV zkHh%aSL98h#qW`cB?f2UkuFtu^g^iB#ML#qSURDpv2o#{%^qX&T-!jYZ?^ex?q27f zlS@2XhMZCKA?T@LZd=(p680CYUW*3?1USVS>(OmZSs)F!6{VNMHX71&d}J?GkteBK5_b>udR_vC1p06l_Zw*xs+GH zFT-*?|MJMK2X*6sw@%%*#thJ)>BP zspTBBuy`lOjQg7Yse3zAKGG_&=TGBZLDZLi)ye8VT1g{{L#)<)7G+En-zG=wplg=I|4I^CU*=JW>$QH~}~UOb*1 zeO={BG~3$_-dh|2Jc4;b~>2K1eIoFXPf?arw7G0 z`xhVWip4?>VWJOmB}IV=KfgZqMZ8Fjz{Xk~wTx-%lZ=F!hu<$tdTlNQr=_!MxSFV% z3%@*9n}A?2_=iRFAAh7rm-~h#+H_m zKY#q@U@nUOq_eRL2)_yJX1|a~V@WfL;p`DVogMT|3o#pZ<~*pLVz7+*@>St~j>yc+ zH1_lRIX6*;dy7{g25Vhk3skC)ZqoWyF^Ss$O{sYu5@H`79)K(?+-}ep3w9y3-$RPP zM=M9w0$ryn1`2&36-ETHn8PdJUV@6&|e*|&@n+!oiL6oy)$()=Vv$;IM z&|zc4IEu}2%FrLs{q&(Pru3!WSFLM4Yqa$qey6#fCRsFDWxb>?FsxVQnKw`A_K?h} zvy)e~a=Goauz5r%ScD=oVeVo5$W%c12}1H%NU3v)VwfzWyn!EnJ5Bev7R}98R)Wr0 z&=7ap==Nl3%s7%61V0 zlI~HK3?kFgMV|@Oal2VYZQR{cA&>0RsrL?6&*gwu`|53dMop3t5VRI}cOMHneGIX#Qw1Y{C4MK)U;)I$5&?POG*&%-;P&(^aR& zkQ#uiQM97jR&TC7JvZ0f&@k^F1|K{ybdY+)=;!;iMI=j9sin8AO5aS;u0+cg8cd^j z7ATw6P@?fG!CxTQe2xEd?)UO^WzYLdH*be`gSp)lGK9(@ewruf`-dl_BZ`pjoiT{? zy^++_e!R}#wf}X-anrLNst+mW*QN^J0Ea?6G5^@mkl0#qU@%$zvA5s7Gs({fvM>8_ zbu|pu|74?RIKqFEANb@n&g1)1_-1@o`ihllOd%jDQ-M*F1WaTu)n=({R@XX+yZkbJ zdaBJ*o6N0Y5kRKbD^5Yc{MmJ7QKQHDQ9+{CY7K{+L&4O>COR{dKsb8Uc&~WCb5L-> zg+H7#D(llVVUrL?p(FLDKB7WQs&efVy=TTaI(r_lfpqKL9lp&7!;;df(B z|7Fmnx?dhs zBbp-}ACY)S*A)7W1P7s^KHhgooQ{8(9ra|-%&+MNDQ{n0Xgxq&yQ3o#g2(Lan?2uL zW`*sm+CY;ozxy$5o1Olz0mlLx-B+67J}n?SH~0ADBuLZ5Je|Rt_m$mq?&pl2NnNoA z6{eid$Rm&C$lTuIzFeoq*D(lqFQQ z=DbOQLm#%!uDg@|J&C@>E@;r(l!-Z6ys5Uhb^FsZU%Ndp!T|E}@~r&)x|Q|ESfC0* zoqog&2Q6*?f8pTHkQ?~F2pQM!D!e6HK$oK*7!WEu&nJoqeu_rrx#K~<^bU%fm)gSX z4}-@X6EoFg^MU8S>WeaOLp`WJpLweO}mKW-Ni zvkJf+uj0!#+DEy_pcP z5TmRTqm?-~>kbYyI{jK7tYDsV!S@?E_fT<3ml3n z4><_PGa!WQ;jyX|>=mWsfBGQOmk$Q-_NAIP!gvW!;t*YIsk8)}YeOu*g|;}D<#Yd! zt9J)W`mQ6M28V7BtbJsMO;;?^t!K8+W9UW5wMilKc3a87swPG)rJSrNuzk){U*PV! z|4*MkU>7hmpq7Lp@p9s3Km3r}>H4Hozm+=F2oetDm6YCPTULYe%LLrZ4U1MB({Hi& zH186%HoU>P(WxS}56_op%|Cg4X)pHO$4$&-V=73FYl|I^%b)*oI1>2EjTYI^fZKko zU=`WORq8G@m5gRf?TqMo#3Qbf+`b)dsvyC|BuYAL`!cSv=*<-_7sh|PQw61^rOk81 z3Hm<0PAGMJ1%#*E_ZOs{-jB`=3=P4!y1KeEGV?GsXkt?5 z;Rl9vTV7i%t-G0ptxtqm($1b7z6;HM@^vr*a(Ji$dKcPgk=2Qv&r?gOOOLev;s**p zKLfFGVHm5&WvIkY05{rx=$bY9!Q^p}C+Vtd_PjBGWShN0z%Qt+efxpXpfx>Lg*ngp z2gk$qzDK6_>+aw{i5Y_5IV&p~27w=slWy6HRY2?(7<2`p5r4JkN|({kiuu$`m{K9x zmJTP$@4^$o>(B$*uiHM(RZ_SbjB*!L&NdiJZ%>o$oxZQvdFjZXmGk|Vqwi-+J@21Z z+OgV(i1SaC=|=v3ynk>!-}2l#?>Ph+#DM$thUnFyX7Nl~8yg3I{?r>^vWE+)$vf^7 ze7?IK8OCl2F>Tz$+a71hc|!HGIuRfFtu@7i!_i(vIGWdmQ)~Y|d|>p4EP*hgNySE3 zlCppoMpSXi`8lt9;#_;D^N-?x%Nm`lX;K@us-{5j8-UXccCJD2fGVga7l0?Njw@rkJN30(6>7(&R57vw9Fzd*+=kE4W_`9)jZUloc zhRgm4$A|&Td|m%erFkplnYMPeynKFJODCsOCp93se&k)e9xnxE!rs9uEMZr*UvMC| z=*v~Bbg#Uxg^sCvMdP&_{JuB+xqzfj{5n2HQe1%3;k+-ERB9$IjF~APZaNK_e z{T%4FxUP!SU<3lC;#2~D{Wd)4&v`UtFj;ZwCakW?dsM$!tt{2ps5`gNIpMOMYHLE< zudXEH$Ba6vOe}vnS>~Rw$(`d`Uth177QB4^QTXj?PO^3Za9*0af;CumKED;5@cZv? zy3JPr#Fw-T92^zP05GAL)sU?4Kl|uyyy5-)T`8RA_3>N(>|E}fE83S~`(up_6BQ;s z$!f2r4h~HA>fi!S45scYdlT))zmd42csrKrHwaWoav&LnfS11o{a|nJWFs>8a9Nsj~@F4z61l~k0S-JY(xX2)Hj9G-bMsM71rp%7BV%J6OQ`!x*JbB8 zTX3ZfWM+oQy?+`)*Ev8~c~FbJRt>hO)gWF+7y(0Tw)81yNYWKOY9b9Sj~X*RPI9_a z=}Qd1Zr}LU`ZZvtQA>NV%2tK5rGT)*c}uT@i>V=6W6dluKpSAzZiIMnli3q-6Cdy_ z5oI5-n);#Bs3l-6c^?pJMYL0gCH52U_R2A^`@(g(HB3W@ym^2HM2}@)w!N8_Y@G#h zljI3AzNh_s0{?JFg}^D5JdN(O)GgV9xJ`Q;xAxlloYdhVlp01n45TKVH2(5yDvQw$ zv%{pTdj3BKmh1!&tk&Bd^VgOS26WtFJeF;AlP_kqlPb$2# zDpu}f@_4L?RqwKOXE9H)_fpb2&ZXW{naa>3ghJ9w5aq{l*X4&9s-QGF&GKsy#hG^5M>{V8+fBhejFE^ zs=9-wcYeGq3BM7xUo8lMU=`~o$7Hna1 zekq~hXl}`(4$k{+FeT8rO>@ICfeEi|RNPXCf{Nf3BGQ0waP-BuZ&1~%l5(v_nXUoy zv4^Ki=)msSXaZh$p611W`L)_9`00gS0O$=YHFI`uOmfut5*j)-REiwelXsdY_f%W{vN4XTrKL%(ejKE#Hg$Dvt{AB&@WB1~QeethZ8~LTV{;B= zGh1-IB1;EJoP`5=98km=;X=~G4G#E|cb(N&wJ4%~u?hK~m%k?7k@Cvch^WW zuFQK#pndB`i40pzJ`sOB#w?s z7A;hyAE&yfSok4(wI(BMwl!3x+Hz4L6faJisYL1uk9-rb;Z&5t2I%7T!XX22T z9uZ^R>rE@SUuutf!uRpFe92lkme4@Nd!zx2v3d!A746nI#iT3#3Wb@O862RWL-nH)cJ;?E z-af%c`<+PM>S1OT>Nw%P=fhZh%B=(NW0J_lXk1nqjXJfHM>3p_64h0kZmF6&>WPnY zZtJ4X-siViheK^hl9HYdQKa*zQ;Gzd&{4@P`0l1RA$Z>Ot_l6H4FjZm;S79LNQP)# z_L)6T6OLiT?LIa~m2Ha4?rLjyWr^GxdV@OERUTAzD|CkCuj;MAFZQnJ=8e{@eW_NN zizQY#yaqgq3k+=^<|t>vFoVexwBBY%iSfWaKcTt%`zA)Ll8Yz9s|Ui9KF&qFmgnx zwNmQLgpM})t{38Haz9TpH~~Fldseg?hoL+x;w@_<))vAHFeqs$kISr^dV1s=&nj^~ zxKh$uQa^U;!f?dti!GN1G&ME1-rNCV>L{gx9Dlzb`Y|f6t^~h83-Nr2u1Ljz3O<@z zs@ffCkz48txRCC%7tLBbCS3}9lLVl5jK-Tu@V%kbY#q5mh+!2=Rj;4CyMt)L0PRTR zCRedKZP}|%1oQ8utVASsT-mk2fX&(Ob%2m`ES86tv%{-Y5XNnMlxKr*TYizorEMi% zd8!D1=HwDEcW9^02q$B1PA%oCR*!g(7;~a{IKjo^$!>NkXALYb2b!3iM42#4k{S6p zQ+&BV|(s^r&ALtRcc zp2k1SJ*?vJpBhmtuhYp+OH+%fO1;>qB4r#+HOhR07AKRru)Zeg&Q7`h)7)I2=_hpK zo;8eZQ)qtG_kQi#BFfLaFCdYZO)gjp^QQFDfNGD#EBbYcntq{rK7E zF8V@w^WfG?SGm;h25$E0AQCub;_dxfGBHz&u6U^R8$TglC|cGxppS-wnV>JUgT&JT zgLm4yDpD?)D{C~*hhB%5aeU#AN|VKEOafN{Vn&95z&)!pr8FaQsiJ95nAo5#>K0b!h&Y zF5fM!a|dW%_(jx>K}S;CtgvA~%6a%IfwLe23660L1szRTM6^XXce1TX0OT5pL@q=Y z8p%)3vCe*GAQUM+u(i#cX**sASrBhBd)E{~)MxWNf`GEC4-nPx80&lSJ0o64GNI~6 z1>9!+YXmN??I>p&>eS%oH~!G_h`f`7+L%r7 zbewI5*TOMV#)=M5o7>6Yh6FfBmOOf^z)A&Yu%-)^enYCf^=~h<}=oj zSm{oLUiEm=#_6MHRD)L=g_gWT!hVYq=F;zyO|(6T`e$1bg*UPV;CFj&SHUlW{pJpA z`T6LW5}x>kge;>52OA^JpHA1fAhqVEzP{_@A+Z<{P_qRCXIO8L5J}xVZ31Nofh=z@bx;F&9KBtA4E;*@Ol&yRWmJ05Pk9 zZWTtu4zb7jK?wZjX7h=t+JAjL&a~qt65N1bC}XBr$&Vo4c3vf>Zx?Y-8z#RSQgPCm z%wZch_pPjYFucFr(Dnr`Vj9ngF^D0dgu(oB>$+bze`XC{B)t0je&hI37LE(oPB1_}zp1&67-p7BhA6>K#spZ!!MqNIUnAd3{uE{kmuT4L01{_Tjp@xNt z)ObKksvIpG73-yRMq;>@FflTwg4p=@Ky*hFS?o6=Oaxvn3tx2f7c`*|d(XVfMF%Xy z^NgAK)>5^g&8E@dtLHU@G>WO_i-2vw;-7Ii?e_g?vSZUuJx&6EYWL6 zf{kiBq{b$BP%_$c;dEHEb{H3uwrtHxXE;z_!^qg&(jm3WKK|eO<2dg2z$uDUP;0NA zL4pj_4TjiR+|MBk(P!;Fn|5Eja&|j=`<2$Z%b&pafMaj^7vqBnq8Or!%`UM4y?}T( z`k4kczoz$-`LJqz+0N=m_$?=NCiUJrb^1{q=eVTbeo^I6=?n82sB?FIm)<*Fui)`c zk0*`}J!WZ&{jORVkgG))z}6+l1O$O5}(dcUsQ}W>S|i&sF-o^e`?YSvox6(^*suUwBZid`1}OY z-ha@*|2?3)!Z2srl%iBKL+e<)%G*3ncL$7{2Q|yzPMI2{T zgvhJfUf+Q>Su~aE=OuPq;N+ZB$_Ju&;%jRr+D~zmos7`Eun;bu3_&oqxPyk{cc&tYJs-L9n&%OwJ2?Vc9x$u#;6ZttZI(H+svmd4i z3g{-=weS(g!8pQmaMSXByU&&@Rn?{CBnCZvdqID5X+(h=e;9uqTjYk!%!+ z(!epCD2&&J)^VnW=Jo>n^u4L!Q znmo~R%z`HoY>73Og!kHqj9YR3DWP6iadq0|@nz+|q!VUG@xGET)4_Dkd^(eNv6SPN zYF17vs$PH4*pIj82a36`3zi)`o^0fu{+kNTzsa|lVnCIcEDL9_<^e}@iR+*YbS1UF*9SJgd3c^!1#;M#1eVJ;e8I!K)|QIOd5p znbaEciCjzAHBXGP2$vLQ594Ae2A}(?X~htZ+b6~;wU^@$$dAHHO{(wy4n?N}{I zF=HnHP7TQ-ACkBtmCB|HPM#I0-BZk=HsaB#oLBQ}#fW@wb`j`* z6sR{dG*wT_`Rd6S?dD}p`ppt2(doYQd&Q)zbeuJ+y z4Vbe&mF~{($h&UZKvqJEC=A!Gy+NG;<8#EeP#3Cl*0OTL?3n0EzX3(4PFNe3=j~(U zgGP?;=IOlLVzqjK>N3 zf*erNg3S_Uc#yJ4|CBuANv%=Cm_5VJ&hE0vxvALO^%-BvdT|?F_z$b2|Ap=fjt0pX z8Z!B3qDP0$Si||zW{?jFt#bows_BP? z2K6+!RF`oJDQ2yxJ`szz9a26F;$GGP=|`r156Ss)2Rcig6iHZ0`ughEx64+Y3=sQo z3O3(4NW70Q`0oR0zE{+pZJfp{Go&)OZ`sD|ule@(Y8_SYYi@05hzuAl(h04cJ#tBX zGUPO%t~QtbG4d2#Kw|=FZEFOg>aT5M*TR9ay^a#4m+6eXdFv-lupHc^{_B9S^F@Ax zC?liuCVQU|F70$S&}LNeiL|s)-(YOt2*pdu$3x5w>$~c@{kc9D^@vV+AV<(uXJm6k z8*++~@!;}Ffu|5ca2i~H6>Du+ixMR6S2!;_n`0|G0~6Akg_B)6CUI+w_3CyVPCZ(_ zV*MOCuzI0`$C$20T`zQFyKSrQ zk(wbeH|8Nu$IEE|Rwo4>bA-26+BX>i;jWDaW=nM&U0w`=_c{V{T4b=2*(~)LSuAe` zCC+$2#Uzc-UFm!)A8%pAPL6FUYqDEpT1ZR{rM{}rY-9!eHqCPv=0)PRY&MVU*17|@ zy1=t50;n?UHqM)NX$ciV4QFJ1rgcP{$QJDZ|LpInuwheU?C>f`z#6E3%GnlsN7eLI zJ4!Q8aU{>{=a@(k$|!2nnizFSGBxiGBf_JIJ-P=K=@E>O2L*W@1|kU-AC z8jgpan>hIaqxF+pC~$I{nBM0~HV!Q!l8suwO^lw>Cs)VU1V$ZWgo9tmeWlM=)bx#nU;|N7-auU)5qbcZBm{-(i zp>5suLG)}2OIL(9#zvC>u~-$2h5FrfAt!#CQi-HRwK^7_#^SRP;_7z$ps#*3ig6_A zW>M~q@r#W6XU%n=e|4M@h6l01raoO~83i-g+$@)1BY}!W!rS&O@DL*c(EAZv5|l=M zO!!hKrN}_CR<}xioxfAKz;tBjLj>0FDMMp^a#!{rhO*U{35kxc*2ryseW7h$0@2 zAlhrY^KC?ht~<1j88TWcE=lS_Fdd86yy+=KBofAF6bgPVTaa0WLawb={Q1WaAy-gj zwr>kljmPAqS*zWHq#8eQ6M86Jff~Yqi_2zPl&q8)U{PBK)(dwy8ea@aQ;jgFOUU`k zcIBvrD6Ij;mTrI)O@?**m#>0#5^cR0`)7(9=2JrrEOsZhsotl8Tmcq9#*hSxlA^N6 z0P-IOMg2CW#1t!*BZ|`BVl6`m%(QWvh_;6%Y2Eblsq?rQO3(&u1tv!v-Yxor_eg=- zT5&bZSWAhOgn)TGgn`v;7wexNYKS4nX}DrEl^aH zwk)Mfbn?BjAkC5NeD7P3ZXa!=F}&AcL5I7b3$lW7mCBHZV&Xfb-DcycP-t)Pyb&6D z_BOM?YcWk}0ZOy_z}-aZT-8zc0~Us_Xe-3Kce>w2wk8z&?94t)U%&|wIvN4gpr@bQ zppO=76v|rg?`384m#Z#JVO?VuKDb%_Y4d!bw@C8IZvhI$fx+A!`3OvmL-&Xd$5>GR zqNV({nAY-dVv-XavlKnhTO!#FFOKAiT8c_O&oOg%|J!M32*srl#%GoprHR!3Z>@*9|WO-VT2tE8EwOTI-ROH4>z`=JRRY`b9(8XTu|6Yb+9jLCMRR z-No<_I21a!5o@GE$zG1i`5;xG=KN^EB4oL4VSy4X z*xay5pJ->qYWB(7IRplQn6%p@uSKK$szioM|DZZgRK?!7Q;WfS1{X-L*K(8f+D|LU zLN1@7!n?V;91Mx~*x2c{tWjq2u^2RdCXc5y>ucrypStP5m|Bolg6fK81kH03WOAf1 zF{`W-ySDZq0J&7{!T>RvQ#iUlOMe?RAU0Y>j3P9wIn{|nVVG5q6pj(5nh=5r6P_GM z8v|I51XsLj#j1)wpJfmeL`wVBa|t}t7S4f>Woo}R$c{FAbbBj*(EJ%_D}tNh={o1J2k~!c6ZWwdPU2W>gq(tO3K8^n;_q!GDe^JD${vs|G&JrY zeLU9ct5EEa*pyWU$$HyqBe~SVzk*f}tw2{f^p|b-pI%vfDmJXUzJ0Tc_T1`^N@|Sv6^H z#VoykD^N`mkRhBYe@82%DAxRXqR+nrzaq6@Y?;Y^%#RBJU0w~8SPbwYqYoJ)}5+x6&FeaGa zoVx<}oE31cZBrK2`B^O@Ty#n)9$(rRLNl<$)K9wXpz2Y`XGb7)5G!40AaU+e%@Pt; znZ(3Q9fH@OVkGY?YXH2>@(0HihuiNm=;!kV5rw5l2?~Q)KwtDCT}xAlJqr2f?hV)= zEg-m^3tUTYvs>~#$0ipfMg!CCRNky+qS$L!EzQP9PmP?o$8pF}qRhe}zgg!4aVGS% z3Sl(6A>{OV7z2-PJjfmp_5)?xcrKK`3O|r7YBxk0JQy6h-Mbr@_yagg6`*IAu*3?# zYlgiWNLgcVhT$1l347zOyENlLY$A@2#UGeRWfsyr-Td>?B1rdzy5m}N;nKK&mTQ)V zeDgv5^5=xX9!EgfV#zQRo`KhXn-3F9@ig;V71w&miXu!__?Y&IwnS7CE$NZz6}E?n zo)us-NycP^XPgJ3LdM$~L8rc?W+RbvRo?%-98n2^U$)wB$tH%Baq+{0t@)-}aF9O# zfQ{8XoVKky?MC?hO;jG?%5ux!!B(F1Fvz)p=>oLoPLUXS`275xH-!tD)aW2M4qX&#bmy%+;`(hgU&o0IIjiG}A=kF?PoA+;(ZDm9I4Vnbk zyVBNJ4f+ky17F=gH`kwaDFRRIR_d@Gbxsj*WDp7ZPdFc&Y7I!#5;i|$9QYmj zndqR2PQ9oc2XGKRQtUCSWT{t1)yUB%*3xb*0~c+eME3Oh*6>~DQ_EKmMw=n1A1yp0!y~)ISR=KPNC|0 z$6?lnuLwh*hK1RTlExS$WU*lM|wImAJ+1Xxc|O@ zik*&W6P!{=p>>)c*ysODuct@`FGGcys1Ps4&TKV|YDK!vGRdE@9sA5SFug#UO>t`qJ7u!(dH8hJ#`K+h@i%SLk}2 zEsqME+Fhl!o0`bDa%N=P2&Jf{X;AVNiTorCptME^)S1b? z?ORvM@pDs}Dz(U0+}ao^G+E19@oqTLifcRj1V_ZI=Vdj%wmP-=uqQu@EwOc&$iQL=`eWLq99n2>ZI_2C%ii5 z<8w!R2lVSmS}V8GKywI$qzB<`@^z6ET=0pDi{rG<|5DFg;>|@he?Pf)C}ml-N>-_t zYRuVOYq#H$iy1*bSUwEkM5$X7N>g>AbBSCMFKmw4Xx0P7ddNb(Dh;-D za=9r>^{~VQ4hDZfMM)H~GybeJf|zEiJC5@~w@!;qm<-2@?URmlpaRUyz`$6T-$Ff~ z{r_FLLd;(iQmL^;Z!37?LyH(T==@etQ{C#rl0&6+n&-<5k^1(?^$ap#)Ds&dC>GLO zJ9oi8My~$Zu9Z9z9I;v zg7-gN=LCO^S}0zbR_ILDedXX-UX_rGqLNLjuBk@CdMcW-KU^lP!l5wSS1H)ggmy~* zsX#mUxYVW}I1wggwn4a?h8@w!G0HD9BZYW( zIh!6HL;-CwfA%Q4i1i#B>>~j;pq?0H|00KslEhLC7Sct@worg4GWoR6H5sHqcCzSJ zpFH#;MlA@XubnfZvghZM?y)Yfc-29`6+#ZIPJ{TNSO5-RIpmecA+<%w+RibiHx9gP zVE7b^mEcA2;?T_9lCo$0fgqGpr_{rcHd^^g@dy0PEvt@|g`{rLALa>Q_+ zyc_egBWfu`nDjkA7*X+$C80|6Z~^Q)WfT?`wrz?G@Eqz<)+5tMdd3(6G5gz&CDwJc zRFN3K-qJ$r7GVIVbO2&McVbHB zKYtF{-!~R3RQ9z;>QFV9ki0JvY2X`G!i_SN#_0YfJ!6|YR?UD!t%WDea#9=B?(l`6 zrl)j*(=0vl?)z4y4skh#0{q2g^PJS0JF*|K*6#y4$Yv49{=wcjIJB?RaraW;1fL}! zb)vmDqbM9uO?a#E4)-4+sg}gH{s)LZHTk3>0*g4L^8BAR6n4+tF7FBUL|NiXHYcn6 z`zkqU_W%)I*>-}en98GM9VU>hLbtsRwb6#(U`6aDfa;D?53{$#z7evkWlM~OCT)ywAea`>3?6c?Mt6D(p`}>;^=<{ zoQ$$1Oc!+oh1dZ$_yPnkp!Ihc1mMhoKWrpt+7@jnJ9cVn?@eL9J=5$?4c-n;qBk#H zOd_tX#0&@)w3Ojol{AyUU*Dcr*fCDgKSdVC&-#w|c0|TNnm$SRM^*19QJO0)KbC(< z>)tVB^%yv84IL<70@gkmMlk4;T1C0CYtJ=@RYBG|ci{0F`;Q4WZL|_?q_j z_b1=16s4%I%od%;Iy18gD7B0&zc|EKygHZEZv`wC)n=__MQc=hT(sD;#J=q(qI2i` zPaS6&(9{<;a8gp~AtfR0MkCTKC0(P-iAXmh3`PhDh_nJqNRBRP7%`9mA_9Vx0|X?* z(WBq%|NZoSct7pKcJDps?A&vnbI$YoMY))Y<^dUOz%=I>P`m*yltK%;Khm3fFLtPi zwXx^016aGqkBk32H=rNpzU6y!hQ!pzVC_Z{VN$=V&IAGs<3!-%#M8oL4T&)+P9{!R z+VJ8g>zR1 zsyCX9!+T06#Z(Y>$crYN+LC*pDJlw+#g ziZdzM4huQ#x6Nwxuz7!s@v?@3_d+`9sgC0nbk$A%c+F-xzJI>{?s!pNs1~zDsz(0s z;lr)hUQ-7%Etl=&@3#j6Z6P(s$n)Js(}!1bo|TKA<`pBRY24FQ-ReEbhAwJ;b+p2N zoqe+GC1fJ2sg7D9G%S=Vwl-y-sL&5#$6K1EDjNc!d(!LIADWP4Q=D}5soM0s_;@_| z#w-8eAcYYiEUNXKo}@AM?@={*B7a#$p4rbB7nCy5w{r3OG|Xegg?dxnQy~6X&bnZJ z{kV)N`Ce^KDMuOc9H>fiTw!u)uUajBLqWj@AZPATSv2{lt2H?6YzUwYcNapwbF~F} zHNz&g-?l&PfU&F^q|{%`s-dfuWKVUD;F1WHWnJ4GlbQ zHm(f}w*vBbZ@=Uu`opg)Y5%7Q@j5gDhgIzmUcQd&*GatOVNI4$P+0H_C}x#s)>B`V z`y;o+y|lc>eFzdYCA;7;=wjXU_vxOq3aVUn$q@Dm?Eif8^@>IEH-tjfpyL6xuH+mm zOI4{&TQ~<^zTnrI6+kxDnCW_u$$tn;gi~!KaJWlQ`K|w)aCZ ze=Xy)kbZVfZ5-`N@el4lPs&f;2p~kQvZm_;N$sqmYs9$>Y8Mcr9gElwZh(Tjf8XLX z){QLTmzpnk{)BRW)7v}XiT%pvNyEy~QnKgzf0TBuI+19Xj>n^-kFJU0R^sGd)z1-| z-ZAvLAxIQKH5xc?WEmAW$l^L1>|KK1SMU-8A`tV6q?V`N%cf^#w;6~fbmk1b>_q4N zoONXBD&b@^=K-TxO}8h9@S`8baan~eO-FWB_X&Uj?LthLT$jx&)-z{x^pL{0Y1lT3SM&L?E-{AC60pK+EYJmY2T^^6f}x z=6}a!q;Y%3=l?j6?DYTj9@0}A=zp`MD#PWQ)J>rh*MuSy3`jKRsCZWZRd8(1Yt|6Xd3x z)2B;`Sq{Y5E>O4qab+U>P@bjftX`w2aBpeiWPfisg<-mggX~A#%a@(D&$_cBN;^Zw z5X5Am-yFxk*^h7t6GaeSe7*E<9_RT<9;>-q%@8@6?OPZYf%WjSfQ! z54PT(1EJcUy-igOOWR9B{fJk^9~O=kE01Zd+v4h>RUgADmG;y#K#VW=EWUOWypRTz zA`}ZX2_4p3z-DS&?*ZO?gh;?(A~7( zw(PNPTAU)?QSaf!-0XxOhAK&43Jp?A%h~-spVo~50+0Uw{$py!S|OqcE8)x!e*+^z z;cH#TbM6GDfIL8Xy>Hk}M=9Uc%`L&Xes-cZMWs$i=G1vJF|6$n=J)GN)LJAZs_i>S z(W7$cqrca&UJ=objN!uQP??f}iD6LQH8W-GZ8o-p{wcOxZz4{zECc1s!w>ftYTv!l zLva>izJ?e876O2YoZ#IAs-o^3Zy2N0JEYDjz)gRtFLIPYQd z?IpfKQ5h|85|+jtUcUM_y=EJ*AmDYXUVp5)>;_v*`u8GDrp_a;sjjryQifJDQ`H5g z25-^QGKed&pNZvDgufIQ|IRtFuSd{nc{iM6N;TLta#8n2HK@`zJTE`@R2J^MFCcfT zE}E5&orQ&)H94p$oU_ho<|4dKpDOg>&x@P}_Yg`X?_@t4-SeweVaa%H=#0Z-wcf$DFEr)Fv_-z1MoXG%CHfh^RKKgM(n!a{rC5Hc zIsH;bHLjAXV$oUEV|!j$ka`;p4N(h$))}|O*ZhJPN2=_pCRcPm-L%f5+v(3DJ`+@! zA)RjcG{SXx+rK^!{=LZCL=s_vm$YxO|7+iLLp3jlbo_F`FeQ4spmaX(j_mvKKbP#5 z{IzE8Prg~*2(5-9T80Z@-(zSaNZ2xL5vfhB0EPvOrG2oN&L=IZrtB;{35~t(3=1x3QtTqwK5fn|9AFl=!Mp<$ddkt zPJj0iQLlwtESv7~txFqlYp8~1MsP}JuHmDIDAT^O0H%{B2K7oRi?f(GpVPQRA3qEvn`$BKo0h*>)tvMo^_052>(tfZ~ zZYMhyogt2fn6~&#;`MnCNwRhfs^}9)0EGpdp^_9^hM0GnugdPmVp6j;^~m7Fct|Lt z{PucuQ(1tc>aKfY^yFUsu=eBr=6Ac}P@ zi^!7U`#E(4rkHPNs1(J=)8pn%Fh3d8-j;m`efBf>caB-l-XI%6db!j1Nn5jn05l6d zIQZ~H9OB!jc@cM^>=V4_<@d_~Y6JJ%X5}aiz~!Z&-R9M^qqhNcZtS;onDe;61HNzX zsmQyNt$u_t;Th|8UP2LxQGo#acTN>RiqkB(l!l+hzu&K`uQ#4iY|8iFFR8a1sAcLI zRNlC@YKw1J&z>;k!4AQ1LVXs~K&FL4N^(cWUOBA^G2g@e>c`PrVmM<=tbA~uqbeFh zgtx+`Aij)59}^1k0XCEXxnx-2DNNnbX-{L5;!5s%M!_<)hQ9nHSyPQ>en0hV8%u42 z@+8$N^SR$eIXJ?8JeY~dxk@CDi2uE_N_ll*J{ryw<-E(T^J>!i5BHuz4clGGmelm14< zcbATaEt`+|1exn1m4TN9*vx)`5h`nK_c#19n0i->;E9nrhu2{dO*Mdb1MU%1;lQ4# zcP}5N^8CC9PZ3@3`J9dx5E?ddS$=l1XTZMc-smZ_YM#|37Smgjpm+LvN~k6DE*s-EAfJAXrp-H5D> zlyN4#W0)zFnDv?xdwC11CqLT&20RP7xw&>^tDaI)`x4^}B?5SpV?70{u(Z4#W6A*o z>Y5V?`{{>0U^lwyA|Oyt$`$Zl-!B{i2+5i>mC6aJu}1cL0_mkAe}@71yyU`#J7zNz zilA9P&eXh@kmHSK;f`59;@z~~p}C(v4CrixeXDEeEk{1;v9fM|m!o04gWYbcJqX)- zPTBDFx#JT2i;nbo(EPDZCng!&&IbXwl>_Gu-&K6_#qZB4Kn)L@ir+Zh24(@;MD)dN z+m?ExlGn;K#V3D%{&jN=^UYdcUnh8C?9K-Nx_u=D&~53uC83}hBH>+ZL-Xk6>3JI@ zm`#+?p+GQEz*ZAyDAtwl8O%_-)!<+vJR@2h`#>P*mQ2zj%KWaSxZ5M)mO8CnPHK%# z%(?}Z8S%UpO?klwC2%d2Sgze~Hyi`bh5+aW@a=?J$9)Es@wq3Q@1OX(9vj#TcWEqP zyqQI2nR)|SqPCCcqUq?Ct7ffiWkNYDQ*6h~o+3BY%oWE51&(HNeU*jNFZm)>>X7C1 z)iT5pH*K+j`8iG<@oa2tiaO!tgP>9-_t+uI6kp3@kq;1sk zV&U3sD@6mEwvwSYy>+@{DO`&7Lq#cK)u?G`&KF6Wp5MZ=V8wB9P(%s|)u)8-N2vUd z!dYiIYK5r5!5eM1HSX?}L6mPUTbw*`0n2W?m__u-{!f=_TXf$u&%m2S&?DJaFPlfK ztgC|$vIRsoa_Ze%d3`DR&wSR743tKm@GvH#fmr_z2{Wx3UHAA_JKUziY(E)_7$>0; zmbC_yV}=CR3~vEFQ8l1{0{kh!2>v3C!yys!NcP?8+P4vfj2H27el&Z}Hq9F(68W3c zt3{Mw8IyUoG(QSUzntBxCn91?izbtkvb^t_Lrh}JmzJ*@ZbguGu2$a>~U)y7wU zQ@d*s89{cT$aV5(ej_mA)3SUo(Sy)K!E$=3d{Q{`?LFWO;de>1IgL##7;G`h^g&nw zec5*Yod247WL-k@l|bSQLBiyxIK_BN9e_y&mfGoqym9n#trd^zB zFj0@3NBm@HB#}1ZHO1Ou#s$9x*0eY3)zetxgPRdlnP=D+Ksqka+YQQI+?huX8YFzi zfQLq16y8Oo4f&@WMEB7^#VtQ2i^;LV4pW)FS3rN%Yfm=?4cGI3ZC*@vLPJvd{1d7&t2>$J@+haad{bg;-iKsDJdUs5 zf?P0fSMp|MZSz{+>d|M{DR<_-y)zH$+4^^ulrp5lpB|(3K_qkuWP+i_oujS^{NPOY zaBYsNnoabAy=TE{Gdt43XvqE~fj=Swxfvb*v zshI1WWq*7Oq^EYGoph$&?#}}$B};yE^%Dzy19ZDbaiuz2Ist{2rK5*7#UB6d=A}Ww z_qBKP_3t##jd>Hh^&~P;$Ny`VheoQs(6N( zOkJT{f91~(xnq8{i|Wqa+=DI7&Y#dy$1;zed7#Sxv9igjMC+q ztR(eOg!JIqCvKOlIB(;c6_ha;^lu7IA8r+~z0Y(i+#$+m#pAj*n`Tp$VF8uMh6+{J zd5AQcSUaI@ofd6fCl>&3fe?m=&#EtjA7sHd>uG%J=?DWc@o~45R6wDNBP~7mzg$Ys zc%Xz7E>Suz4f_$oQs@|QRW&`@>7v_e2~n0rFu;EXlq^_nE#PQl|NK+rHR%N*v9p!= z+2262xe~B7g;{LeI2CsqJQuu3ZNpWZaWi%#`L=e~Z3jLux zbCFJMzj?^Sig$5z2Uz{>t0pvx0))D_P$-ue>52EFBjYiwr2FIpYqSCmGEZ(EBc93N ziqAd65|I(M$k@*`MP@YfM~OqL(IRFA`&Dpe^T%BBPn}7Lg`q}t)#OOq?FiCAKz`Pe zq00w2p31*-Qu2Ce(o-op@@d9A39<_Z~~HP2V)CMh(Ehk_r1L3bG`Z#svnHM)e~ z!kc4nsoZLS_THie8x=`QO7{2l_2nA>Xz#8mo2K|QojLXdkO;jk-Aw#7tBMw*?pwwg zG?gOT0QsC~C$7&0*vP*nDJf}xQsy2s+H#5CTRmQEL|nhNUU1&HFw06cF%i!Eyyo}I zPZkKJ9E3G?G(56JS(AZnR55CoGRp2)Yw(IPfhdu@T9qRi1;~S;n#C+~ugvIUf_&Pu zJy7R~RgQ#UFqoDyRuGiP{PEkJ8ujYv)@>lW(iy>&sQC)b1Kes- z>K@Pf5Lfr2fK8qU6=3O^GlHvN1>#;W>qBKX;m!${LY3hu>z1=F?{pNekF7QGCrau6 z0=hR#8U-^2)jYr%XZXC|49vgKhSB?5)jgW5f;t^}H9K2Ce45oBU$NXKay37(Zg;T4iPl-X#m(KYyLaCeKU32aS3W<*LDL4W%I zaF!C9R}o%E3b&pJqr8~z&941dKS7)eY6EfaN697);h66|1O5^zgq9KdxSQfvP@~Zg zk|^_1%-mdxHR{MUmex*7GT2z`K|wIM;2YCbn4h1Y7Yr6VJgfs0iYn?}#Y?~iW+eTo zMy*7-Ga8vX5E-dtLa?h@a&Li#G1$haiwWU4T?iD)w7m7ZtC2ZZ)B)318eSx_&!J$& zTn|;lMi`*xLwLUsY)kZjSvvI$6vY@HxzrGkBsn9+#zj)cAjJ`mvISsUC#+|AXZ3ar zEpgkx+x*$Jy)Fo#+*HmqQ6d4XvCqb8E`j&uG>f3485_FuE>~sfG5~mbT1SOCJLS~ zl}rAsBXoe$LwS}TU4PJk)H0Eq=Tnf3Xku1Mh+o9g{#8qunKw3#j2iFzsXdkPj?9?n z$dh|O9L3H?B@8I4eNsbETU*Gk97Cc^N?!(?J(iv8bHNF-4T=i&r(9#)b!425&W`k}kw0Ut3c76xVaxF^rz<7X(LhUewIpIn1)p+bw)@R zi+T6yGc(O8mCiH08|D)SN@gr8Lq!L6fcp*D^DYj+c+2kih@8$$<4=^I z=D2i5#|gRc{Uf`nGdM!~G()BCM&!{^Ac38(Y!s_qCw<60AKAKW)R~{|jR!Xr2o;j( zk=Ze{LMV0)j-&PnLI?o%qM$Z5jej2+f1lx7o9D(x?fa{jx6XPEs`2@Y5R4O!6BuTC z4K+Up&H61}r29OBc>Rf*M`rL>G@3J-@GIs5h5eQm| zsWYcy_h2sAx_+L))bz3;19@FrD1k{STHk~rl4yBoKC8S9lDSrN0b2Z4l`xHv@YK158)OiWTvTue?(1|lXSCnolNLb&JuT;S>b*zL*l z|Nnxrq%>mS0+xSIF!g>C5bWd!BM1%-7IE`(_jhsffr)tgx#sRFumV4#{r4j?w*U_q ffgkKK*CS00E^jZGC#xLr9f6Lffkus*W7PiuLi|+l literal 0 HcmV?d00001 diff --git a/Images/green_check.png b/Images/green_check.png new file mode 100644 index 0000000000000000000000000000000000000000..2ceb7afbaf2c7a31dfcdbb70f92834eb2d06657a GIT binary patch literal 33461 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≪i5^YU9Vk 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 literal 0 HcmV?d00001 diff --git a/Images/log.png b/Images/log.png new file mode 100644 index 0000000000000000000000000000000000000000..d3ba04136119140d7a59d33a9dc38190e35fabe5 GIT binary patch literal 24977 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 literal 0 HcmV?d00001 diff --git a/Images/open-file-icon.png b/Images/open-file-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6b7fae2a369bfc5394444a630437b31fda8f3b39 GIT binary patch literal 14964 zcmX9_1z1zx`@b6--JOnZq@`23OF*QN4nd@(21s{ENH;2J5Yi3Opn%ei(h?iB{rCO- z_dGn?!<*-GKIc8}z4zRB13h&je0qEU0Ejd-REz)sg!u^qaIrC8mM?3Z06sok4x_Y@(WxCq%ZJ0=& z1j6n<{N#S^wp#+b#DJS8QR#%CgdK*Sv2^14Y&L4LW%E<9>UYDWge^SJ<87&^eww!vX2!>ObOWPhIvE-y zQUTm9yVSo!OaSh8|Js|MJo^@V^|J)Xaukf>Y5Pb^=JIzDcdN*58LAB;?mWrdjKT+0 zjpNYa@5VnY?re^`+d1_*m$)MV#-qCzmOJcotbg$baQ<_ql+>Ltu6MpL_3(y<`^#i( zR0ZXF14RuN*q|D5Z}eYQZ*Y60MS_dEAFM=t{N9b@wFy3yL9@+M^%yCZuObTm8h}b% zu*m>1l%Miaqr9!fs@(K^H&hSN5&4l(1<3vrI`y8I3P^A|y$_eq$&m&8&k2q2k-~)E zEPSYjusx=4yNv000ZLucb97to9D%J*klY+^V{se+;sei6dH)SXzsJYebH-hxLpXQp z?cZTfUEEVyjHoQCKy2$)5yc<=%K%IU5Z+srKVO4Zro!K5VNX+?;^5YCur_L*IBTf> zH;xEgMUuQljJKqwt8i=l6OPc0}ptCtT>jT?zHi%_fl2TCl6{y ztg(mNZQi8xlK4;&QOtw>rvN@>&XcR#rA;C-H@OiI%D67NQg_X5)WhVUl0=U#*6#9? zw=}&FRI=++0X|%Y6`4fh10420kmwMX+{Ui|)Knx<3N-YbwSp!9Ie^BMadCNq;#ue( z@2jT)6U9Gk@A|0_@X44xLUQB(jlv8-aiVu*egyY(M(6?_Ylri^8QbXbBrPYKq}tCF zdwkL-BS_WeiNbNs-zyW_&8Rd>NOYfO)jjG}Ik_F~0($Rp|C`GQd__jZBwQlgWTw3* zE{l0p_(Rh(`=52*_AuEEA2IDRG_YHit`{Xjp?0~r;G6Z_2aN8HQ^_1Slvw=Yl097b zN}iYLNc3HBgQo`(+5{>x*g6H^{cFbpZK#QeQp5w(^{o_&uJ@Y(UDmP66doSx2AS^}o?4msn@?!GXu%sWb5c!UHxP z;XsI$6J5FB?z|fO zVmgw|7??l?{6A(&RH&>M;WI;TBk07$fcatY1Mp z3_{U5^qh=DHGm3P{l*pvLt?9Wd_esg8A44EiVxnMocV_S&=FiB5=)Z=-O;5B@<1qOfLPE4xp-3O8Cj0IMRd1!tGTH z-4)u(Q-@9tL!+rL9Zz5XGO5{!3TH5VWNr0ysuh5JmFxWmPIPl_ znGv!}E&-E*P+DDP!V3-GZzVIAZe!cZ;z|ZixiYY8M&3vKxen<6vnsKnGnL=kYbaBl z9E0Z$p@Ivs4B4nVrP>+7d_%=TD$|4B$E9rqKPIP$nX2#q75V9wWlDs}zeOGotNxLt z)$MeFDTenT6TqaeZohxZ+R@2GXsEbG_w@|Bq?y?ZqzBl6t3LmZ){=DyZ8(;bzQNo9>Qi z3;_Wu0E$cwCwTU2?=UEj`dX?+H01HLv~WM-Un;(wgB?O7^9O2iIc zE(TrgdHbBQ*MC4Gq9>(0*PfJNcnG{dS*|9Z5yuSf`YnCeLO01bu=rdTQMpR4g5;&x z7Jiy%VwdlrD`v95ynyT?u0rR@WBoEOtqZ;fq%HHfQQTUh|fzuMfTW zZY-u_j+v!9)^^MozC=21vka#uKuQ9sFV{n8EJ)MCR9MyJd_ zwzmh~9}eU=by`t>DKJ4X98}D2SYjtPit>Krh*YYKz$LO#R2(2wXe=CmQFJdL#2|2b ze3mS<{kPY>{(e<_0%H`DMFXG>RwSE4XKC)gVg`jkY7p5N5JnO$wdA*Md>(^7HMSf5 z5)R!POtn4vmE-NahiLGuY66KEfHWe?x_>K4iiw6a^nB|%izx{vNPv>M5>sMG)0D`$ zM)2g?tS?_zzi*v8tPyu!A#CLgyK^mEHggud4jVpslDAUuyswP?oP)8cVg9B3`lu0< z0(Q6^HlEoo|3SqAxs3m<#Boj9bLYqE`?rK5UVeQPG6OJE z#hmPTvN|$Jy0g97I1}_m6=(HocvK)~B?P{A z%hh>ye*G)`yC0kbOR&~%!PN=L!W8_b<+H11|DLt>&}kb-#NQ0nb$XcN%kWQ@=+F82 ze=oxJ&h$RuDKa75Q0^~s?`osQX&#EK&6OZR2j3MxsIO%WzwsN;c)*l~f zG)CLC@54(76Q-*Z`gkWT>Fq>tyoS7(h^78>UqlgMLII55GsK@cM6XHP-|?KlP!+DT z()K2)O?7w{3|-H?Q?X-Ch~#LRH~E8avLC;yu!UA60myPxWB(K@D`1X~X(1KE*~5xt zC4-oRONQe>PdI8e5Ed_XqwQLMv=ftx7IOQXP1}uG?>R0NZ-BudqLTTgbuto)r*ZKfm{x(S!87N5~C|rk;Ep zG9tgqB$Zf)+x^SVLt`pjMeB>2wbnb^?+Y6$T3Wb(DwD#Z*%1S?Dpx;^T#n$1;`}`M zR`sO>y&@D&-bZp}+WlRHEXEb76cvn17p74FZ`}}G3U$TNw5vavzP)Fsz%A0kYWnn8LUTXzK$#AN&>H?|9@4C`xeM;_a{xCC^#R$%hrAlm)j2;oOFDR`4xV<(e`%i0a zMe6Y)IyGT~pw{3hn`Ky_RQ2)UQ?9Sp;*8hpwmYlcDEyOYCa3#x!-G6SG*$k6? z42AcdPI!Lqq^Ik`y4_a@UJAo>6e{Vl_yDx4$xn|c&oh4fG|#Ei!X7D>AQ*uGD561T z_eXkhpMyx0H)Qx+pH`k?P~Frs@VNQ@OKY($W)waB&mQ*wM$=cuOugr_9oh^|p+-

K>0_%vCbH%!w0WB4(1S=wxv`;knJ!`vEm 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 S&FhfWvsgz2CAR!?Q!q6=#f;0kxbmzp2 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

KXKR=d)qr$N{KQ*Pt5ICo>-d|Pc=o-#PbY_FFT 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 Tf>av(5k*N}RjvkR7WRJt9Jpg7 literal 0 HcmV?d00001 diff --git a/Images/red-led-on-md.png b/Images/red-led-on-md.png new file mode 100644 index 0000000000000000000000000000000000000000..f0bc2f588f8b057c004b13ed85af8b941567931d GIT binary patch literal 24226 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 literal 0 HcmV?d00001 diff --git a/Images/red_cross.png b/Images/red_cross.png new file mode 100644 index 0000000000000000000000000000000000000000..4e7f87f1bfc4d32563345c8c788dd32f62f9d680 GIT binary patch literal 69821 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⁣ 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 + LogFilters << mFilter;//"*.bin"; + + //Load files in base directory + QDir LogDir(dir); + LogDir.setFilter(QDir::Files | QDir::NoDotAndDotDot); + LogDir.setNameFilters(LogFilters); + LogDir.setSorting(QDir::Name); + list = LogDir.entryInfoList(); + if(list.size() != 0) + { + //Extract data for each passage + for(int i = 0; i < list.size(); i++) + { + //ParseNewLog(list.at(i).filePath(),KeepData); + unsigned int ret; +// CLogElement *NewLog = CTrainLogFileMgr::instance()->OpenTrainLog(list.at(i).filePath(),ret); +// if(ret == RET_OK) + if(mFilter == "*.bin") + { + CLogElement *NewLog = CTrainLogFileMgr::instance()->OpenTrainLog(list.at(i).filePath(),ret); + if(ret == RET_OK) + { + emit NewLogParsed(NewLog); + } + } + else + { + emit NewLogParsed(list.at(i).filePath(),KeepData); + } + } + } + else + { + emit EmptyDirParsed(); + } + + + //Check for subdirectories + QDir SubDirectories(dir); + + SubDirectories.setFilter(QDir::Dirs | QDir::NoDotAndDotDot); + + QFileInfoList SubDirList = SubDirectories.entryInfoList(); + for(int i = 0; i < SubDirList.size(); i++) + { + ParseDir(QDir(SubDirList.at(i).absoluteFilePath()), KeepData); + } + + return 1; +} + +void CDirParserThread::SetParsingInfo(QDir dir, QString Filter, bool KeepData) +{ + qDebug("DirParserThread parsing info: dir: %s, Filter: ",dir.dirName().toAscii().data(),Filter.toAscii().data()); + mRootDir = dir; + mKeepData = KeepData; + mFilter = Filter; +} + +void CDirParserThread::KillThread() +{ + mMutex.lockForWrite(); + mExecThread = false; + mMutex.unlock(); +} diff --git a/sources/DirParserThread.h b/sources/DirParserThread.h new file mode 100644 index 0000000..3d02c5b --- /dev/null +++ b/sources/DirParserThread.h @@ -0,0 +1,34 @@ +#ifndef DIRPARSERTHREAD_H +#define DIRPARSERTHREAD_H +#include "GlobalDefine.h" +#include +#include +#include "TrainLogFileMgr.h" + +class CDirParserThread : public QObject +{ + Q_OBJECT +public: + CDirParserThread(); + void SetParsingInfo(QDir dir,QString Filter,bool KeepData = false); + void KillThread(); + int ParseDir(QDir dir, bool KeepData = false); + +private: + QDir mRootDir; + bool mKeepData; + QReadWriteLock mMutex; + bool mExecThread; + QString mFilter; + +public slots: + void ParseDirectories(); + +signals: + void NewLogParsed(QString,bool); + void NewLogParsed(CLogElement*); + void ParsingFinished(int); + void EmptyDirParsed(); +}; + +#endif // DIRPARSERTHREAD_H diff --git a/sources/GlobalDefine.h b/sources/GlobalDefine.h new file mode 100644 index 0000000..aeb96ef --- /dev/null +++ b/sources/GlobalDefine.h @@ -0,0 +1,77 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Description du fichier si nécessaire. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20121210 JFM + Verision d'origine. + +### YYYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ +#ifndef GLOBAL_DEFINE +#define GLOBAL_DEFINE + +//Screen resolution. +#define SCREEN_RES_WIDTH 1600 +#define SCREEN_RES_HEIGHT 768 + +//Train parameters +#define MR_BOGIE_LENGTH 1.52 //meters +#define MPM_BOGIE_LENGTH 2.0 //meters + + + +//Misc definitions +#define USE_FAST_LOGFILE_LOADING +#define MAX_LOG_FILE_COUNT 25000 +#define MAX_LOG_DIR_SIZE (qint64)1073741824 //in bytes = 1 GB +#define USE_ANALOG_ACQUISITION + + +#define ZT_TCP_PORT 1234 +#define ZT_UDP_PORT 41245 + +//Debug defs +//#define LOG_RAM_USAGE + +//General purpose return values. +enum eGeneralRetValue +{ + RET_OK, + RET_ERROR +}; + +enum eZTID +{ + ANGRIGNON_ZT_ID, + HONORE_BEAUGRAND_ZT_ID, + LONGUEUIL_ZT_ID, + BERRI_UQAM_ZT_ID, + SNOWDON_ZT_ID, + SAINT_MICHEL_ZT_ID, + COTE_VERTU_ZT_ID, + HENRI_BOURASSA_ZT_ID, + MONTMORENCY_ZT_ID, + MONTMORENCY_10_12_ZT_ID, + MONTMORENCY_10_22_ZT_ID, + + NB_ZT_ID +}; + +#endif diff --git a/sources/GuiElements/AnalogGraphItem.cpp b/sources/GuiElements/AnalogGraphItem.cpp new file mode 100644 index 0000000..50c9813 --- /dev/null +++ b/sources/GuiElements/AnalogGraphItem.cpp @@ -0,0 +1,412 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2013 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Classe d'affichage d'un graphique analogique (vitesse du train, sondes lazer, + etc.) La fonction SetData permet d'associer la liste de points à tracer. La + fonction DisplayData() permet de fixer le timespan à afficher. La fonction détermine + quels points sont dans le span et crée une liste de lignes qui sont ensuite affichés + dans la fonction de rappel paint(). + + Utilisée dans la page de visualisation des passages de train. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20131024 JFM + Verision d'origine. + +### YYYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + +#include "AnalogGraphItem.h" +#include +#include +#include +#include + +CAnalogGraphItem::CAnalogGraphItem(QGraphicsItem *Parent) +{ + setParentItem(Parent); + mDataSet = 0; + mStartTime = mStopTime = 0; + mDataValid = false; + mLabel = new QGraphicsTextItem(this); + + mGraphPixmap = new QPixmap(boundingRect().width(),boundingRect().height()); + mHorizLine = 0; + mYOffset = 0; + + + +} +CAnalogGraphItem::~CAnalogGraphItem() +{ + delete mGraphPixmap; + + if(mHorizLine != 0) + delete mHorizLine; +} + +void CAnalogGraphItem::SetData(QList *DataList) +{ + mDataSet = DataList; + //Build the lines list +} + +unsigned int CAnalogGraphItem::DisplayData(quint64 StartTime, quint64 StopTime) +{ + + mPainterPath = QPainterPath(); + + if(mDataSet == 0) + return RET_OK; + + if(mDataSet->isEmpty()) + return RET_ERROR; + + quint64 MinTime = mDataSet->first()->mTime; + quint64 MaxTime = mDataSet->last()->mTime; + + if(StartTime >= StopTime) + return RET_ERROR; + if(StartTime < MinTime) + return RET_ERROR; + if(StopTime > MaxTime) + return RET_ERROR; + + + + quint64 TimeSpan = StopTime - StartTime; + + + + mStartTime = StartTime; + mStopTime = StopTime; + + + //Find the index of the first and last point included in the timespan. + int StartIndex = 0, StopIndex = 0; + int i = 0; + bool StartFound = false, StopFound = false; + + quint64 StartDrawTime = StartTime ,EndDrawTime = StopTime; + + if(StartTime < mAbsoluteStartTime) + StartDrawTime = mAbsoluteStartTime; + + + if(StopTime > mAbsoluteEndTime) + EndDrawTime = mAbsoluteEndTime; + + + while(StartFound == false || StopFound == false) + { + if(i >= mDataSet->size()) + { + qDebug("GraphItem::Array overflow while searching for time index"); + return RET_ERROR; + } + + quint64 CurTime = mDataSet->at(i)->mTime; + if(CurTime <= StartDrawTime) + { + StartIndex = i; + StartFound = true; + } + if(CurTime >= EndDrawTime && !StopFound) + { + StopIndex = i; + StopFound = true; + } + + i++; + } + + //Find the Y scaling (vertical) + qreal MaxValue = std::numeric_limits::min(); + qreal MinValue = std::numeric_limits::max(); + + for(int i = 0; i < mDataSet->size(); i++) + { + qreal CurValue = mDataSet->at(i)->mValue; + + if(CurValue != -1 && CurValue != 0) //-1 is the value for "NO DATA" and 0 is not a valid value + { + if(MaxValue < CurValue) + MaxValue = CurValue; + if(MinValue > CurValue) + MinValue = CurValue; + } + } + + if(MinValue < 0) + { + MinValue *= -1; + MinValue += 1; + mYOffset = MinValue; + + for(int i = 0; i < mDataSet->size(); i++) + { + mDataSet->at(i)->mValue += MinValue; + } + MaxValue += MinValue; + MinValue = 1; + } + + //Build the lines list + mLinesList.clear(); + qreal Width = boundingRect().width(); + qreal Height = boundingRect().height(); + qreal tick = (Width)/TimeSpan; //pixels per microsec + qreal YFactor = (Height-2)/(MaxValue - MinValue); + mYScaling = YFactor; + mXScaling = tick; + + + qreal X1,X2,Y1,Y2; + + //There is no quadratic interpolation, simply draw a straight + //line between the points. When needed, execute a linear + //interpolation when one of the two points creating a line is + //outside the timespan (at both extremities of the view). + + // P2 P3 + // P1 | *-------* | + // * | | P4 + // | | * + // |<----timespan---->| + // Start End + // + //Interpolation needed between Start->P2 and P3->End so there is no + //"gap" in the graph between the first/last points and the view. + + + for(int i = StartIndex; i < StopIndex; i++) + { + if(mDataSet->at(i)->mValue != -1) //-1 is the value for "NO DATA". + { + QLine NewLine; + + //Check if interpolation is needed at the left + //of the span + if(mDataSet->at(i)->mTime < StartTime) + { + //Interpolate Y value at StartTime + qreal x1 = mDataSet->at(i)->mTime; + qreal y1 = mDataSet->at(i)->mValue - MinValue; + qreal x2 = mDataSet->at(i+1)->mTime; + qreal y2 = mDataSet->at(i+1)->mValue - MinValue; + + // Y = mX + B + qreal DeltaX = x2 - x1; + qreal DeltaY = y2 - y1; + + qreal m = DeltaY/DeltaX; + + Y1 = (qreal)StartTime*m; + + Y1 += (y2 - m*x2); + + X1 = 0; + + } + else + { + X1 = mDataSet->at(i)->mTime - StartTime; + Y1 = mDataSet->at(i)->mValue - MinValue; + } + + //Check if interpolation is needed at the right + //of the span + if(mDataSet->at(i+1)->mTime > StopTime) + { + //Interpolate Y value at StopTime + qreal x1 = mDataSet->at(i)->mTime; + qreal y1 = mDataSet->at(i)->mValue - MinValue; + qreal x2 = mDataSet->at(i+1)->mTime; + qreal y2 = mDataSet->at(i+1)->mValue - MinValue; + + qreal DeltaX = x2 - x1; + qreal DeltaY = y2 - y1; + + qreal m = DeltaY/DeltaX; + + Y2 = (qreal)(StopTime)*m; + + Y2 += (y2 - m*x2); + + X2 = StopTime - StartTime; + } + else + { + X2 = mDataSet->at(i+1)->mTime - StartTime; + Y2 = mDataSet->at(i+1)->mValue - MinValue; + } + + Y1 = Height - Y1*YFactor; + Y2 = Height - Y2*YFactor; + + NewLine.setLine(X1*tick,Y1-1,X2*tick,Y2-1); + mLinesList.append(NewLine); + + if(mPainterPath.isEmpty()) + mPainterPath.moveTo(X1*tick,Y1-1); + +// mPainterPath.lineTo(X2*tick,Y2-1); + } + } + + if(mHorizLine != 0) + { + Y1 = (mHorizLineYPos+mYOffset-MinValue); + Y1 = Height - Y1*YFactor; + mHorizLine->setP1(QPoint(0,Y1-1)); + mHorizLine->setP2(QPoint((mDataSet->at(StopIndex)->mTime - StartTime)*tick,Y1-1)); + } + + mDataValid = true; + +//#ifndef WINDOWS_OS + mGraphPixmap->fill(QColor(245, 245, 255)); + QPainter *painter = new QPainter(mGraphPixmap); + painter->drawLines(mLinesList); + delete painter; +//#endif + + update(); + + return RET_OK; +} + +qreal CAnalogGraphItem::GetValueForTime(quint64 time) +{ + qreal value = 0.0; + for(int i = 0; i < mDataSet->size()-1; i++) + { + if(time >= mDataSet->at(i)->mTime && time < mDataSet->at(i+1)->mTime) + { + value = mDataSet->at(i)->mValue - mYOffset; + break; + } + } + + QString label = mLabelTitle; + label += "\n"; + label += QString().sprintf("%.2f",value); + + mLabel->setPlainText(label); + mLabel->setPos(mLabel->pos().x(),boundingRect().height()/2 - mLabel->boundingRect().height()/2); + update(); + return value; +} + +void CAnalogGraphItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + Q_UNUSED(option) + Q_UNUSED(widget) + + if(mDataValid == false) + return ; + if(mDataSet == 0) + return; + if(mDataSet->size() == 0) + return; + +// painter->setClipRect(option->exposedRect); + + +// QPen pen; +// pen.setWidth(1); + +//// pen.setColor(Qt::red); +//// painter->setPen(pen); +//// painter->drawRect(boundingRect()); + +// pen.setColor(Qt::black); +// painter->setPen(pen); + +//#ifdef WINDOWS_OS +// painter->drawLines(mLinesList); +//#else + + + painter->drawPixmap(0,0,*mGraphPixmap); + if(mHorizLine != 0) + { + painter->setPen(QPen(Qt::red)); + painter->drawLine(*mHorizLine); + } + + //painter->drawPath(mPainterPath); + + +//#endif +// for(int i = 0; i < mLinesList.size(); i++) +// { +// painter->drawEllipse(mLinesList.at(i).p1(),2,2); +// } + +} + + +//void CGraphItem::UpdateDisplay() +//{ +// DisplayData(mStartIndex,mStopIndex); +// update(); +//} + +void CAnalogGraphItem::AddHorizontalLine(qreal YPosition) +{ + if(mHorizLine == 0) + mHorizLine = new QLine(); + + mHorizLineYPos = YPosition; +} + +void CAnalogGraphItem::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + event->ignore(); +} + + +void CAnalogGraphItem::mouseReleaseEvent( QGraphicsSceneMouseEvent * event) +{ + event->ignore(); +} + +void CAnalogGraphItem::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + Q_UNUSED(event) + //mBackgroundRect->setRect(boundingRect()); + delete mGraphPixmap; + mGraphPixmap = new QPixmap(boundingRect().width(),boundingRect().height()); + DisplayData(mStartTime,mStopTime); +} +void CAnalogGraphItem::SetLabel(QString label,int Offset) +{ + QFont font; + font.setBold(true); + mLabelTitle = label; + mLabel->setFont(font); + mLabel->setPlainText(label); + mLabel->setPos(-Offset,boundingRect().height()/2 - mLabel->boundingRect().height()/2); +} + +CGraphAnalogDataPair::CGraphAnalogDataPair(qreal Value, quint64 Time): + mValue(Value), + mTime(Time) +{ +} diff --git a/sources/GuiElements/AnalogGraphItem.h b/sources/GuiElements/AnalogGraphItem.h new file mode 100644 index 0000000..aa419b9 --- /dev/null +++ b/sources/GuiElements/AnalogGraphItem.h @@ -0,0 +1,60 @@ +#ifndef ANALOGGRAPHITEM_H +#define ANALOGGRAPHITEM_H + +#include +#include +#include +#include +#include +#include + +class CGraphAnalogDataPair +{ +public: + CGraphAnalogDataPair(qreal Value, quint64 Time); + qreal mValue; //changed from qint32 + quint64 mTime; +}; + +class CAnalogGraphItem : public QGraphicsWidget +{ + Q_OBJECT +public: + CAnalogGraphItem(QGraphicsItem *Parent = 0); + ~CAnalogGraphItem(); + + QList *mDataSet; + QGraphicsRectItem *mBackgroundRect; + + unsigned int DisplayData(quint64 StartTime, quint64 StopTime); + void SetData(QList *DataList); + void SetLabel(QString label,int Offset); + void SetAbsoluteLimits(quint64 StartTime,quint64 EndTime){mAbsoluteStartTime = StartTime; mAbsoluteEndTime = EndTime;} + void AddHorizontalLine(qreal YPosition); + qreal GetValueForTime(quint64 time); + + virtual void paint( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0 ); + virtual void mousePressEvent ( QGraphicsSceneMouseEvent * event ); + virtual void mouseReleaseEvent( QGraphicsSceneMouseEvent * event); + virtual void resizeEvent(QGraphicsSceneResizeEvent *event); + +private: + + bool mDataValid; + quint64 mStartTime, mStopTime, mAbsoluteEndTime,mAbsoluteStartTime; + QVector mLinesList; + QString mLabelTitle; + QGraphicsTextItem *mLabel; + QPixmap *mGraphPixmap; + qreal mYScaling,mXScaling; + qreal mYOffset; + qreal mHorizLineYPos; + QLine *mHorizLine; + + QPainterPath mPainterPath; + + + +}; + +#endif // ANALOGGRAPHITEM_H diff --git a/sources/GuiElements/DatabaseMgrPage.cpp b/sources/GuiElements/DatabaseMgrPage.cpp new file mode 100644 index 0000000..f8b2ce2 --- /dev/null +++ b/sources/GuiElements/DatabaseMgrPage.cpp @@ -0,0 +1,904 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Page de sélection des options (sélection des fonctions de détection, ingénierie, + mode entretien, etc.). + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20131021 JFM + Verision d'origine. + +### YYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + + +#include "DatabaseMgrPage.h" +#include +#include "GlobalDefine.h" +#include +#include +#include "OutilZT.h" +#include +#include +#include +#include +#include "OutilZT.h" +#include +#include +#include +#include +#include +#include +#include +#include + + +CDatabaseMgrPage::~CDatabaseMgrPage() +{ + delete mDatabaseImporterThread; + delete mDatabaseImporterWorkerThread; +} + +CDatabaseMgrPage::CDatabaseMgrPage(QGraphicsWidget *Parent, bool EngMode) +{ + Q_UNUSED(Parent) + + mProgramHandle = 0; + + mBackgroundRect = new QGraphicsRectItem(boundingRect(), this); + QBrush BackgroundBrush(QColor(245, 245, 255)); + mBackgroundRect->setBrush(BackgroundBrush); + + QGraphicsTextItem *Title = new QGraphicsTextItem("Base de données",this); + QFont font; + font.setPointSize(18); + Title->setFont(font); + Title->setPos(40,10); + + mCancelButton = new CTextButtonWidget("Fermer"); + mCancelButton->setParentItem(this); + mCancelButton->setPos(50,360); + connect(mCancelButton,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*))); + + mImportDataButton = new CTextButtonWidget("Importer"); + mImportDataButton->setParentItem(this); + mImportDataButton->setPos(125,200); + connect(mImportDataButton,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*))); + mImportDataButton->hide(); + + + mCancelImportButton = new CTextButtonWidget("Annuler"); + mCancelImportButton->setParentItem(this); + mCancelImportButton->setPos(125,200); + mCancelImportButton->hide(); + connect(mCancelImportButton,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*))); + + + + + Title = new QGraphicsTextItem("Importation de passages",this); + font.setPointSize(14); + Title->setFont(font); + Title->setPos(40,70); + + QPen RectPen; + RectPen.setWidth(2); + QGraphicsRectItem *ImportZoneFrame = new QGraphicsRectItem(this); + ImportZoneFrame->setRect(QRectF(0,0,230,230)); + ImportZoneFrame->setPos(40,100); + ImportZoneFrame->setPen(RectPen); + + QGraphicsProxyWidget *WidgetProxy = new QGraphicsProxyWidget(this); + mImportErrorDataOnlyChkBx = new QCheckBox("Seulement les déclenchements"); + WidgetProxy->setWidget(mImportErrorDataOnlyChkBx); + WidgetProxy->setPos(60,110); + mImportErrorDataOnlyChkBx->setChecked(false); + + WidgetProxy = new QGraphicsProxyWidget(this); + mFilterDuplicateChkBx = new QCheckBox("Filtrer les doublons"); + WidgetProxy->setWidget(mFilterDuplicateChkBx); + WidgetProxy->setPos(60,140); + mFilterDuplicateChkBx->setChecked(true); + +// WidgetProxy = new QGraphicsProxyWidget(this); +// mDeleteSourceDataChkBx = new QCheckBox("Effacer données sources"); +// WidgetProxy->setWidget(mDeleteSourceDataChkBx); +// WidgetProxy->setPos(60,170); + + + + mProgressBar = new QProgressBar(); + WidgetProxy = new QGraphicsProxyWidget(this); + WidgetProxy->setWidget(mProgressBar); + WidgetProxy->setPos(60,240); + + font.setPointSize(8); + mProgressStatusText = new QGraphicsTextItem(this); + mProgressStatusText->setFont(font); + mProgressStatusText->setPos(60,260); + mProgressStatusText->setPlainText("Progrès de l'importation"); + + + mDatabaseImporterWorkerThread = new CDatabaseImporterThread(); + mDatabaseImporterThread = new QThread(); + mDatabaseImporterWorkerThread->moveToThread(mDatabaseImporterThread); + connect(mDatabaseImporterThread,SIGNAL(started()),mDatabaseImporterWorkerThread,SLOT(ImportLogs())); + connect(mDatabaseImporterWorkerThread,SIGNAL(DatabaseImportFinished(bool,QStringList*)),this,SLOT(DatabaseImportFinished(bool,QStringList*))); + connect(mDatabaseImporterWorkerThread,SIGNAL(ResetProgressBar()),mProgressBar,SLOT(reset())); + connect(mDatabaseImporterWorkerThread,SIGNAL(SetProgressBarRange(int,int)),mProgressBar,SLOT(setRange(int,int))); + connect(mDatabaseImporterWorkerThread,SIGNAL(SetProgressBarVal(int)),mProgressBar,SLOT(setValue(int))); + connect(mDatabaseImporterWorkerThread,SIGNAL(SetProgressText(QString)),this,SLOT(SetProgressText(QString))); + + + Title = new QGraphicsTextItem("Maintenance de la BD",this); + font.setPointSize(14); + Title->setFont(font); + Title->setPos(350,70); + + QGraphicsRectItem *MaintenanceZoneFrame = new QGraphicsRectItem(this); + MaintenanceZoneFrame->setRect(QRectF(0,0,260,240)); + MaintenanceZoneFrame->setPos(350,100); + MaintenanceZoneFrame->setPen(RectPen); + + mDeleteDBDuplicatesBtn = new CTextButtonWidget("Effacer doublons"); + mDeleteDBDuplicatesBtn->setParentItem(this); + mDeleteDBDuplicatesBtn->setPos(360,110); + connect(mDeleteDBDuplicatesBtn,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*))); + + mDeleteNonErrorLogs = new CTextButtonWidget("Effacer passages sans décl."); + mDeleteNonErrorLogs->setParentItem(this); + mDeleteNonErrorLogs->setPos(360,140); + connect(mDeleteNonErrorLogs,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*))); + + mDeleteZTLogFiles = new CTextButtonWidget("Effacer fichiers ZTLOG orphelins"); + mDeleteZTLogFiles->setParentItem(this); + mDeleteZTLogFiles->setPos(360,170); + connect(mDeleteZTLogFiles,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*))); + + mRebuildDatabaseFile = new CTextButtonWidget("Reconstruire le fichier BD"); + mRebuildDatabaseFile->setParentItem(this); + mRebuildDatabaseFile->setPos(360,200); + connect(mRebuildDatabaseFile,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*))); + + + + mDBMaintenanceProgressBar = new QProgressBar(); + WidgetProxy = new QGraphicsProxyWidget(this); + WidgetProxy->setWidget(mDBMaintenanceProgressBar); + WidgetProxy->setPos(360,240); + + font.setPointSize(8); + mDBMaintenanceProgressStatusText = new QGraphicsTextItem(this); + mDBMaintenanceProgressStatusText->setFont(font); + mDBMaintenanceProgressStatusText->setPos(360,260); + mDBMaintenanceProgressStatusText->setPlainText(""); + + if(EngMode == false) + { + mDeleteDBDuplicatesBtn->hide(); + mDeleteNonErrorLogs->hide(); + mDeleteZTLogFiles->hide(); + mRebuildDatabaseFile->hide(); + mDBMaintenanceProgressBar->hide(); + mDBMaintenanceProgressStatusText->hide(); + mFilterDuplicateChkBx->hide(); + } + + font.setPointSize(12); + mDBFileCountText = new QGraphicsTextItem(this); + mDBFileCountText->setFont(font); + mDBFileCountText->setPos(300,10); + mDBFileCountText->setPlainText("Nombre de passages: 440\nNombre de fichiers ZTLog: 30"); + +} + +void CDatabaseMgrPage::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + Q_UNUSED(event) + mBackgroundRect->setRect(boundingRect()); +} + +void CDatabaseMgrPage::ButtonClicked(CTextButtonWidget *BtnPtr) +{ + if(BtnPtr == mCancelButton) + { + hide(); + } + else if(BtnPtr == mImportDataButton) + { + ImportData(mImportErrorDataOnlyChkBx->isChecked(), mFilterDuplicateChkBx->isChecked()); + } + else if(BtnPtr == mCancelImportButton) + { + mDatabaseImporterWorkerThread->KillThread(); + } + else if(BtnPtr == mDeleteDBDuplicatesBtn) + { + CleanDBDuplicates(); + } + else if(BtnPtr == mDeleteNonErrorLogs) + { + if(QMessageBox::question(0,"Attention","Voulez vous vraiment éliminer les passages\nsans déclenchements?\nCette action est irréversible",QMessageBox::Yes,QMessageBox::No) == QMessageBox::Yes) + { + CleanDBNormalPasses(); + } + } + else if(BtnPtr == mDeleteZTLogFiles) + { + if(QMessageBox::question(0,"Attention","Voulez vous vraiment éliminer les fichiers orphelins?\nCette action est irréversible",QMessageBox::Yes,QMessageBox::No) == QMessageBox::Yes) + { + CleanSingleZTLogFiles(); + } + } + else if(BtnPtr == mRebuildDatabaseFile) + { + mProgramHandle->RebuildDatabaseFile(); + } +} + + +bool CDatabaseMgrPage::ImportData(bool OnlyErrorLogs, bool FilterDuplicates) +{ + + + + //Ask the user to select the data source directories... + QStringList SelectedDirs; + SelectedDirs.clear(); + QFileDialog FileDlg; + + + FileDlg.setFileMode(QFileDialog::DirectoryOnly); + + QListView *l = FileDlg.findChild("listView"); + if (l) + { + l->setSelectionMode(QAbstractItemView::MultiSelection); + } + QTreeView *t = FileDlg.findChild(); + if (t) + { + t->setSelectionMode(QAbstractItemView::MultiSelection); + } + if(FileDlg.exec() == QDialog::Rejected) + { + return false; + } + + SelectedDirs = FileDlg.selectedFiles(); + + if(SelectedDirs.isEmpty()) + return false; + + mDatabaseImporterWorkerThread->SetDatabasePath(mProgramHandle->GetLogDataPath()); + mDatabaseImporterWorkerThread->SetImporParams(SelectedDirs,FilterDuplicates,OnlyErrorLogs); + mDatabaseImporterWorkerThread->SetLogMgrHandle(mLogMgrHandle); + + mCancelButton->hide(); + mImportDataButton->hide(); + mCancelImportButton->show(); + + mDatabaseImporterThread->start(); + + return true; +} + + +bool CDatabaseMgrPage::CleanDBDuplicates() +{ + + int NbDeletedFiles = 0; + QList *LogsList = mLogMgrHandle->GetLogsList(); + + mDBMaintenanceProgressStatusText->setPlainText("Analyse en cours"); + mDBMaintenanceProgressBar->setRange(0,LogsList->size()); + for(int i = 0; i < LogsList->size(); i++) + { + mDBMaintenanceProgressBar->setValue(i+1); + for(int j = i+1; j < LogsList->size(); j++) + { + QCoreApplication::processEvents(); + + if((LogsList->at(i)->mZTLogType == ZT1_LOG_TYPE) && (LogsList->at(j)->mZTLogType == ZT1_LOG_TYPE)) + { + CZT1LogElement *ZT1LogElement_A = (CZT1LogElement*)LogsList->at(i); + CZT1LogElement *ZT1LogElement_B = (CZT1LogElement*)LogsList->at(j); + + if(ZT1LogElement_A->mStationName == ZT1LogElement_B->mStationName) + { + if(ZT1LogElement_A->mPassageDateTime == ZT1LogElement_B->mPassageDateTime) + { + //delete file from element B... + DeleteFile(ZT1LogElement_B->mLogFileName); + NbDeletedFiles++; + mDBMaintenanceProgressStatusText->setPlainText(QString().sprintf("Analyse en cours\n%d passages éliminés",NbDeletedFiles)); + } + } + } + else if((LogsList->at(i)->mZTLogType == ZT2_LOG_TYPE) && (LogsList->at(j)->mZTLogType == ZT2_LOG_TYPE)) + { + CZT2LogElement *ZT2LogElement_A = (CZT2LogElement*)LogsList->at(i); + CZT2LogElement *ZT2LogElement_B = (CZT2LogElement*)LogsList->at(j); + + if(ZT2LogElement_A->mStationName == ZT2LogElement_B->mStationName) + { + if(ZT2LogElement_A->mPassageDateTime == ZT2LogElement_B->mPassageDateTime) + { + //delete file from element B... + DeleteFile(ZT2LogElement_B->mLogFileName); + NbDeletedFiles++; + mDBMaintenanceProgressStatusText->setPlainText(QString().sprintf("Analyse en cours\n%d passages éliminés",NbDeletedFiles)); + } + } + } + } + } + + mDBMaintenanceProgressStatusText->setPlainText(QString().sprintf("Analyse des doublons terminée\n%d passages éliminés",NbDeletedFiles)); + mProgramHandle->LogsDatabaseChanged(0); + + return true; +} + +bool CDatabaseMgrPage::CleanDBNormalPasses() +{ + int NbDeletedFiles = 0; + QList *LogsList = mLogMgrHandle->GetLogsList(); + + mDBMaintenanceProgressStatusText->setPlainText("Analyse en cours"); + mDBMaintenanceProgressBar->setRange(0,LogsList->size()); + for(int i = 0; i < LogsList->size(); i++) + { + mDBMaintenanceProgressBar->setValue(i+1); + QCoreApplication::processEvents(); + + if(LogsList->at(i)->mZTLogType == ZT1_LOG_TYPE) + { + CZT1LogElement *ZT1LogElement = (CZT1LogElement*)LogsList->at(i); + + if(ZT1LogElement->mZTDetections.size() == 0 /*&& ZT1LogElement->mFlags.mIsProblematicPassage != 1*/ && ZT1LogElement->mFileProtected == false) + { + + DeleteFile(ZT1LogElement->mLogFileName); + NbDeletedFiles++; + mDBMaintenanceProgressStatusText->setPlainText(QString().sprintf("Analyse en cours\n%d passages éliminés",NbDeletedFiles)); + } + } + else + { + CZT2LogElement *ZT2LogElement = (CZT2LogElement*)LogsList->at(i); + + if(ZT2LogElement->mZTDetections.size() == 0 /*&& ZT2LogElement->mFlags.mIsProblematicPassage != 1*/ && ZT2LogElement->mFileProtected == false) + { + + //delete file from element B... + DeleteFile(ZT2LogElement->mLogFileName); + NbDeletedFiles++; + mDBMaintenanceProgressStatusText->setPlainText(QString().sprintf("Analyse en cours\n%d passages éliminés",NbDeletedFiles)); + } + } + } + + mDBMaintenanceProgressStatusText->setPlainText(QString().sprintf("Analyse des passages terminée\n%d passages éliminés",NbDeletedFiles)); + mProgramHandle->LogsDatabaseChanged(0); + + return true; +} + +bool CDatabaseMgrPage::CleanSingleZTLogFiles() +{ + QList *ZTLogFilesList; + + ZTLogFilesList = mZTLogFilesManager->GetZTLogsList(); + + if(ZTLogFilesList->size() == 0) + return true; + + mDBMaintenanceProgressStatusText->setPlainText("Analyse en cours"); + mDBMaintenanceProgressBar->setRange(0,ZTLogFilesList->size()); + int NbRemoved = 0; + for(int i = 0; i < ZTLogFilesList->size(); i++) + { + mDBMaintenanceProgressBar->setValue(i+1); + QFileInfo ZTLogFile(ZTLogFilesList->at(i).mZTLogFilePath); + QDir ZTLogFileDir = ZTLogFile.absoluteDir(); + + ZTLogFileDir.setFilter(QDir::Files | QDir::NoDotAndDotDot); + if(ZTLogFileDir.entryList().size() == 1) + { + NbRemoved++; + if(ZTLogFileDir.remove(ZTLogFile.absoluteFilePath())) + { + //qDebug("Removed %s",ZTLogFile.absoluteFilePath().toUtf8().data()); + } + ZTLogFileDir.rmdir(ZTLogFile.absolutePath()); + { + //qDebug("Removed %s",ZTLogFile.absolutePath().toUtf8().data()); + } + ZTLogFilesList->removeAt(i); + i--; + } + } + mDBMaintenanceProgressStatusText->setPlainText(QString().sprintf("Analyse des fichiers terminée\n%d fichiers ZTLOG éliminés",NbRemoved)); + mDBMaintenanceProgressBar->setRange(0,ZTLogFilesList->size()); + mProgramHandle->ZTLogFilesChanged(); + + return true; +} + +void CDatabaseMgrPage::DatabaseImportFinished(bool ret,QStringList* FilesList) +{ + if(ret == false) + { + mProgressBar->reset(); + mProgressStatusText->setPlainText("Importation non terminée..."); + } + + mDatabaseImporterThread->quit(); + mCancelButton->show(); + mImportDataButton->show(); + mCancelImportButton->hide(); + if(ret == true) + { + mProgramHandle->LogsDatabaseChanged(FilesList); + FilesList->clear(); + delete FilesList; + } +} + +void CDatabaseMgrPage::SetProgressText(QString Text) +{ + mProgressStatusText->setPlainText(Text); +} + +bool CDatabaseMgrPage::DeleteFile(QString FilePath) +{ + QDir dir; + if(dir.remove(FilePath) == false) + { + qDebug("Could not delete file %s",FilePath.toUtf8().data()); + return false; + } + qDebug("File deleted: %s",FilePath.toUtf8().data()); + + return true; +} +void CDatabaseMgrPage::UpdateDBStats() +{ + int NbTrains, NbZTLog; + + NbTrains = mLogMgrHandle->GetLogsCount(); + NbZTLog = mZTLogFilesManager->GetZTLogFilesCount(); + + mDBFileCountText->setPlainText(QString().sprintf("Nombre de passages: %d\nNombre de fichiers ZTLog: %d",NbTrains,NbZTLog)); +} + +void CDatabaseMgrPage::EnableEngineeringMode() +{ + mDeleteDBDuplicatesBtn->show(); + mDeleteNonErrorLogs->show(); + mDeleteZTLogFiles->show(); + mRebuildDatabaseFile->show(); + mDBMaintenanceProgressBar->show(); + mDBMaintenanceProgressStatusText->show(); + mFilterDuplicateChkBx->show(); +} + +void CDatabaseMgrPage::EnableLogImport() +{ + mImportDataButton->show(); +} + +//Grab the mouse if the user clicks outside buttons +void CDatabaseMgrPage::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + Q_UNUSED(event) +} +void CDatabaseMgrPage::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + Q_UNUSED(event) +} +void CDatabaseMgrPage::showEvent(QShowEvent *event) +{ + //qDebug("Show"); + UpdateDBStats(); +} + +CDatabaseImporterThread::CDatabaseImporterThread() +{ + mLogMgrHandle = 0; + mKillThread = false; +} + + +void CDatabaseImporterThread::ImportLogs() +{ + mKillThread = false; + bool OnlyErrorLogs = mOnlyErrorLogs; + bool FilterDuplicates = mFilterDuplicates; + QStringList SelectedDirs = mSelectedDirs; + + int NbDeletedFiles = 0; + int NbCopiedFiles = 0; + int NbCopiedDirs = 0; + + + ClearDir(QDir("./Temp")); + + + + emit SetProgressBarRange(0,SelectedDirs.size()); + emit ResetProgressBar(); + emit SetProgressText("Copie des répertoires temporaires"); + //Copy the files + for(int i = 0; i < SelectedDirs.size(); i++) + { + + QDir SrcDir(SelectedDirs.at(i)); + QString tmp = "./Temp/" + SrcDir.dirName(); + QDir DestDir(tmp); + + CopyDir(SrcDir,DestDir); + emit SetProgressBarVal(i+1); + + if(IsThreadKilled()) + { + emit DatabaseImportFinished(false,0); + return; + } + } + + // Parse each directory to add. + QFileInfoList DataFilePath; + DataFilePath.clear(); + QDir TempDir("./Temp"); + DataFilePath = TempDir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); + + if(DataFilePath.isEmpty()) + { + emit DatabaseImportFinished(false,0); + return; + } + + QString DatabasePath = mDatabasePath; + QList *ExistingLogsList = mLogMgrHandle->GetLogsList(); + + QStringList LogFilters; + LogFilters << "*.bin"; + bool CopyDirectory = true; + + if(FilterDuplicates == true || OnlyErrorLogs == true) + { + for(int i = 0; i < DataFilePath.size(); i++) + { + QFileInfoList list; + + //Load files in base directory + QDir LogDir(DataFilePath.at(i).absoluteFilePath()); + LogDir.setFilter(QDir::Files | QDir::NoDotAndDotDot); + LogDir.setNameFilters(LogFilters); + LogDir.setSorting(QDir::Name); + list = LogDir.entryInfoList(); + if(list.size() != 0) + { + //If no filtering is required, just copy the directory... + if(FilterDuplicates == false && OnlyErrorLogs == false) + { + CopyDirectory = true; + } + else + { + unsigned int ret; + emit SetProgressBarRange(0,list.size()); + emit ResetProgressBar(); + emit SetProgressText(QString().sprintf("Vérification du répertoire:\n%s",DataFilePath.at(i).fileName().toUtf8().data())); + + for(int NewLogIndex = 0; NewLogIndex < list.size(); NewLogIndex++) + { + CLogElement *CurLogElement = CTrainLogFileMgr::instance()->OpenTrainLog(list.at(NewLogIndex).absoluteFilePath(),ret); + + if(CurLogElement->mZTLogType == ZT1_LOG_TYPE) + { + CZT1LogElement * NewZT1Element = (CZT1LogElement*)CurLogElement; + bool FileDeleted = false; + + if(OnlyErrorLogs && (FileDeleted == false)) + { + if(NewZT1Element->mZTDetections.size() == 0) + { + DeleteFile(list.at(NewLogIndex).absoluteFilePath()); + FileDeleted = true; + NbDeletedFiles++; + } + } + + if(FilterDuplicates && (FileDeleted == false)) + { + for(int ExistingLogIndex = 0; ExistingLogIndex < ExistingLogsList->size(); ExistingLogIndex++) + { + if(ExistingLogsList->at(ExistingLogIndex)->mZTLogType == ZT1_LOG_TYPE) + { + CZT1LogElement * ExistingZT1Element = (CZT1LogElement*)ExistingLogsList->at(ExistingLogIndex); + + if(ExistingZT1Element->mStationName == NewZT1Element->mStationName) + { + if(ExistingZT1Element->mPassageDateTime == NewZT1Element->mPassageDateTime) + { + //Delete the file from the temporary directory. + DeleteFile(list.at(NewLogIndex).absoluteFilePath()); + FileDeleted = true; + NbDeletedFiles++; + break; + } + } + } + } + } + + } + else //ZT2 + { + CZT2LogElement * NewZT2Element = (CZT2LogElement*)CurLogElement; + bool FileDeleted = false; + + if(OnlyErrorLogs && (FileDeleted == false)) + { + if(NewZT2Element->mZTDetections.size() == 0) + { + DeleteFile(list.at(NewLogIndex).absoluteFilePath()); + FileDeleted = true; + NbDeletedFiles++; + } + } + + if(FilterDuplicates && (FileDeleted == false)) + { + for(int ExistingLogIndex = 0; ExistingLogIndex < ExistingLogsList->size(); ExistingLogIndex++) + { + if(ExistingLogsList->at(ExistingLogIndex)->mZTLogType == ZT2_LOG_TYPE) + { + CZT2LogElement * ExistingZT2Element = (CZT2LogElement*)ExistingLogsList->at(ExistingLogIndex); + + if(ExistingZT2Element->mStationName == NewZT2Element->mStationName) + { + if(ExistingZT2Element->mPassageDateTime == NewZT2Element->mPassageDateTime) + { + //Delete the file from the temporary directory. + DeleteFile(list.at(NewLogIndex).absoluteFilePath()); + FileDeleted = true; + NbDeletedFiles++; + } + } + } + } + } + + } + emit SetProgressBarVal(NewLogIndex+1); + delete CurLogElement; + if(IsThreadKilled()) + { + emit DatabaseImportFinished(false,0); + return; + } + } + + } + + } + else + { + CopyDirectory = true; + } + } + } + + QStringList *NewFilesList = new QStringList; + if(CopyDirectory) + { + QDir TmpDir("./Temp"); + DataFilePath.clear(); + DataFilePath = TmpDir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); + + //Find the number of files to copy for the progress bar... + int NbFilesToCopy = 0; + for(int i = 0; i < DataFilePath.size(); i++) + { + QDir SrcDir(DataFilePath.at(i).absoluteFilePath()); + NbFilesToCopy += SrcDir.entryList(QDir::Files).size(); + } + + emit SetProgressBarRange(0,NbFilesToCopy); + emit ResetProgressBar(); + ProgressValue = 0; + emit SetProgressText("Copie des fichiers dans la BD"); + + for(int i = 0; i < DataFilePath.size(); i++) + { + QString StationDir; + StationDir.clear(); + + QStringList DirNameNibbles = DataFilePath.at(i).fileName().split('_'); + if(DirNameNibbles.size() == 3) + { + StationDir = DirNameNibbles.at(1); + QDir SrcDir(DataFilePath.at(i).absoluteFilePath()); + QString tmp = DatabasePath + SrcDir.separator() + StationDir + SrcDir.separator() + SrcDir.dirName(); + QDir DestDir(QDir::cleanPath(tmp)); + + NbCopiedFiles += CopyDir(SrcDir,DestDir,true); + NbCopiedDirs++; + + QFileInfoList FilesList = DestDir.entryInfoList(QDir::Files); + for(int i = 0; i < FilesList.size(); i++) + { + NewFilesList->append(FilesList.at(i).absoluteFilePath()); + } + } + else + { + qDebug("Erreur, nom de répertoire illégal : %s",DataFilePath.at(i).absoluteFilePath().toUtf8().data()); + } + if(IsThreadKilled()) + { + emit DatabaseImportFinished(false,0); + return; + } + // emit SetProgressBarVal(i+1); + } + } + emit ResetProgressBar(); + emit SetProgressText(QString().sprintf("Importation terminée avec succès\n%d passages ignorés\n%d fichiers copiés dans %d répertoires",NbDeletedFiles,NbCopiedFiles,NbCopiedDirs)); + + emit DatabaseImportFinished(true,NewFilesList); + return; + +} + + + +int CDatabaseImporterThread::CopyDir(QDir Dir, QDir DestDir, bool NotifyWhenCopied) +{ + + int CopiedFiles = 0; + + if (!Dir.exists()) + { + return false; + } + + + Dir.mkpath(DestDir.absolutePath()); + + foreach (QString f, Dir.entryList(QDir::Files)) + { + QFile::copy(Dir.absolutePath() + QDir::separator() + f, DestDir.absolutePath() + QDir::separator() + f); + CopiedFiles++; + if(NotifyWhenCopied) + { + ProgressValue++; + emit SetProgressBarVal(ProgressValue); + emit SetProgressText(QString().sprintf("Copie des fichiers dans la BD\n%s",f.toUtf8().data())); + } + if(IsThreadKilled()) + { + return CopiedFiles; + } + } + + return CopiedFiles; +} + +bool CDatabaseImporterThread::ClearDir(QDir Dir) +{ + if (!Dir.exists()) + return true; + + QFileInfoList DirList = Dir.entryInfoList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot); + for(int i = 0; i < DirList.size(); i++) + { + // QFileInfo info(DirList.at(i)); + if (DirList.at(i).isDir()) + { + if (!ClearDir(QDir(DirList.at(i).filePath()))) + { + return false; + } + else + { + if(Dir.rmdir(DirList.at(i).absoluteFilePath()) == false) + { + qDebug("Could not delete %s",DirList.at(i).filePath().toUtf8().data()); + } + } + } + else + { + if (Dir.remove(DirList.at(i).absoluteFilePath()) == false) + { + qDebug("Cannot delete %s",DirList.at(i).absoluteFilePath().toUtf8().data()); // return false; + } + } + } + + return true; +} + +bool CDatabaseImporterThread::DeleteFile(QString FilePath) +{ + QDir dir; + if(dir.remove(FilePath) == false) + { + qDebug("Could not delete file %s",FilePath.toUtf8().data()); + return false; + } + qDebug("File deleted: %s",FilePath.toUtf8().data()); + + return true; +} + +int CDatabaseImporterThread::ParseDir(QDir dir) +{ + + QStringList LogFilters; + QFileInfoList list; + // QString LogDataDir = mProgramHandle->GetLogDataPath(); + LogFilters << "*.bin"; + + //Load files in base directory + QDir LogDir(dir); + LogDir.setFilter(QDir::Files | QDir::NoDotAndDotDot); + LogDir.setNameFilters(LogFilters); + LogDir.setSorting(QDir::Name); + list = LogDir.entryInfoList(); + if(list.size() != 0) + { + + } + else + return 0; + + + return 1; +} + +void CDatabaseImporterThread::SetImporParams(QStringList SelectedDirs, bool FilterDuplicates, bool OnlyErrorLogs) +{ + mSelectedDirs = SelectedDirs; + mFilterDuplicates = FilterDuplicates; + mOnlyErrorLogs = OnlyErrorLogs; +} + +void CDatabaseImporterThread::KillThread() +{ + mMutex.lockForWrite(); + mKillThread = true; + mMutex.unlock(); + + qDebug("Thread killed"); +} + +bool CDatabaseImporterThread::IsThreadKilled() +{ + bool tmp; + mMutex.lockForRead(); + tmp = mKillThread; + mMutex.unlock(); + + return tmp; +} diff --git a/sources/GuiElements/DatabaseMgrPage.h b/sources/GuiElements/DatabaseMgrPage.h new file mode 100644 index 0000000..c46004f --- /dev/null +++ b/sources/GuiElements/DatabaseMgrPage.h @@ -0,0 +1,157 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Description du fichier si nécessaire. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20131021 JFM + Verision d'origine. + +### YYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + + +#ifndef DATABASEMGRPAGE_H +#define DATABASEMGRPAGE_H + +#include "GlobalDefine.h" +#include +#include "Guipage.h" +#include +#include "PushButton.h" +#include "TextButtonWidget.h" +#include "ZTData.h" +#include +#include "LogMgr.h" +#include +#include +#include +#include "ZTLogFilesMgr.h" + +class COutilZT; + +class CDatabaseImporterThread : public QObject +{ + Q_OBJECT +public: + CDatabaseImporterThread(); + + void SetDatabasePath(QString path){mDatabasePath = path;} + void SetLogMgrHandle(CLogMgr *Handle){mLogMgrHandle = Handle;} + void SetImporParams(QStringList SelectedDirs, bool FilterDuplicates, bool OnlyErrorLogs); + void KillThread(); + + +public slots: + void ImportLogs(); + +private: + + int ParseDir(QDir dir); + int CopyDir(QDir Dir, QDir DestDir,bool NotifyWhenCopied = false); + bool ClearDir(QDir Dir); + bool DeleteFile(QString FilePath); + bool mKillThread; + QReadWriteLock mMutex; + + QString mDatabasePath; + CLogMgr *mLogMgrHandle; + + + QStringList mSelectedDirs; + bool mFilterDuplicates; + bool mOnlyErrorLogs; + + bool IsThreadKilled(); + int ProgressValue; + + +signals: + void DatabaseImportFinished(bool,QStringList*); + void SetProgressBarRange(int,int); + void SetProgressBarVal(int); + void ResetProgressBar(); + void SetProgressText(QString); + +}; + +class CDatabaseMgrPage : public CGuiPage +{ +Q_OBJECT +public: + CDatabaseMgrPage(QGraphicsWidget *Parent = 0,bool EngMode = false); + ~CDatabaseMgrPage(); + + + + COutilZT *mProgramHandle; + CLogMgr *mLogMgrHandle; + CZTLogFilesMgr *mZTLogFilesManager; + + void UpdateDBStats(); + void EnableEngineeringMode(); + void EnableLogImport(); + + virtual void showEvent(QShowEvent *event); + virtual void resizeEvent(QGraphicsSceneResizeEvent *event); + virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); + virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); + + +private: + + QGraphicsRectItem *mBackgroundRect; + CTextButtonWidget *mCancelButton, *mImportDataButton, *mCancelImportButton; + QCheckBox *mImportErrorDataOnlyChkBx, *mFilterDuplicateChkBx, *mDeleteSourceDataChkBx; + QProgressBar *mProgressBar; + QGraphicsTextItem *mProgressStatusText; + + CTextButtonWidget *mDeleteDBDuplicatesBtn, *mDeleteNonErrorLogs, *mDeleteZTLogFiles, *mRebuildDatabaseFile; + QProgressBar *mDBMaintenanceProgressBar; + QGraphicsTextItem *mDBMaintenanceProgressStatusText; + QGraphicsTextItem *mDBFileCountText; + + + CDatabaseImporterThread *mDatabaseImporterWorkerThread; + QThread *mDatabaseImporterThread; + + bool ImportData(bool OnlyError, bool FilterDuplicates); + bool CleanDBDuplicates(); + bool CleanDBNormalPasses(); + bool CleanSingleZTLogFiles(); + bool DeleteFile(QString FilePath); + + +// int ParseDir(QDir dir); +// bool CopyDir(QDir Dir, QDir DestDir); +// bool ClearDir(QDir Dir); +// bool DeleteFile(QString FilePath); + + + + +public slots: + void ButtonClicked(CTextButtonWidget *); + void DatabaseImportFinished(bool,QStringList*); + void SetProgressText(QString); + +}; + + + +#endif // DATABASEMGRPAGE_H diff --git a/sources/GuiElements/EventsRulerWidget.cpp b/sources/GuiElements/EventsRulerWidget.cpp new file mode 100644 index 0000000..a9943c5 --- /dev/null +++ b/sources/GuiElements/EventsRulerWidget.cpp @@ -0,0 +1,127 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 - 2013 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Dessine une règle temporelle sur laquelle sont affichés les déclenchements. + Une ligne rouge est dessinée au temps correspondant au déclenchement et du + texte identifiant le type de déclenchement est aussi affiché. + + Utilisée dans la page de visualisation des passages de train. + + CETTE CLASSE DEVRAIT ÊTRE OPTIMISÉE. + +*/ + +/* ************************************************************************** */ +/* Revision: +### YYYMMDD JFM + Verision d'origine. + +### YYYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + + +#include "EventsRulerWidget.h" +#include +#include + +CEventRulerWidget::CEventRulerWidget(qreal RulerPixelWidth, QGraphicsItem *Parent) +{ + setParentItem(Parent); + mPixelWidth = RulerPixelWidth; + mLabel = new QGraphicsTextItem(this); +} + +void CEventRulerWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + Q_UNUSED(option) + Q_UNUSED(widget) + + if(mEventItems.isEmpty()) + return; + + QFont font; + font.setPixelSize(12); + painter->setFont(font); + qreal pitch = mPixelWidth/(mEndTime - mStartTime); //pixel/ns + + QPen LinePen,TextPen; + LinePen.setColor(Qt::red); + LinePen.setWidth(2); + TextPen.setColor(Qt::black); + TextPen.setWidth(1); + + qreal Height = boundingRect().height(); + + for(int i = 0; i < mEventItems.size(); i++) + { + if(mEventItems.at(i).mEventTime >= mStartTime) + { + if(mEventItems.at(i).mEventTime <= mEndTime) + { + qreal PixelPos = (mEventItems.at(i).mEventTime - mStartTime)*pitch; + painter->setPen(LinePen); + painter->drawLine(PixelPos,0,PixelPos,Height); + painter->setPen(TextPen); + painter->drawText(QRectF(PixelPos+3,0,50,Height),mEventItems.at(i).mLabel,Qt::AlignLeft | Qt::AlignVCenter); + } + else + { + return; + } + } + } +} + +unsigned int CEventRulerWidget::SetRange(quint64 StartTime, quint64 EndTime) +{ + if(StartTime > EndTime) + return false; + + if(mEventItems.isEmpty()) + return false; + + + mStartTime = StartTime; + mEndTime = EndTime; + + update(); + + return RET_OK; +} + +unsigned int CEventRulerWidget::AddEventItem(QString Rank, quint64 EventTime) +{ + CEventRulerWidgetItem NewItem; + NewItem.mLabel = Rank; + NewItem.mEventTime = EventTime; + + mEventItems.append(NewItem); + return RET_OK; +} + +void CEventRulerWidget::SetLabel(QString Label, int Offset) +{ + QFont font; + font.setBold(true); + mLabel->setFont(font); + mLabel->setPlainText(Label); + mLabel->setPos(-Offset,boundingRect().height()/2 - mLabel->boundingRect().height()/2); +} + +void CEventRulerWidget::ClearRuler() +{ + mEventItems.clear(); + update(); +} diff --git a/sources/GuiElements/EventsRulerWidget.h b/sources/GuiElements/EventsRulerWidget.h new file mode 100644 index 0000000..92afdf2 --- /dev/null +++ b/sources/GuiElements/EventsRulerWidget.h @@ -0,0 +1,65 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 - 2013 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Description du fichier si nécessaire. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20131030 JFM + Verision d'origine. + +### 20131107 Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + +#ifndef EVENTSRULERWIDGET_H +#define EVENTSRULERWIDGET_H + +#include "GlobalDefine.h" +#include + +class CEventRulerWidgetItem +{ +public: + QString mLabel; + quint64 mEventTime; +}; + +class CEventRulerWidget : public QGraphicsWidget +{ + Q_OBJECT +public: + CEventRulerWidget(qreal RulerPixelWidth,QGraphicsItem *Parent = 0); + + virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); + + unsigned int SetRange(quint64 StartTime, quint64 EndTime); + unsigned int AddEventItem(QString EventLabel,quint64 EventTime); + void SetLabel(QString Label,int Offset); + void ClearRuler(); + + +private: + qreal mPixelWidth; + quint64 mStartTime, mEndTime; + qreal mPixelPitch; + QGraphicsTextItem *mLabel; + + QList mEventItems; + +}; + +#endif // RANKRULERWIDGET_H diff --git a/sources/GuiElements/GraphCursorWidget.cpp b/sources/GuiElements/GraphCursorWidget.cpp new file mode 100644 index 0000000..f0b116b --- /dev/null +++ b/sources/GuiElements/GraphCursorWidget.cpp @@ -0,0 +1,138 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 - 2013 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Dessine une ligne verticale et garde certaines information sur la position du + curseur + + + Utilisée dans la page de visualisation des passages de train.. + +*/ + +/* ************************************************************************** */ +/* Revision: +### YYYMMDD JFM + Verision d'origine. + +### YYYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + +#include "GraphCursorWidget.h" +#include +#include + +CVerticalGraphCursorWidget::CVerticalGraphCursorWidget(qreal Height,QGraphicsItem *Parent) +{ + setParentItem(Parent); + resize(3,Height); + mLine.setLine(0,0,0,Height); + mColor = Qt::blue; + mCursorTime = 0; + mCursorSet = false; +} + +void CVerticalGraphCursorWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + Q_UNUSED(option) + Q_UNUSED(widget) + + QPen pen; + pen.setWidth(1); + pen.setColor(mColor); + painter->setPen(pen); + + painter->drawLine(mLine); + +// if(mWidth != 0) +// painter->drawLine(mHLine); + +} + +qreal CVerticalGraphCursorWidget::GetPixelPos() +{ + return pos().x(); +} +quint64 CVerticalGraphCursorWidget::GetTime() +{ + return mCursorTime; +} +void CVerticalGraphCursorWidget::SetTime(quint64 time) +{ + mCursorTime = time; +} +bool CVerticalGraphCursorWidget::IsCursorSet() +{ + return mCursorSet; +} +void CVerticalGraphCursorWidget::ClearCursor() +{ + mCursorSet = false; + hide(); +} +void CVerticalGraphCursorWidget::SetCursor() +{ + mCursorSet = true; +} + + +//--------------------------------------------- + + + + + +CHorizontalGraphCursorWidget::CHorizontalGraphCursorWidget(qreal Width,QGraphicsItem *Parent) +{ + setParentItem(Parent); + resize(3,Width); + mLine.setLine(0,0,Width,0); + mColor = Qt::blue; + mCursorSet = false; +} + +void CHorizontalGraphCursorWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + Q_UNUSED(option) + Q_UNUSED(widget) + + QPen pen; + pen.setWidth(1); + pen.setColor(mColor); + painter->setPen(pen); + + painter->drawLine(mLine); + +// if(mWidth != 0) +// painter->drawLine(mHLine); + +} + +qreal CHorizontalGraphCursorWidget::GetPixelPos() +{ + return pos().y(); +} +bool CHorizontalGraphCursorWidget::IsCursorSet() +{ + return mCursorSet; +} +void CHorizontalGraphCursorWidget::ClearCursor() +{ + mCursorSet = false; + hide(); +} +void CHorizontalGraphCursorWidget::SetCursor() +{ + mCursorSet = true; +} diff --git a/sources/GuiElements/GraphCursorWidget.h b/sources/GuiElements/GraphCursorWidget.h new file mode 100644 index 0000000..7e7d02a --- /dev/null +++ b/sources/GuiElements/GraphCursorWidget.h @@ -0,0 +1,76 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 - 2013 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Description du fichier si nécessaire. + +*/ + +/* ************************************************************************** */ +/* Revision: +### YYYMMDD JFM + Verision d'origine. + +### YYYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + +#ifndef GRAPHCURSORWIDGET_H +#define GRAPHCURSORWIDGET_H + +#include "GlobalDefine.h" +#include + +class CVerticalGraphCursorWidget : public QGraphicsWidget +{ + Q_OBJECT +public: + CVerticalGraphCursorWidget(qreal Height, QGraphicsItem *Parent = 0); + + virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); + qreal GetPixelPos(); + void SetColor(QColor color){mColor = color;} + quint64 GetTime(); + void SetTime(quint64 time); + bool IsCursorSet(); + void ClearCursor(); + void SetCursor(); + +private: + QLine mLine; + QColor mColor; + quint64 mCursorTime; + bool mCursorSet; +}; + +class CHorizontalGraphCursorWidget : public QGraphicsWidget +{ + Q_OBJECT +public: + CHorizontalGraphCursorWidget(qreal Width, QGraphicsItem *Parent = 0); + + virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); + qreal GetPixelPos(); + void SetColor(QColor color){mColor = color;} + bool IsCursorSet(); + void ClearCursor(); + void SetCursor(); + +private: + QLine mLine; + QColor mColor; + quint64 mCursorPos; + bool mCursorSet; +}; + +#endif // GRAPHCURSORWIDGET_H diff --git a/sources/GuiElements/GraphItem.cpp b/sources/GuiElements/GraphItem.cpp new file mode 100644 index 0000000..e9f9091 --- /dev/null +++ b/sources/GuiElements/GraphItem.cpp @@ -0,0 +1,254 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2013 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Classe d'affichage d'un graphique discret (sondes magnétiques, pédales, etc.)La + fonction SetData permet d'associer la liste des transitions. La + fonction DisplayData() permet de fixer le timespan à afficher. La fonction détermine + quels points sont dans le span et crée une liste de lignes qui sont ensuite affichés + dans la fonction de rappel paint(). + + Utilisée dans la page de visualisation des passages de train. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20131024 JFM + Verision d'origine. + +### YYYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + +#include "GraphItem.h" +#include +#include +#include + +CGraphItem::CGraphItem(QGraphicsItem *Parent) +{ + setParentItem(Parent); + mDataSet = 0; + mStartTime = mStopTime = 0; + mDataValid = false; + mLabel = new QGraphicsTextItem(this); + mGraphPixmap = new QPixmap(boundingRect().width(),boundingRect().height()); +} + +CGraphItem::~CGraphItem() +{ + delete mGraphPixmap; +} + +void CGraphItem::SetData(QList *DataList) +{ + + mDataSet = DataList; + //Build the lines list +} + +unsigned int CGraphItem::DisplayData(quint64 StartTime, quint64 StopTime) +{ + if(mDataSet == 0) + return RET_OK; + + quint64 MinTime = mDataSet->first()->mTime; + quint64 MaxTime = mDataSet->last()->mTime; + + if(StartTime >= StopTime) + return RET_ERROR; + if(StartTime < MinTime) + return RET_ERROR; + if(StopTime > MaxTime) + return RET_ERROR; + + mStartTime = StartTime; + mStopTime = StopTime; + quint64 TimeSpan = StopTime - StartTime; + + //Find the index of the first and last point in the timespan. + int StartIndex = 0, StopIndex = 0; + quint64 StartDeltaTime, StopDeltaTime; + int i = 0; + bool StartFound = false, StopFound = false; + while(StartFound == false || StopFound == false) + { + if(i >= mDataSet->size()) + { + qDebug("GraphItem::Array overflow while searching for time index"); + return RET_ERROR; + } + + quint64 CurTime = mDataSet->at(i)->mTime; + if(CurTime <= StartTime) + { + StartIndex = i; + StartDeltaTime = CurTime - StartTime; + StartFound = true; + } + if(CurTime >= StopTime && !StopFound) + { + StopIndex = i; + StopDeltaTime = StopTime - mDataSet->at(StopIndex)->mTime; + StopFound = true; + } + + i++; + } + + + //Build the lines list + mLinesList.clear(); + qreal Width = boundingRect().width(); + qreal Height = boundingRect().height()-2; + qreal tick = (Width)/TimeSpan; //pixels per microsec + + qreal X1,X2,Y1,Y2; + + //Add all the lines to create the graph. When there is a transition + //the horizontal line must be continued to the next point and a vertical + //line must be drawn. + for(int i = StartIndex; i < StopIndex; i++) + { + QLine NewLine; + if(mDataSet->at(i)->mTime < StartTime) + X1 = 0; + else + X1 = (qreal)(mDataSet->at(i)->mTime - StartTime); + + Y1 = mDataSet->at(i)->mValue; + + if(mDataSet->at(i+1)->mTime > StopTime) + { + X2 = StopTime - StartTime; + Y2 = mDataSet->at(i)->mValue; //Do not draw the vertical line if the point outside the span is not the same value. + } + else + { + X2 = mDataSet->at(i+1)->mTime - StartTime; + Y2 = mDataSet->at(i+1)->mValue; + } + + //Reverse the Y axis + if(Y1 == 0) + Y1 = 1; + else + Y1 = 0; + if(Y2 == 0) + Y2 = 1; + else + Y2 = 0; + + + if(Y1 == Y2) //no transition + { + NewLine.setLine(X1*tick,Y1*Height+1,X2*tick,Y2*Height+1); + mLinesList.append(NewLine); + } + else //value transition... + { + NewLine.setLine(X1*tick,Y1*Height+1,X2*tick,Y1*Height+1); //horizontal line + mLinesList.append(NewLine); + NewLine.setLine(X2*tick,Y1*Height+1,X2*tick,Y2*Height+1); //vertical line + mLinesList.append(NewLine); + } + } + + mDataValid = true; + +//#ifndef WINDOWS_OS + mGraphPixmap->fill(QColor(245, 245, 255)); + QPainter *painter = new QPainter(mGraphPixmap); + painter->drawLines(mLinesList); + delete painter; +//#endif + + update(); + + return RET_OK; +} + +void CGraphItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + Q_UNUSED(option) + Q_UNUSED(widget) + +// static int toto = 0; +// qDebug("CGraphItem::paint %d",toto++); + + if(mDataValid == false) + return ; + if(mDataSet == 0) + return; + if(mDataSet->size() == 0) + return; + +// painter->setClipRect(option->exposedRect); + +// QPen pen; +// pen.setWidth(1); + +// pen.setColor(Qt::red); +// painter->setPen(pen); +// painter->drawRect(boundingRect()); + +// pen.setColor(Qt::black); +// painter->setPen(pen); + +//#ifdef WINDOWS_OS +// painter->drawLines(mLinesList); +//#else + painter->drawPixmap(0,0,*mGraphPixmap); +//#endif +// for(int i = 0; i < mLinesList.size(); i++) +// { +// painter->drawEllipse(mLinesList.at(i).p1(),2,2); +// } + +} + +void CGraphItem::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + event->ignore(); +} + + +void CGraphItem::mouseReleaseEvent( QGraphicsSceneMouseEvent * event) +{ + event->ignore(); +} + +void CGraphItem::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + Q_UNUSED(event) + //mBackgroundRect->setRect(boundingRect()); + delete mGraphPixmap; + mGraphPixmap = new QPixmap(boundingRect().width(),boundingRect().height()); + DisplayData(mStartTime,mStopTime); +} +void CGraphItem::SetLabel(QString label,int Offset) +{ + QFont font; + font.setBold(true); + mLabel->setFont(font); + mLabel->setPlainText(label); + mLabel->setPos(-Offset,boundingRect().height()/2 - mLabel->boundingRect().height()/2); +} + + +CGraphDiscreteDataPair::CGraphDiscreteDataPair(quint32 Value, quint64 Time): + mValue(Value), + mTime(Time) +{ +} diff --git a/sources/GuiElements/GraphItem.h b/sources/GuiElements/GraphItem.h new file mode 100644 index 0000000..b498c4a --- /dev/null +++ b/sources/GuiElements/GraphItem.h @@ -0,0 +1,56 @@ +#ifndef CGRAPHITEM_H +#define CGRAPHITEM_H + +#include +#include +#include +#include +#include +#include + +class CGraphDiscreteDataPair +{ +public: + CGraphDiscreteDataPair(quint32 Value, quint64 Time); + quint32 mValue; + quint64 mTime; +}; + + +class CGraphItem : public QGraphicsWidget +{ + Q_OBJECT +public: + CGraphItem(QGraphicsItem *Parent = 0); + ~CGraphItem(); + + QList *mDataSet; + QGraphicsRectItem *mBackgroundRect; + +// unsigned int DisplayData(quint32 StartIndex, quint32 StopIndex); + unsigned int DisplayData(quint64 StartTime, quint64 StopTime); + void SetData(QList *DataList); +// void UpdateDisplay(void); + void SetLabel(QString label,int Offset); + + virtual void paint( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0 ); + virtual void mousePressEvent ( QGraphicsSceneMouseEvent * event ); + virtual void mouseReleaseEvent( QGraphicsSceneMouseEvent * event); + virtual void resizeEvent(QGraphicsSceneResizeEvent *event); + +private: + //quint64 mTimeSpan; + //quint64 mOffset; + bool mDataValid; + //quint32 mStartIndex,mStopIndex; + quint64 mStartTime, mStopTime; + QVector mLinesList; + QGraphicsTextItem *mLabel; + + QPixmap *mGraphPixmap; + + + +}; + +#endif // CGRAPHITEM_H diff --git a/sources/GuiElements/GraphRulerWidget.cpp b/sources/GuiElements/GraphRulerWidget.cpp new file mode 100644 index 0000000..7b3c33b --- /dev/null +++ b/sources/GuiElements/GraphRulerWidget.cpp @@ -0,0 +1,228 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2013 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Élément graphique qui affiche une règle de graduation temporelle dans le bas + de la zone d'affichage. + + Utilisée dans la page de visualisation des passages de train. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20131024 JFM + Verision d'origine. + +### YYYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + + +#include "GraphRulerWidget.h" +#include +#include +#include + +CGraphRulerWidget::CGraphRulerWidget(qreal RulerPixelWidth, QGraphicsItem *Parent) +{ + setParentItem(Parent); + mPixelWidth = RulerPixelWidth; + mPixelPitch = RulerPixelWidth/RULER_NB_TICKS; + + mRulerPixmap = new QPixmap(RulerPixelWidth,boundingRect().height()+1); + + mValidRange = false; +} + +CGraphRulerWidget::~CGraphRulerWidget() +{ + delete mRulerPixmap; +} + +void CGraphRulerWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + Q_UNUSED(option) + Q_UNUSED(widget) + + if(mValidRange == false) + return; + + painter->setClipRect(option->exposedRect); + painter->drawPixmap(0,0,*mRulerPixmap); + +// static int toto = 0; +// qDebug("CGraphRulerWidget::paint %d",toto++); + +// qreal x = 0; +// QRectF TextRect(0,0,100,10); +// QString TimeText; +// qreal tick = (mEndTime - mStartTime)/mPixelWidth; +// QFont font; +// font.setPixelSize(12); +// painter->setFont(font); +// for(int i = 0; i <= RULER_NB_TICKS; i++) +// { +// QLine line; +// if(i%20 == 0) +// { +// TimeText.clear(); +// line.setLine(x,0,x,10); //long line +// TextRect.moveCenter(QPoint(x,15)); +// qreal time = (x*tick) + mStartTime; + +// if(time < 1000) +// { +// QTextStream(&TimeText) << time << " ns"; +// } +// else +// { +// time /= 1000; +// if(time < 1000) +// { +// QTextStream(&TimeText) << time << " us"; +// } +// else +// { +// time /= 1000; +// if(time < 1000) +// { +// QTextStream(&TimeText) << time << " ms"; +// } +// else +// { +// time /= 1000; +// if(time < 1000) +// { +// QTextStream(&TimeText) << time << " s"; +// } +// } +// } + +// } + +// painter->drawText(TextRect,Qt::AlignCenter,TimeText); + +// } +// else +// { +// line.setLine(x,0,x,5); +// } +// painter->drawLine(line); +// x += mPixelPitch; +// } +} + +unsigned int CGraphRulerWidget::SetRange(quint64 StartTime, quint64 EndTime) +{ + if(StartTime > EndTime) + return false; + + mStartTime = StartTime; + mEndTime = EndTime; + mValidRange = true; + + Render(); + + update(); + + return RET_OK; +} + +void CGraphRulerWidget::Render() +{ + qreal x = 0; + QRectF TextRect(0,0,100,10); + QString TimeText; + qreal tick = (mEndTime - mStartTime)/mPixelWidth; + QFont font; + + mRulerPixmap->fill(Qt::white); + QPainter *painter = new QPainter(mRulerPixmap); + + font.setPixelSize(12); + painter->setFont(font); + for(int i = 0; i <= RULER_NB_TICKS; i++) + { + QLine line; + if(i%20 == 0) + { + TimeText.clear(); + line.setLine(x,0,x,10); //long line + + TextRect.moveCenter(QPoint(x,15)); + if(i == 0) + TextRect.moveLeft(x); + else if(i == RULER_NB_TICKS) + TextRect.moveRight(x); + + + qreal time = (x*tick) + mStartTime; + + if(time < 1000) + { + QTextStream(&TimeText) << time << " ns"; + } + else + { + time /= 1000; + if(time < 1000) + { + QTextStream(&TimeText) << time << " us"; + } + else + { + time /= 1000; + if(time < 1000) + { + QTextStream(&TimeText) << time << " ms"; + } + else + { + time /= 1000; + if(time < 1000) + { + QTextStream(&TimeText) << time << " s"; + } + } + } + + } + + if(i == 0) + painter->drawText(TextRect,Qt::AlignLeft | Qt::AlignVCenter,TimeText); + else if(i == RULER_NB_TICKS) + painter->drawText(TextRect,Qt::AlignRight | Qt::AlignVCenter,TimeText); + else + painter->drawText(TextRect,Qt::AlignCenter,TimeText); + + } + else + { + line.setLine(x,0,x,5); + } + painter->drawLine(line); + x += mPixelPitch; + } + + delete painter; + +} + +void CGraphRulerWidget::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + Q_UNUSED(event) + + delete mRulerPixmap; + mRulerPixmap = new QPixmap(mPixelWidth,boundingRect().height()+1); +} diff --git a/sources/GuiElements/GraphRulerWidget.h b/sources/GuiElements/GraphRulerWidget.h new file mode 100644 index 0000000..07d7213 --- /dev/null +++ b/sources/GuiElements/GraphRulerWidget.h @@ -0,0 +1,60 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 - 2013 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Description du fichier si nécessaire. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20131030 JFM + Verision d'origine. + +### YYYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + +#ifndef GRAPHRULERWIDGET_H +#define GRAPHRULERWIDGET_H + +#include "GlobalDefine.h" +#include + +#define RULER_NB_TICKS 200 + +class CGraphRulerWidget : public QGraphicsWidget +{ + Q_OBJECT +public: + CGraphRulerWidget(qreal RulerPixelWidth,QGraphicsItem *Parent = 0); + ~CGraphRulerWidget(); + + virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); + + unsigned int SetRange(quint64 StartTime, quint64 EndTime); + + virtual void resizeEvent(QGraphicsSceneResizeEvent *event); + +private: + qreal mPixelWidth; + quint64 mStartTime, mEndTime; + qreal mPixelPitch; + bool mValidRange; + + QPixmap *mRulerPixmap; + + void Render(); +}; + +#endif // GRAPHRULERWIDGET_H diff --git a/sources/GuiElements/GuiPage.cpp b/sources/GuiElements/GuiPage.cpp new file mode 100644 index 0000000..6292cf6 --- /dev/null +++ b/sources/GuiElements/GuiPage.cpp @@ -0,0 +1,42 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Classe de base d'une page de l'interface graphique (GUI = Graphics User Interface). + Une page contient les éléments graphiques affichés à l'écran. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20121220 JFM + Verision d'origine. + +### YYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + + +#include "Guipage.h" +#include + + +CGuiPage::CGuiPage() +{ + +} + +void CGuiPage::ShowPage() +{ + +} diff --git a/sources/GuiElements/Guipage.h b/sources/GuiElements/Guipage.h new file mode 100644 index 0000000..a49adc8 --- /dev/null +++ b/sources/GuiElements/Guipage.h @@ -0,0 +1,52 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Description du fichier si nécessaire. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 201212120 JFM + Verision d'origine. + +### YYYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + + +#ifndef GUIPAGE_H +#define GUIPAGE_H + +#include +#include +#include "GlobalDefine.h" + +class CGuiPage : public QGraphicsWidget +{ + Q_OBJECT + + +public: + + + CGuiPage(); + + virtual void ShowPage(); + + + +}; + +#endif // GUIPAGE_H diff --git a/sources/GuiElements/LogViewPage.cpp b/sources/GuiElements/LogViewPage.cpp new file mode 100644 index 0000000..76f2585 --- /dev/null +++ b/sources/GuiElements/LogViewPage.cpp @@ -0,0 +1,1229 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Page de visualisation des passages de train. C'est cette classe qui gère + la création et l'affichage des éléments graphiques ainsi que les événements + de l'utilisateur. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20131024 JFM + Verision d'origine. + +### YYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + + +#include "LogViewPage.h" +#include +#include "OutilZT.h" +#include +#include +#include + + +CLogViewPage::CLogViewPage(QGraphicsWidget *Parent) +{ + QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); + setParentItem(Parent); + + setAcceptsHoverEvents(true); + + + + mProgramHandle = 0; + mZoomValue = 100; + mStartTime = mStopTime = 0; + mCurTimeSpan = 0; + mMinTime = mMaxTime = 0; + mCurPixelTickValue = 1; + mMouseDragging = false; + mViewType = UNKNOWN_LOG_TYPE; + mPGTreshold = 0; + + setFlag(QGraphicsItem::ItemIsFocusable); + + mStaticCursor1Pos = mStaticCursor2Pos = 0; + mCursorPos = 0; + + mBackgroundRect = new QGraphicsRectItem(boundingRect(), this); + QPen rectpen; + QBrush BackgroundBrush(QColor(245, 245, 255)); + mBackgroundRect->setBrush(BackgroundBrush); + + + mCancelButton = new CTextButtonWidget("Fermer"); + mCancelButton->setParentItem(this); + mCancelButton->setPos(850,700); + connect(mCancelButton,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*))); + + //Setup ZT1 plots + qreal PlotsHeight = ((GRAPH_ZONE_HEIGHT - 60) / (ZT1_DISCREET_PLOTTABLE_NB_PARAM + ZT1_ANALOG_PLOTTABLE_NB_PARAM)); + PlotsHeight -= (20 + (10/(ZT1_DISCREET_PLOTTABLE_NB_PARAM + ZT1_ANALOG_PLOTTABLE_NB_PARAM))) ; //space between plots + int CurPlot = 0; + for(int param = 0; param < ZT1_DISCREET_PLOTTABLE_NB_PARAM; param++) + { + mZT1DiscreetPlots[param].mParamID = param; + mZT1DiscreetPlots[param].mDataSet = new QList; + + CGraphItem * NewGraph = new CGraphItem(this); + //NewGraph->setPos(GRAPH_ZONE_X_OFFSET,param * (40 + 20)+10); + NewGraph->setPos(GRAPH_ZONE_X_OFFSET,CurPlot++ * (PlotsHeight + 20) + 10); + NewGraph->resize(GRAPH_ZONE_WIDTH,PlotsHeight); + + mZT1DiscreetPlots[param].mPlotGaph = NewGraph; + mZT1DiscreetPlots[param].mPlotGaph->SetData(mZT1DiscreetPlots[param].mDataSet); + } + mZT1DiscreetPlots[ZT1_DISCREET_PLOTTABLE_S1_PARAM].mPlotGaph->SetLabel("S1",GRAPH_ZONE_X_OFFSET); + mZT1DiscreetPlots[ZT1_DISCREET_PLOTTABLE_S2_PARAM].mPlotGaph->SetLabel("S2",GRAPH_ZONE_X_OFFSET); + mZT1DiscreetPlots[ZT1_DISCREET_PLOTTABLE_PPINT_PARAM].mPlotGaph->SetLabel("PP Int",GRAPH_ZONE_X_OFFSET); + mZT1DiscreetPlots[ZT1_DISCREET_PLOTTABLE_PPEXT_PARAM].mPlotGaph->SetLabel("PP Ext",GRAPH_ZONE_X_OFFSET); + mZT1DiscreetPlots[ZT1_DISCREET_PLOTTABLE_PG_PARAM].mPlotGaph->SetLabel("PG",GRAPH_ZONE_X_OFFSET); + mZT1DiscreetPlots[ZT1_DISCREET_PLOTTABLE_FN_PARAM].mPlotGaph->SetLabel("FN",GRAPH_ZONE_X_OFFSET); + mZT1DiscreetPlots[ZT1_DISCREET_PLOTTABLE_CI_PARAM].mPlotGaph->SetLabel("CI",GRAPH_ZONE_X_OFFSET); + mZT1DiscreetPlots[ZT1_DISCREET_PLOTTABLE_ZT1_CDV_PARAM].mPlotGaph->SetLabel("CDV",GRAPH_ZONE_X_OFFSET); + + for(int param = 0; param < ZT1_ANALOG_PLOTTABLE_NB_PARAM; param++) + { + mZT1AnalogPlots[param].mParamID = param; + mZT1AnalogPlots[param].mDataSet = new QList; + + CAnalogGraphItem *NewGraph = new CAnalogGraphItem(this); + // NewGraph->setPos(GRAPH_ZONE_X_OFFSET,(param+DISCREET_PLOTTABLE_NB_PARAM)*(40+20)+10); + NewGraph->setPos(GRAPH_ZONE_X_OFFSET,CurPlot++ * (PlotsHeight + 20) + 10); + NewGraph->resize(GRAPH_ZONE_WIDTH,PlotsHeight); + + mZT1AnalogPlots[param].mPlotGaph = NewGraph; + mZT1AnalogPlots[param].mPlotGaph->SetData(mZT1AnalogPlots[param].mDataSet); + } + mZT1AnalogPlots[ZT1_ANALOG_PLOTTABLE_PGINT_PARAM].mPlotGaph->SetLabel("PG Int",GRAPH_ZONE_X_OFFSET); + mZT1AnalogPlots[ZT1_ANALOG_PLOTTABLE_PGEXT_PARAM].mPlotGaph->SetLabel("PG Ext",GRAPH_ZONE_X_OFFSET); + mZT1AnalogPlots[ZT1_ANALOG_PLOTTABLE_TRAIN_SPEED_PARAM].mPlotGaph->SetLabel("Vitesse",GRAPH_ZONE_X_OFFSET); + mZT1AnalogPlots[ZT1_ANALOG_PLOTTABLE_PGCOMBINED_PARAM].mPlotGaph->SetLabel("Détection",GRAPH_ZONE_X_OFFSET); + mZT1AnalogPlots[ZT1_ANALOG_PLOTTABLE_SDF_DATA_PARAM].mPlotGaph->SetLabel("SDF",GRAPH_ZONE_X_OFFSET); + mZT1AnalogPlots[ZT1_ANALOG_PLOTTABLE_SDF_DATA_PARAM].mPlotGaph->resize(GRAPH_ZONE_WIDTH,PlotsHeight*2); + + //Setup ZT2 Plots + PlotsHeight = ((GRAPH_ZONE_HEIGHT - 60) / (ZT2_DISCREET_PLOTTABLE_NB_PARAM + ZT2_ANALOG_PLOTTABLE_NB_PARAM)); + PlotsHeight -= (20 + (10/(ZT2_DISCREET_PLOTTABLE_NB_PARAM + ZT2_ANALOG_PLOTTABLE_NB_PARAM))) ; //space between plots + CurPlot = 0; + for(int param = 0; param < ZT2_DISCREET_PLOTTABLE_NB_PARAM; param++) + { + mZT2DiscreetPlots[param].mParamID = param; + mZT2DiscreetPlots[param].mDataSet = new QList; + + CGraphItem * NewGraph = new CGraphItem(this); + //NewGraph->setPos(GRAPH_ZONE_X_OFFSET,param * (40 + 20)+10); + NewGraph->setPos(GRAPH_ZONE_X_OFFSET,CurPlot++ * (PlotsHeight + 20) + 10); + NewGraph->resize(900,PlotsHeight); + + mZT2DiscreetPlots[param].mPlotGaph = NewGraph; + mZT2DiscreetPlots[param].mPlotGaph->SetData(mZT2DiscreetPlots[param].mDataSet); + } + mZT2DiscreetPlots[ZT2_DISCREET_PLOTTABLE_S1_PARAM].mPlotGaph->SetLabel("S1",GRAPH_ZONE_X_OFFSET); + mZT2DiscreetPlots[ZT2_DISCREET_PLOTTABLE_PPEXT_PARAM].mPlotGaph->SetLabel("PP Ext",GRAPH_ZONE_X_OFFSET); + mZT2DiscreetPlots[ZT2_DISCREET_PLOTTABLE_PPINT_PARAM].mPlotGaph->SetLabel("PP Int",GRAPH_ZONE_X_OFFSET); + mZT2DiscreetPlots[ZT2_DISCREET_PLOTTABLE_CI_PARAM].mPlotGaph->SetLabel("CI",GRAPH_ZONE_X_OFFSET); + mZT2DiscreetPlots[ZT2_DISCREET_PLOTTABLE_APPROACH_CDV_PARAM].mPlotGaph->SetLabel("CDV App.",GRAPH_ZONE_X_OFFSET); + mZT2DiscreetPlots[ZT2_DISCREET_PLOTTABLE_CDV_PARAM].mPlotGaph->SetLabel("CDV",GRAPH_ZONE_X_OFFSET); + + mVCursor = new CVerticalGraphCursorWidget(GRAPH_ZONE_HEIGHT,this); + mVCursor->setPos(0,0); + mVCursor->resize(3,GRAPH_ZONE_HEIGHT); + mVCursor->setZValue(2); + + mHCursor = new CHorizontalGraphCursorWidget(GRAPH_ZONE_WIDTH,this); + mHCursor->setPos(0,0); + mHCursor->resize(GRAPH_ZONE_WIDTH,3); + mHCursor->setZValue(2); + +// mCursorPosTxt = new QGraphicsTextItem(this); +// mCursorPosTxt->setPos(650,690); + + + mCursorsZoomButton = new CTextButtonWidget("Zoom curseurs"); + mCursorsZoomButton->setParentItem(this); + mCursorsZoomButton->setPos(10,700); + connect(mCursorsZoomButton,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*))); + + mZoomInButton = new CTextButtonWidget(" +",0,25,25); + mZoomInButton->setParentItem(this); + mZoomInButton->setPos(95,730); + connect(mZoomInButton,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*))); + + mZoomOutButton = new CTextButtonWidget(" -",0,25,25); + mZoomOutButton->setParentItem(this); + mZoomOutButton->setPos(10,730); + connect(mZoomOutButton,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*))); + + mZoomResetButton = new CTextButtonWidget(" R",0,25,25); + mZoomResetButton->setParentItem(this); + mZoomResetButton->setPos(50,730); + connect(mZoomResetButton,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*))); + + mStaticCursor1 = new CVerticalGraphCursorWidget(GRAPH_ZONE_HEIGHT,this); + mStaticCursor1->setPos(0,0); + mStaticCursor1->setZValue(1); + mStaticCursor1->SetColor(QColor(Qt::red)); + mStaticCursor1->hide(); + + mStaticCursor2 = new CVerticalGraphCursorWidget(GRAPH_ZONE_HEIGHT,this); + mStaticCursor2->setPos(0,0); + mStaticCursor2->setZValue(1); + mStaticCursor2->SetColor(QColor(Qt::green)); + mStaticCursor2->hide(); + + mStaticCursorDeltaTimeTxt = new QGraphicsTextItem(this); + mStaticCursorDeltaTimeTxt->setPos(130,700); + mStaticCursorDeltaTimeTxt->setPlainText("Delta curseurs: ?"); + + mCursor1TimeTxt = new QGraphicsTextItem(this); + mCursor1TimeTxt->setPlainText("Position curseur 1 : ?"); + mCursor1TimeTxt->setPos(130,720); + mCursor2TimeTxt = new QGraphicsTextItem(this); + mCursor2TimeTxt->setPlainText("Position curseur 2 : ?"); + mCursor2TimeTxt->setPos(130,740); + mPassageStats1Txt = new QGraphicsTextItem(this); + mPassageStats1Txt->setPos(350,700); + mPassageStats1Txt->setPlainText("Date & heure: \nStation : \nPosition : "); + mPassageStats2Txt = new QGraphicsTextItem(this); + mPassageStats2Txt->setPos(600,700); + mPassageStats2Txt->setPlainText("Vitesse Max : Mph\nVitesse Min: Mph\nSeuil PG : "); + + mRuler = new CGraphRulerWidget(GRAPH_ZONE_WIDTH,this); + mRuler->setZValue(1); + mRuler->setPos(GRAPH_ZONE_X_OFFSET,670); + mRuler->resize(GRAPH_ZONE_WIDTH,20); + + + mRankRuler = new CRankRulerWidget(GRAPH_ZONE_WIDTH,this); + mRankRuler->setZValue(1); + mRankRuler->resize(GRAPH_ZONE_WIDTH,10); + mRankRuler->setPos(GRAPH_ZONE_X_OFFSET,655); + mRankRuler->SetLabel("Rang:",GRAPH_ZONE_X_OFFSET); + + + mEventRuler = new CEventRulerWidget(GRAPH_ZONE_WIDTH,this); + mEventRuler->setZValue(1); + mEventRuler->resize(GRAPH_ZONE_WIDTH,10); + mEventRuler->setPos(GRAPH_ZONE_X_OFFSET,640); + mEventRuler->SetLabel("Décl:",GRAPH_ZONE_X_OFFSET); + + mScrollAnimationTimer.start(); + + DestroyData(); +} + +CLogViewPage::~CLogViewPage() +{ + DestroyData(); +} + +void CLogViewPage::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + Q_UNUSED(event) + mBackgroundRect->setRect(boundingRect()); +} + +void CLogViewPage::ButtonClicked(CTextButtonWidget *BtnPtr) +{ + if(BtnPtr == mCancelButton) + { + DestroyData(); + mProgramHandle->LogViewCloseRequest(this); + } + else if(BtnPtr == mCursorsZoomButton) + { + if(mStaticCursor1->IsCursorSet() && mStaticCursor2->IsCursorSet()) + ShowSpan(mStaticCursor1->GetPixelPos(),mStaticCursor2->GetPixelPos()); + } + else if(BtnPtr == mZoomInButton) + { + ZoomIn(false); + } + else if(BtnPtr == mZoomOutButton) + { + ZoomOut(false); + } + else if(BtnPtr == mZoomResetButton) + { + ShowSpan(mMinTime,mMaxTime); + } +} + + +void CLogViewPage::SetLogData(CLogElement *element) +{ + + DestroyData(); + mLogElement = element; + mViewType = mLogElement->mZTLogType; + mStaticCursor1->ClearCursor(); + mStaticCursor2->ClearCursor(); + mStaticCursorDeltaTimeTxt->setPlainText("Delta : ?"); + + + if(mViewType == ZT1_LOG_TYPE) + { + CZT1LogElement *ZT1LogElement = (CZT1LogElement*)element; + int CurRank = 0; + quint64 mRankStartTime = 0; + bool Done; + mPassageStation = ZT1LogElement->mStationName; + mPassageDateTime = ZT1LogElement->mPassageDateTime.toString("yyyy/MM/dd hh:mm:ss"); + qreal MaxTrainSpeed = 0, MinTrainSpeed = 10000; + + //Build all the datasets from the raw data. + + //Check for invalid data in the last slot... + if(ZT1LogElement->mZTLogData.at(ZT1LogElement->mZTLogData.size()-1)->mTimestamp < ZT1LogElement->mZTLogData.at(ZT1LogElement->mZTLogData.size()-2)->mTimestamp) + { + delete ZT1LogElement->mZTLogData.at(ZT1LogElement->mZTLogData.size()-1); + ZT1LogElement->mZTLogData.remove(ZT1LogElement->mZTLogData.size()-1); + } + + //Discreet signals + for(int i = 0; i < ZT1LogElement->mZTLogData.size(); i++) + { + for(int param = 0; param < ZT1_DISCREET_PLOTTABLE_NB_PARAM; param++) + { + CGraphDiscreteDataPair *DataSet = new CGraphDiscreteDataPair(0,ZT1LogElement->mZTLogData.at(i)->mTimestamp); + + if(ZT1LogElement->mZTLogData.at(i)->mZT1ThreadData != 0) + { + if(ZT1LogElement->mZTLogData.at(i)->mZT1ThreadData->mRank > (unsigned int)CurRank) + { + if(CurRank == 0) + { + mRankStartTime = ZT1LogElement->mZTLogData.at(i)->mTimestamp; + CurRank = ZT1LogElement->mZTLogData.at(i)->mZT1ThreadData->mRank; + } + else + { + mRankRuler->AddRankItem(QString().sprintf("%d",CurRank),mRankStartTime,ZT1LogElement->mZTLogData.at(i)->mTimestamp); + mRankStartTime = ZT1LogElement->mZTLogData.at(i)->mTimestamp; + CurRank = ZT1LogElement->mZTLogData.at(i)->mZT1ThreadData->mRank; + mRankStartTime = ZT1LogElement->mZTLogData.at(i)->mTimestamp; + + } + } + + + switch(param) + { + case ZT1_DISCREET_PLOTTABLE_S1_PARAM: + { + DataSet->mValue = ZT1LogElement->mZTLogData.at(i)->mZT1ThreadData->mS1; + break; + } + case ZT1_DISCREET_PLOTTABLE_S2_PARAM: + { + DataSet->mValue = ZT1LogElement->mZTLogData.at(i)->mZT1ThreadData->mS2; + break; + } + case ZT1_DISCREET_PLOTTABLE_PPINT_PARAM: + { + DataSet->mValue = ZT1LogElement->mZTLogData.at(i)->mZT1ThreadData->mPInt; + break; + } + case ZT1_DISCREET_PLOTTABLE_PPEXT_PARAM: + { + DataSet->mValue = ZT1LogElement->mZTLogData.at(i)->mZT1ThreadData->mPExt; + break; + } + case ZT1_DISCREET_PLOTTABLE_PG_PARAM: + { + DataSet->mValue = ZT1LogElement->mZTLogData.at(i)->mZT1ThreadData->mPG; + break; + } + case ZT1_DISCREET_PLOTTABLE_FN_PARAM: + { + DataSet->mValue = ZT1LogElement->mZTLogData.at(i)->mZT1ThreadData->mFN; + break; + } + case ZT1_DISCREET_PLOTTABLE_CI_PARAM: + { + DataSet->mValue = ZT1LogElement->mZTLogData.at(i)->mZT1ThreadData->mFN; + break; + } + case ZT1_DISCREET_PLOTTABLE_ZT1_CDV_PARAM: + { + break; + } + } + } + else if(i > 0) //if there is no data available, use the previous value... + { + DataSet->mValue = mZT1DiscreetPlots[param].mDataSet->at(i-1)->mValue; + + if(CurRank > 0 && Done == false) + { + Done = true; + mRankRuler->AddRankItem(QString().sprintf("%d",CurRank),mRankStartTime,ZT1LogElement->mZTLogData.at(i-1)->mTimestamp); + } + } + switch(param) + { + case ZT1_DISCREET_PLOTTABLE_CI_PARAM: + { + DataSet->mValue = ZT1LogElement->mZTLogData.at(i)->mCIZT1; + break; + } + case ZT1_DISCREET_PLOTTABLE_ZT1_CDV_PARAM: + { + DataSet->mValue = ZT1LogElement->mZTLogData.at(i)->mCDVARM_ZT1; + break; + } + } + + mZT1DiscreetPlots[param].mDataSet->append(DataSet); + } + + for(int param = 0; param < ZT1_ANALOG_PLOTTABLE_NB_PARAM; param++) + { + CGraphAnalogDataPair *DataSet = new CGraphAnalogDataPair(0,ZT1LogElement->mZTLogData.at(i)->mTimestamp); + + if(ZT1LogElement->mZTLogData.at(i)->mZT1ThreadData != 0) + { + switch(param) + { + case ZT1_ANALOG_PLOTTABLE_PGEXT_PARAM: + { + DataSet->mValue = (qreal)ZT1LogElement->mZTLogData.at(i)->mZT1ThreadData->mPGExtValue; + break; + } + case ZT1_ANALOG_PLOTTABLE_PGINT_PARAM: + { + DataSet->mValue = (qreal)ZT1LogElement->mZTLogData.at(i)->mZT1ThreadData->mPGIntValue; + break; + } + case ZT1_ANALOG_PLOTTABLE_TRAIN_SPEED_PARAM: + { + + DataSet->mValue = ZT1LogElement->mZTLogData.at(i)->mZT1ThreadData->mTrainSpeed; + if(DataSet->mValue > MaxTrainSpeed) + MaxTrainSpeed = DataSet->mValue; + + if(DataSet->mValue != 0 && DataSet->mValue < MinTrainSpeed) + MinTrainSpeed = DataSet->mValue; + + break; + } + case ZT1_ANALOG_PLOTTABLE_PGCOMBINED_PARAM: + { + qint32 PI = ZT1LogElement->mZTLogData.at(i)->mZT1ThreadData->mPGIntValue,PE = ZT1LogElement->mZTLogData.at(i)->mZT1ThreadData->mPGExtValue; + + qint32 offsetint = ZT1LogElement->mFlags.mIntPGOffset; + qint32 offsetext = ZT1LogElement->mFlags.mExtPGOffset; + qint32 tempint = (PI - offsetint); + qint32 tempext = (PE - offsetext); + qint32 Quadra = tempint*tempext; + DataSet->mValue = (qreal)Quadra; + //qDebug("%f",DataSet->mValue); + + break; + } + case ZT1_ANALOG_PLOTTABLE_SDF_DATA_PARAM: + { + if(ZT1LogElement->mFlags.mAnalogTracePresent == true) + { + DataSet->mValue = (qreal)ZT1LogElement->mZTLogData.at(i)->mAnalogData * 10 / 4096; + } + break; + } + } + } + else //No analog data... set to 0 + { + DataSet->mValue = 0; + } + mZT1AnalogPlots[param].mDataSet->append(DataSet); + } + } + + for(int param = 0; param < ZT1_ANALOG_PLOTTABLE_NB_PARAM; param++) + { + mZT1AnalogPlots[param].mPlotGaph->SetAbsoluteLimits(ZT1LogElement->mThreadDataStartTime,ZT1LogElement->mThreadDataEndTime); + } + + mZT1AnalogPlots[ZT1_ANALOG_PLOTTABLE_PGCOMBINED_PARAM].mPlotGaph->AddHorizontalLine(ZT1LogElement->mFlags.mPGTresholdValue); + mPGTreshold = ZT1LogElement->mFlags.mPGTresholdValue; + + // mRankRuler->AddRankItem(QString().sprintf("%d",CurRank),mRankStartTime,ZT1LogElement->mZTLogData.last()->mTimestamp); + + mMinTime = mStartTime = mZT1DiscreetPlots[0].mDataSet->first()->mTime; + mMaxTime = mZT1DiscreetPlots[0].mDataSet->last()->mTime; + + if(ZT1LogElement->mZTDetections.size() == 0) + { + mEventRuler->ClearRuler(); + } + else + { + for(int event = 0; event < ZT1LogElement->mZTDetections.size(); event++) + { + mEventRuler->AddEventItem(CZTData::GetShortErrorString(ZT1LogElement->mZTDetections.at(event)->mDetectionID),ZT1LogElement->mZTDetections.at(event)->mTimeStamp); + } + } + + mPassageStats2Txt->setPlainText(QString().sprintf("Vitesse Max : %.3f Mph\nVitesse Min: %.3f Mph\nSeuil PG : %d",MaxTrainSpeed,MinTrainSpeed,mPGTreshold)); + + } + else if(mViewType == ZT2_LOG_TYPE) + { + int CurRank = 0; + quint64 mRankStartTime = 0; + + + CZT2LogElement *ZT2LogElement = (CZT2LogElement*)element; + mPassageDateTime = ZT2LogElement->mPassageDateTime.toString("yyyy/MM/dd hh:mm:ss");; + mPassageStation = ZT2LogElement->mStationName; + mPassageStats2Txt->setPlainText("Vitesse Max : N/A\nVitesse Min: N/A\nSeuil PG : N/A"); + + for(int i = 0; i < ZT2LogElement->mZTLogData.size(); i++) + { + for(int param = 0; param < ZT2_DISCREET_PLOTTABLE_NB_PARAM; param++) + { + CGraphDiscreteDataPair *DataSet = new CGraphDiscreteDataPair(0,ZT2LogElement->mZTLogData.at(i)->mTimestamp); + if(ZT2LogElement->mZTLogData.at(i)->mZT2ThreadData != 0) + { + if(ZT2LogElement->mZTLogData.at(i)->mZT2ThreadData->mRank > (unsigned int)CurRank) + { + if(CurRank == 0) + { + mRankStartTime = ZT2LogElement->mZTLogData.at(i)->mTimestamp; + CurRank = ZT2LogElement->mZTLogData.at(i)->mZT2ThreadData->mRank; + } + else + { + mRankRuler->AddRankItem(QString().sprintf("%d",CurRank),mRankStartTime,ZT2LogElement->mZTLogData.at(i)->mTimestamp); + mRankStartTime = ZT2LogElement->mZTLogData.at(i)->mTimestamp; + CurRank = ZT2LogElement->mZTLogData.at(i)->mZT2ThreadData->mRank; + mRankStartTime = ZT2LogElement->mZTLogData.at(i)->mTimestamp; + + } + } + + + switch(param) + { + case ZT2_DISCREET_PLOTTABLE_S1_PARAM: + { + DataSet->mValue = ZT2LogElement->mZTLogData.at(i)->mZT2ThreadData->mS1; + break; + } + case ZT2_DISCREET_PLOTTABLE_PPEXT_PARAM: + { + DataSet->mValue = ZT2LogElement->mZTLogData.at(i)->mZT2ThreadData->mPPExt; + break; + } + case ZT2_DISCREET_PLOTTABLE_PPINT_PARAM: + { + DataSet->mValue = ZT2LogElement->mZTLogData.at(i)->mZT2ThreadData->mPPInt; + break; + } + + } + } + else if(i > 0) //if there is no data available, use the previous value... + { + DataSet->mValue = mZT2DiscreetPlots[param].mDataSet->at(i-1)->mValue; + } + switch(param) + { + case ZT2_DISCREET_PLOTTABLE_CI_PARAM: + { + DataSet->mValue = ZT2LogElement->mZTLogData.at(i)->mCIZT2; + break; + } + case ZT2_DISCREET_PLOTTABLE_CDV_PARAM: + { + DataSet->mValue = ZT2LogElement->mZTLogData.at(i)->mCDVARM_ZT2; + break; + } + case ZT2_DISCREET_PLOTTABLE_APPROACH_CDV_PARAM: + { + DataSet->mValue = ZT2LogElement->mZTLogData.at(i)->mCDVApproach_ZT2; + } + } + + mZT2DiscreetPlots[param].mDataSet->append(DataSet); + } + +// for(int param = 0; param < ZT1_ANALOG_PLOTTABLE_NB_PARAM; param++) +// { +// CGraphAnalogDataPair *DataSet = new CGraphAnalogDataPair(0,ZT1LogElement->mZTLogData.at(i)->mTimestamp); +// if(ZT1LogElement->mZTLogData.at(i)->mZT1ThreadData != 0) +// { +// switch(param) +// { +// case ZT1_ANALOG_PLOTTABLE_PGEXT_PARAM: +// { +// DataSet->mValue = (qreal)ZT1LogElement->mZTLogData.at(i)->mZT1ThreadData->mPGExtValue; +// break; +// } +// case ZT1_ANALOG_PLOTTABLE_PGINT_PARAM: +// { +// DataSet->mValue = (qreal)ZT1LogElement->mZTLogData.at(i)->mZT1ThreadData->mPGIntValue; +// break; +// } +// case ZT1_ANALOG_PLOTTABLE_TRAIN_SPEED_PARAM: +// { + +// DataSet->mValue = ZT1LogElement->mZTLogData.at(i)->mZT1ThreadData->mTrainSpeed; +// // if(DataSet->mValue == 0) +// // DataSet->mValue = -1; +// break; +// } +// } +// } +// else //No analog data... set to 0 +// { +// DataSet->mValue = 0; +// } +// mZT1AnalogPlots[param].mDataSet->append(DataSet); +// } + } + + mRankRuler->AddRankItem(QString().sprintf("%d",CurRank),mRankStartTime,ZT2LogElement->mZTLogData.last()->mTimestamp); + + mMinTime = mStartTime = mZT2DiscreetPlots[0].mDataSet->first()->mTime; + mMaxTime = mZT2DiscreetPlots[0].mDataSet->last()->mTime; + + if(ZT2LogElement->mZTDetections.size() == 0) + { + mEventRuler->ClearRuler(); + } + else + { + for(int event = 0; event < ZT2LogElement->mZTDetections.size(); event++) + { + mEventRuler->AddEventItem(CZTData::GetShortErrorString(ZT2LogElement->mZTDetections.at(event)->mDetectionID),ZT2LogElement->mZTDetections.at(event)->mTimeStamp); + } + } + + } + else + { + return; + } + + mStopTime = mMaxTime; + mTotalTimeSpan = mMaxTime - mMinTime; + mCurTimeSpan = mStopTime - mStartTime; + + mCurPixelTickValue = (qreal)GRAPH_ZONE_WIDTH/(qreal)mCurTimeSpan; //pixels per microsecs + mCursorPos = mStartTime; + + mPassageStats1Txt->setPlainText(QString().sprintf("Date & heure: %s\nStation : %s\nPosition : %s",mPassageDateTime.toUtf8().data(),mPassageStation.toUtf8().data()," ")); + + ShowSpan(mStartTime,mStopTime); + + ShowPlots(mViewType); + +// for(int param = 0; param < DISCREET_PLOTTABLE_NB_PARAM; param++) +// { +// mZT1DiscreetPlots[param].mPlotGaph->DisplayData(mStartTime,mStopTime); +// } +} + +void CLogViewPage::ShowPlots(unsigned int ViewType) +{ + if(ViewType == ZT1_LOG_TYPE) + { + for(int param = 0; param < ZT1_DISCREET_PLOTTABLE_NB_PARAM; param++) + { + mZT1DiscreetPlots[param].mPlotGaph->show(); + } + for(int param = 0; param < ZT1_ANALOG_PLOTTABLE_NB_PARAM; param++) + { + mZT1AnalogPlots[param].mPlotGaph->show(); + } + for(int param = 0; param < ZT2_DISCREET_PLOTTABLE_NB_PARAM; param++) + { + mZT2DiscreetPlots[param].mPlotGaph->hide(); + } + for(int param = 0; param < ZT2_ANALOG_PLOTTABLE_NB_PARAM; param++) + { + // mZT1AnalogPlots[param].mPlotGaph->show(); + } + } + else if(ViewType == ZT2_LOG_TYPE) + { + for(int param = 0; param < ZT1_DISCREET_PLOTTABLE_NB_PARAM; param++) + { + mZT1DiscreetPlots[param].mPlotGaph->hide(); + } + for(int param = 0; param < ZT1_ANALOG_PLOTTABLE_NB_PARAM; param++) + { + mZT1AnalogPlots[param].mPlotGaph->hide(); + } + for(int param = 0; param < ZT2_DISCREET_PLOTTABLE_NB_PARAM; param++) + { + mZT2DiscreetPlots[param].mPlotGaph->show(); + } + for(int param = 0; param < ZT2_ANALOG_PLOTTABLE_NB_PARAM; param++) + { + // mZT1AnalogPlots[param].mPlotGaph->show(); + } + } +} + +void CLogViewPage::DestroyData() +{ + for(int item = 0; item < ZT1_DISCREET_PLOTTABLE_NB_PARAM; item++) + { + for(int i = 0; i < mZT1DiscreetPlots[item].mDataSet->size(); i++) + { + delete mZT1DiscreetPlots[item].mDataSet->at(i); + } + mZT1DiscreetPlots[item].mDataSet->clear(); + } + + for(int item = 0; item < ZT1_ANALOG_PLOTTABLE_NB_PARAM; item++) + { + for(int i = 0; i < mZT1AnalogPlots[item].mDataSet->size(); i++) + { + delete mZT1AnalogPlots[item].mDataSet->at(i); + } + mZT1AnalogPlots[item].mDataSet->clear(); + } + + for(int item = 0; item < ZT2_DISCREET_PLOTTABLE_NB_PARAM; item++) + { + for(int i = 0; i < mZT2DiscreetPlots[item].mDataSet->size(); i++) + { + delete mZT2DiscreetPlots[item].mDataSet->at(i); + } + mZT2DiscreetPlots[item].mDataSet->clear(); + } + + for(int item = 0; item < ZT2_ANALOG_PLOTTABLE_NB_PARAM; item++) + { +// for(int i = 0; i < mZT2AnalogPlots[item].mDataSet->size(); i++) +// { +// delete mZT1AnalogPlots[item].mDataSet->at(i); +// } +// mZT1AnalogPlots[item].mDataSet->clear(); + } + + mRankRuler->ClearRuler(); + mEventRuler->ClearRuler(); +} + +void CLogViewPage::ZoomIn(bool CenterOnCursor) +{ + + //First, compute a zoom centered on the center of the area + qint64 NewSpan = mCurTimeSpan - (mCurTimeSpan/5); + if(NewSpan < 1000000) + { + NewSpan = mCurTimeSpan; //stop zooming + } + qint64 delta = mCurTimeSpan - NewSpan; + quint64 StartTime = mStartTime + delta/2; + quint64 StopTime = StartTime + NewSpan; + if(StopTime > mMaxTime) + { + StopTime = mMaxTime; + StartTime = StopTime - NewSpan; + } + + if(CenterOnCursor) + { +#ifdef ZOOM_CENTERED_ON_CURSOR + + //Now let's find how many pixels have moved from the cursor + //by finding the position of the cursor time in the new timespan + quint64 CursorTime = GetTimeForPixel(mCursorPos); + + //Convert time to pixels (in the new timespan) + quint64 AbsoluteTime = CursorTime - StartTime; + qreal PixelsPernSecs = (qreal)GRAPH_ZONE_WIDTH/(NewSpan); + qreal Pixel = AbsoluteTime * PixelsPernSecs; + + Pixel += GRAPH_ZONE_X_OFFSET; + + //Find from how much pixels we have moved + qreal DeltaX = Pixel - mCursorPos; + + //convert this to an amount of time + qint64 DeltaTime = ((qint64)DeltaX * NewSpan)/GRAPH_ZONE_WIDTH; + + //Shift the timespan to center the zoom on the cursor. + StartTime += DeltaTime; + if(StartTime < mMinTime) + { + StartTime = mMinTime; + } + StopTime = StartTime + NewSpan; + if(StopTime > mMaxTime) + { + StopTime = mMaxTime; + StartTime = StopTime - NewSpan; + } + +#endif + } + + ShowSpan(StartTime,StopTime); +} + +void CLogViewPage::ZoomOut(bool CenterOnCursor) +{ + qint64 NewSpan = mCurTimeSpan + (mCurTimeSpan/5); + if(NewSpan > (qint64)(mMaxTime - mMinTime)) + { + ShowSpan(mMinTime,mMaxTime); + } + else + { + + qint64 delta = NewSpan - mCurTimeSpan; + + qint64 StartTime = mStartTime - delta/2; + + if(StartTime < (qint64)mMinTime/* || StartTime < 0*/) + { + StartTime = mMinTime; + } + quint64 StopTime = StartTime + NewSpan; + if(StopTime > mMaxTime) + { + StopTime = mMaxTime; + StartTime = StopTime - NewSpan; + } + + if(CenterOnCursor == true) + { +#ifdef ZOOM_CENTERED_ON_CURSOR + quint64 CursorTime = GetTimeForPixel(mCursorPos); + + //Convert time to pixels (in the new timespan) + quint64 AbsoluteTime = CursorTime - StartTime; + qreal PixelsPernSecs = (qreal)GRAPH_ZONE_WIDTH/(NewSpan); + qreal Pixel = AbsoluteTime * PixelsPernSecs; + + Pixel += GRAPH_ZONE_X_OFFSET; + + //Find from how much pixels we have moved + qreal DeltaX = Pixel - mCursorPos; + + //convert this to an amount of time + qint64 DeltaTime = ((qint64)DeltaX * NewSpan)/GRAPH_ZONE_WIDTH; + + //Shift the timespan to center the zoom on the cursor. + StartTime += DeltaTime; + if(StartTime < (qint64)mMinTime/* || StartTime < 0*/) + { + StartTime = mMinTime; + } + StopTime = StartTime + NewSpan; + if(StopTime > mMaxTime) + { + StopTime = mMaxTime; + StartTime = StopTime - NewSpan; + } +#endif + } + + ShowSpan(StartTime,StopTime); + } +} + +void CLogViewPage::SetZoom(int ZoomValue) +{ + Q_UNUSED(ZoomValue) +} + +//Grab the mouse if the user clicks outside buttons +void CLogViewPage::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + if(event->button() == Qt::LeftButton) + { + mMouseDragging = true; + mMouseMoved = false; + } + event->accept(); +} +void CLogViewPage::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + + if(event->button() == Qt::LeftButton) + { + mMouseDragging = false; + + if(mMouseMoved == false) + { + mStaticCursor1->setPos(event->pos().x(),0); + mStaticCursor1->SetTime(GetTimeForPixel(event->pos().x())); + mStaticCursor1->SetCursor(); + mStaticCursor1->show(); + UpdateStaticCursorsDeltaTime(); + mCursor1TimeTxt->setPlainText(QString().sprintf("Position curseur 1 : %d ms",(int)(mStaticCursor1->GetTime()/1000000))); + } + } + if(event->button() == Qt::RightButton) + { + mStaticCursor2->setPos(event->pos().x(),0); + mStaticCursor2->SetTime(GetTimeForPixel(event->pos().x())); + mStaticCursor2->SetCursor(); + mStaticCursor2->show(); + mCursor2TimeTxt->setPlainText(QString().sprintf("Position curseur 2 : %d ms",(int)(mStaticCursor2->GetTime()/1000000))); + UpdateStaticCursorsDeltaTime(); + } + + event->accept(); +} +void CLogViewPage::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +{ + if(mMouseDragging) + { + mMouseMoved = true; + qreal Drag = event->lastPos().x() - event->pos().x(); + //qreal Drag = 50; + if(Drag != 0) + { + qreal TickValue = (qreal)GRAPH_ZONE_WIDTH/(qreal)mCurTimeSpan; + qreal temp = TickValue/Drag; + //quint64 usecsDrag = 1/(mCurPixelTickValue/Drag); + qint64 usecsDrag = 1/temp; + ScrollGraphs(usecsDrag); + } + } + AdjustMouseCursorPos(event->pos().x(),event->pos().y()); + event->accept(); + +} + +//void CLogViewPage::keyReleaseEvent(QKeyEvent *event) +//{ +// if(mMouseDragging) +// { +// if(event->key() == Qt::Key_Right) +// { +// AdjustMouseCursorPos(mCursor->GetPixelPos() + 1); +// return; +// } +// else if(event->key() == Qt::Key_Left) +// { +// AdjustMouseCursorPos(mCursor->GetPixelPos() - 1); +// return; +// } +// } +// event->ignore(); +//} + +bool CLogViewPage::eventFilter(QObject *obj, QEvent *event) +{ + if(isVisible()) //Check if event is coming from us + { + if(event->type() == QEvent::KeyPress) + { + QKeyEvent *KeyEvent = static_cast(event); + + if(KeyEvent->key() == Qt::Key_Left) + { + AdjustMouseCursorPos(mVCursor->GetPixelPos() - 1,mHCursor->GetPixelPos()); + return true; //keep the keystroke + } + if(KeyEvent->key() == Qt::Key_Right) + { + AdjustMouseCursorPos(mVCursor->GetPixelPos() + 1,mHCursor->GetPixelPos()); + return true; //keep the keystroke + } + } + } + + return QObject::eventFilter(obj,event); + +} + +void CLogViewPage::wheelEvent(QGraphicsSceneWheelEvent *event) +{ + + //Zoom must be higher than 100 (100%) + //That is full scale. + //int Zoom; + if(event-> delta() < 0) + { + ZoomOut(); +// Zoom = mZoomValue - ZOOM_TICK; +// if(Zoom < 100) +// Zoom = 100; + } + else + { + ZoomIn(); +// Zoom = mZoomValue + ZOOM_TICK; + } + +// mZoomValue = Zoom; + +// SetZoom(Zoom); + event->accept(); +} + +void CLogViewPage::ScrollGraphs(qint64 Delta) +{ + quint64 CurTimeSpan = mStopTime - mStartTime; + + + if(Delta > 0) + { + + + if(mStopTime + Delta >= mMaxTime) + { + mStopTime = mMaxTime; + } + else + { + mStopTime += Delta; + } + + mStartTime = mStopTime - CurTimeSpan; + + } + else + { +// if(mStartTime == mMinTime) +// return; + + //Delta is negative !! + qint64 start = mStartTime + Delta; + if(start <= (qint64)mMinTime) + { + mStartTime = mMinTime; + } + else + { + mStartTime += Delta; + } + mStopTime = mStartTime + CurTimeSpan; + } + +// qDebug() << "StartTime = " << mStartTime << "StopTime = " << mStopTime << "delta= " << Delta; + + if(mScrollAnimationTimer.elapsed() > 33) //limit the animation to 30FPS + { + ShowSpan(mStartTime,mStopTime); + mScrollAnimationTimer.start(); + } +// for(int param = 0; param < DISCREET_PLOTTABLE_NB_PARAM; param++) +// { +// mZT1DiscreetPlots[param].mPlotGaph->DisplayData(mStartTime,mStopTime); +// } +} + + +void CLogViewPage::hoverMoveEvent(QGraphicsSceneHoverEvent *event) +{ + AdjustMouseCursorPos(event->pos().x(),event->pos().y()); + +// mCursorPos = event->pos().x(); +// if(mCursorPos < GRAPH_ZONE_X_OFFSET) +// mCursorPos = GRAPH_ZONE_X_OFFSET; +// else if(mCursorPos > GRAPH_ZONE_WIDTH + GRAPH_ZONE_X_OFFSET) +// mCursorPos = GRAPH_ZONE_WIDTH + GRAPH_ZONE_X_OFFSET; + +// mCursor->setPos(mCursorPos,0); +// int CursorTime = GetTimeForPixel(mCursorPos)/1000000; +// mCursorPosTxt->setPlainText(QString().sprintf("%d ms",CursorTime)); +} + +qreal CLogViewPage::GetPixelForTime(quint64 Time) +{ + quint64 AbsoluteTime = Time - mStartTime; + qreal PixelsPernSecs = (qreal)GRAPH_ZONE_WIDTH/(mStopTime - mStartTime); + qreal Pixel = AbsoluteTime * PixelsPernSecs; + + return Pixel+GRAPH_ZONE_X_OFFSET; +} + +quint64 CLogViewPage::GetTimeForPixel(qreal PixelPos) +{ + PixelPos -= GRAPH_ZONE_X_OFFSET; + qreal nSecsPerPixels = (mStopTime - mStartTime)/GRAPH_ZONE_WIDTH; + quint64 AbsoluteTimeForPixel = PixelPos*nSecsPerPixels; + quint64 Time = mStartTime + AbsoluteTimeForPixel; + + return Time; +} + +unsigned int CLogViewPage::ShowSpan(qreal PixelPos1, qreal PixelPos2) +{ + return ShowSpan(GetTimeForPixel(PixelPos1),GetTimeForPixel(PixelPos2)); +} +unsigned int CLogViewPage::ShowSpan(quint64 TimePos1, quint64 TimePos2) +{ + if(TimePos1 > TimePos2) + { + mStartTime = TimePos2; + mStopTime = TimePos1; + } + else + { + mStartTime = TimePos1; + mStopTime = TimePos2; + } + + mCurTimeSpan = mStopTime - mStartTime; + mCurPixelTickValue = (qreal)GRAPH_ZONE_WIDTH/(qreal)mCurTimeSpan; //pixels per microsecs + + if(mViewType == ZT1_LOG_TYPE) + { + for(int param = 0; param < ZT1_DISCREET_PLOTTABLE_NB_PARAM; param++) + { + mZT1DiscreetPlots[param].mPlotGaph->DisplayData(mStartTime,mStopTime); + } + for(int param = 0; param < ZT1_ANALOG_PLOTTABLE_NB_PARAM; param++) + { + mZT1AnalogPlots[param].mPlotGaph->DisplayData(mStartTime,mStopTime); + } + } + else if(mViewType == ZT2_LOG_TYPE) + { + for(int param = 0; param < ZT2_DISCREET_PLOTTABLE_NB_PARAM; param++) + { + mZT2DiscreetPlots[param].mPlotGaph->DisplayData(mStartTime,mStopTime); + } + for(int param = 0; param < ZT2_ANALOG_PLOTTABLE_NB_PARAM; param++) + { + // mZT2AnalogPlots[param].mPlotGaph->DisplayData(mStartTime,mStopTime); + } + } + else + return RET_ERROR; + + AdjustStaticCursorsPos(); + mRuler->SetRange(mStartTime,mStopTime); + mRankRuler->SetRange(mStartTime,mStopTime); + mEventRuler->SetRange(mStartTime,mStopTime); + + return RET_OK; +} + +unsigned int CLogViewPage::AdjustStaticCursorsPos() +{ + if(mStaticCursor1->IsCursorSet()) + { + quint64 CursorTime = mStaticCursor1->GetTime(); + if(CursorTime < mStartTime || CursorTime > mStopTime) + { + mStaticCursor1->hide(); + } + else + { + qreal newpos = GetPixelForTime(CursorTime); + mStaticCursor1->setPos(newpos,0); + mStaticCursor1->show(); + } + } + if(mStaticCursor2->IsCursorSet()) + { + quint64 CursorTime = mStaticCursor2->GetTime(); + if(CursorTime < mStartTime || CursorTime > mStopTime) + { + mStaticCursor2->hide(); + } + else + { + qreal newpos = GetPixelForTime(CursorTime); + mStaticCursor2->setPos(newpos,0); + mStaticCursor2->show(); + } + } + return RET_OK; +} + +unsigned int CLogViewPage::AdjustMouseCursorPos(qreal PosX, qreal PosY) +{ + mCursorPos = PosX; + if(mCursorPos < GRAPH_ZONE_X_OFFSET) + mCursorPos = GRAPH_ZONE_X_OFFSET; + else if(mCursorPos > GRAPH_ZONE_WIDTH + GRAPH_ZONE_X_OFFSET) + mCursorPos = GRAPH_ZONE_WIDTH + GRAPH_ZONE_X_OFFSET; + + qreal HCursorPos = PosY; + if(HCursorPos > GRAPH_ZONE_HEIGHT) + HCursorPos = GRAPH_ZONE_HEIGHT; + + + mVCursor->setPos(mCursorPos,0); + mHCursor->setPos(GRAPH_ZONE_X_OFFSET,HCursorPos); + // mCursor->update(); + int CursorTime = GetTimeForPixel(mCursorPos)/1000000; + mPassageStats1Txt->setPlainText(QString().sprintf("Date & heure: %s\nStation : %s\nPosition : %d ms",mPassageDateTime.toUtf8().data(),mPassageStation.toUtf8().data(),CursorTime)); +// mCursorPosTxt->setPlainText(QString().sprintf("%d ms",CursorTime)); + + for(int i = 0; i < ZT1_ANALOG_PLOTTABLE_NB_PARAM; i++) + mZT1AnalogPlots[i].mPlotGaph->GetValueForTime(GetTimeForPixel(mCursorPos)); + + update(mVCursor->boundingRect()); + update(mHCursor->boundingRect()); + return RET_OK; +} + +unsigned int CLogViewPage::UpdateStaticCursorsDeltaTime() +{ + if(mStaticCursor1->IsCursorSet() == true && mStaticCursor2->IsCursorSet() == true) + { + QString Temp; + quint64 Cur1,Cur2; + qint64 Diff; + Cur1 = mStaticCursor1->GetTime(); + Cur2 = mStaticCursor2->GetTime(); + Diff = Cur1 - Cur2; + //qreal Delta = (qreal)(mStaticCursor1->GetTime() - mStaticCursor2->GetTime()); + qreal Delta = Diff; + if(Delta < 0) + Delta *= -1; + + if(Delta/1000000000 > 1) + { + QTextStream(&Temp) << "Delta: " << Delta/1000000000 << " s"; + } + else if(Delta/1000000 > 1) + { + QTextStream(&Temp) << "Delta: " << Delta/1000000 << " ms"; + } + else if(Delta/1000 > 1) + { + QTextStream(&Temp) << "Delta: " << Delta/1000 << " us"; + } + else + { + QTextStream(&Temp) << "Delta: " << Delta << " ns"; + } + + mStaticCursorDeltaTimeTxt->setPlainText(Temp); + } + + return RET_OK; + +} + +void CLogViewPage::EnableCloseButton() +{ + mCancelButton->show(); +} + +void CLogViewPage::DisableCloseButton() +{ + mCancelButton->hide(); +} diff --git a/sources/GuiElements/LogViewPage.h b/sources/GuiElements/LogViewPage.h new file mode 100644 index 0000000..72f339d --- /dev/null +++ b/sources/GuiElements/LogViewPage.h @@ -0,0 +1,205 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Description du fichier si nécessaire. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20131024 JFM + Verision d'origine. + +### YYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + + +#ifndef LOGVIEWPAGE_H +#define LOGVIEWPAGE_H + +#include "GlobalDefine.h" +#include +#include "Guipage.h" +#include +#include "PushButton.h" +#include "TextButtonWidget.h" +#include "LogMgr.h" +#include +#include "GraphItem.h" +//#include "qcustomplot.h" +#include "GraphCursorWidget.h" +#include "GraphRulerWidget.h" +#include "AnalogGraphItem.h" +#include "RankRulerWidget.h" +#include "EventsRulerWidget.h" +#include "QElapsedTimer" + +#define GRAPH_ZONE_WIDTH 880//900 +#define GRAPH_ZONE_HEIGHT 650//700 +#define GRAPH_ZONE_X_OFFSET 70 //50 +#define MIN_TIMESPAN 1000 //1 millisecond + +#define ZOOM_TICK 10 +#define SCROLL_TICK 1 +#define ZOOM_CENTERED_ON_CURSOR + +class COutilZT; + +enum eZT1DiscreetPlottableParamID +{ + ZT1_DISCREET_PLOTTABLE_S1_PARAM, + ZT1_DISCREET_PLOTTABLE_S2_PARAM, + ZT1_DISCREET_PLOTTABLE_PPINT_PARAM, + ZT1_DISCREET_PLOTTABLE_PPEXT_PARAM, + ZT1_DISCREET_PLOTTABLE_PG_PARAM, + ZT1_DISCREET_PLOTTABLE_FN_PARAM, + ZT1_DISCREET_PLOTTABLE_CI_PARAM, + ZT1_DISCREET_PLOTTABLE_ZT1_CDV_PARAM, + + ZT1_DISCREET_PLOTTABLE_NB_PARAM +}; + +enum eZT1AnalogPlottableParamID +{ + ZT1_ANALOG_PLOTTABLE_PGINT_PARAM, + ZT1_ANALOG_PLOTTABLE_PGEXT_PARAM, + ZT1_ANALOG_PLOTTABLE_PGCOMBINED_PARAM, + ZT1_ANALOG_PLOTTABLE_TRAIN_SPEED_PARAM, + ZT1_ANALOG_PLOTTABLE_SDF_DATA_PARAM, + + + ZT1_ANALOG_PLOTTABLE_NB_PARAM +}; + +enum eZT2DiscreetPlottableParamID +{ + ZT2_DISCREET_PLOTTABLE_S1_PARAM, + ZT2_DISCREET_PLOTTABLE_PPEXT_PARAM, + ZT2_DISCREET_PLOTTABLE_PPINT_PARAM, + ZT2_DISCREET_PLOTTABLE_CI_PARAM, + ZT2_DISCREET_PLOTTABLE_APPROACH_CDV_PARAM, + ZT2_DISCREET_PLOTTABLE_CDV_PARAM, + + ZT2_DISCREET_PLOTTABLE_NB_PARAM +}; + +enum eZT2AnalogPlottableParamID +{ + ZT2_ANALOG_PLOTTABLE_NB_PARAM +}; + + +class CDiscreetPlottableItem +{ +public: + unsigned int mParamID; + QList *mDataSet; + CGraphItem *mPlotGaph; +}; + +class CAnalogPlottableItem +{ +public: + unsigned int mParamID; + QList *mDataSet; + CAnalogGraphItem *mPlotGaph; +}; + + + +class CLogViewPage : public CGuiPage +{ +Q_OBJECT +public: + CLogViewPage(QGraphicsWidget *Parent = 0); + ~CLogViewPage(); + + COutilZT *mProgramHandle; + CLogElement *mLogElement; + CDiscreetPlottableItem mZT1DiscreetPlots[ZT1_DISCREET_PLOTTABLE_NB_PARAM]; + CAnalogPlottableItem mZT1AnalogPlots[ZT1_ANALOG_PLOTTABLE_NB_PARAM]; + CDiscreetPlottableItem mZT2DiscreetPlots[ZT2_DISCREET_PLOTTABLE_NB_PARAM]; + + void SetLogData(CLogElement *element); + void DestroyData(); + void EnableCloseButton(); + void DisableCloseButton(); + + + virtual void resizeEvent(QGraphicsSceneResizeEvent *event); + virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); + virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); + virtual void wheelEvent(QGraphicsSceneWheelEvent *event); + virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event); + virtual void hoverMoveEvent(QGraphicsSceneHoverEvent *event); +// virtual void keyReleaseEvent(QKeyEvent *event); + virtual bool eventFilter(QObject *obj, QEvent *event); + +// QCustomPlot mPlotWidget; + +private: + + QGraphicsRectItem *mBackgroundRect; + CTextButtonWidget *mCancelButton; + CTextButtonWidget *mCursorsZoomButton, *mZoomInButton, *mZoomOutButton, *mZoomResetButton; + int mZoomValue; + quint64 mStartTime, mStopTime; + quint64 mCurTimeSpan; + quint64 mTotalTimeSpan; + quint64 mMinTime, mMaxTime; + qreal mCurPixelTickValue; + qint32 mPGTreshold; + CVerticalGraphCursorWidget *mStaticCursor1, *mStaticCursor2, *mVCursor; + CHorizontalGraphCursorWidget *mHCursor; + QGraphicsTextItem *mCursorPosTxt; + QGraphicsTextItem *mStaticCursorDeltaTimeTxt, *mCursor1TimeTxt, *mCursor2TimeTxt; + QGraphicsTextItem *mPassageStats1Txt,*mPassageStats2Txt; + QString mPassageDateTime, mPassageStation; + + CGraphRulerWidget *mRuler; + CRankRulerWidget *mRankRuler; + CEventRulerWidget *mEventRuler; + unsigned int mViewType; + + int mStaticCursor1Pos, mStaticCursor2Pos; + int mCursorPos; + + bool mMouseDragging; + bool mMouseMoved; + + QElapsedTimer mScrollAnimationTimer; + qreal mLastMousePos; + + void SetZoom(int ZoomValue); + void ZoomIn(bool CenterOnCursor = true); + void ZoomOut(bool CenterOnCursor = true); + void ScrollGraphs(qint64 Delta); + quint64 GetTimeForPixel(qreal PixelPos); + qreal GetPixelForTime(quint64 Time); + unsigned int ShowSpan(qreal PixelPos1, qreal PixelPos2); + unsigned int ShowSpan(quint64 TimePos1, quint64 TimePos2); + unsigned int AdjustStaticCursorsPos(); + unsigned int AdjustMouseCursorPos(qreal PosX, qreal PosY); + unsigned int UpdateStaticCursorsDeltaTime(); + void ShowPlots(unsigned int ViewType); + + + +public slots: + void ButtonClicked(CTextButtonWidget *); + +}; + +#endif // LOGVIEWPAGE_H diff --git a/sources/GuiElements/LogsListPage.cpp b/sources/GuiElements/LogsListPage.cpp new file mode 100644 index 0000000..9fef110 --- /dev/null +++ b/sources/GuiElements/LogsListPage.cpp @@ -0,0 +1,802 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Page affichant la liste des passages de train. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20131021 JFM + Verision d'origine. + +### YYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + + +#include "LogsListPage.h" +#include +#include "OutilZT.h" +#include "TrainLogFileMgr.h" +#include +#include +#include +#include +#include + + + +CLogsListPage::~CLogsListPage() +{ +// delete mListParsingTimer; +} + +CLogsListPage::CLogsListPage(QGraphicsWidget *Parent) +{ + QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); + setParentItem(Parent); + mProgramHandle = 0; + mStationFilter.clear(); + + mLogsTable = new QTableWidget(0,4); + QGraphicsProxyWidget *TableProxy = new QGraphicsProxyWidget(this); + TableProxy->setWidget(mLogsTable); + TableProxy->setPos(3,20); + TableProxy->resize(380,350); + mLogsTable->resize(380,350); + mLogsTable->setSelectionBehavior(QAbstractItemView::SelectRows); + mLogsTable->setSelectionMode(QAbstractItemView::SingleSelection); + mLogsTable->clearContents(); + mLogsTable->setRowCount(0); + mLogsTable->setHorizontalHeaderLabels(QStringList() << "Date du passage" << "Station" << "Décl." << "Type"); +// connect(mLogsTable,SIGNAL(cellClicked(int,int)),this,SLOT(LogsTableCellClicked(int,int))); + connect(mLogsTable,SIGNAL(currentCellChanged(int,int,int,int)),this,SLOT(LogsTableCellSelected(int,int,int,int))); + connect(mLogsTable,SIGNAL(cellDoubleClicked(int,int)),SLOT(TableDoubleClicked(int,int))); + + mSummaryText = new QGraphicsTextItem(this); + QFont textfont; + textfont.setPointSize(12); + mSummaryText->setFont(textfont); + mSummaryText->setPlainText("Passage:"); + mSummaryText->setPos(3,370); + + QGraphicsProxyWidget *WidgetProxy = new QGraphicsProxyWidget(this); + mShowZT1ItemsChkBx = new QCheckBox("ZT1"); + WidgetProxy->setWidget(mShowZT1ItemsChkBx); + WidgetProxy->setPos(190,450); + mShowZT1ItemsChkBx->setChecked(true); + connect(mShowZT1ItemsChkBx,SIGNAL(stateChanged(int)),this,SLOT(CheckBoxClicked(int))); + + WidgetProxy = new QGraphicsProxyWidget(this); + mShowZT2ItemsChkBx = new QCheckBox("ZT2"); + WidgetProxy->setWidget(mShowZT2ItemsChkBx); + //WidgetProxy->setPos(410,550); + WidgetProxy->setPos(250,450); + mShowZT2ItemsChkBx->setChecked(true); + connect(mShowZT2ItemsChkBx,SIGNAL(stateChanged(int)),this,SLOT(CheckBoxClicked(int))); + + WidgetProxy = new QGraphicsProxyWidget(this); + mShowNoDetectionsChkBx = new QCheckBox("Sans décl."); + WidgetProxy->setWidget(mShowNoDetectionsChkBx); + WidgetProxy->setPos(300,450); + mShowNoDetectionsChkBx->setChecked(true); + connect(mShowNoDetectionsChkBx,SIGNAL(stateChanged(int)),this,SLOT(CheckBoxClicked(int))); + + + + + int x = 190, y = 480; + int xSpacing = 100, ySpacing = 30; + + WidgetProxy = new QGraphicsProxyWidget(this); + mShowFNChkBx = new QCheckBox("Frotteur"); + WidgetProxy->setWidget(mShowFNChkBx); + WidgetProxy->setPos(x,y+ySpacing); + mShowFNChkBx->setChecked(true); + connect(mShowFNChkBx,SIGNAL(stateChanged(int)),this,SLOT(CheckBoxClicked(int))); + + WidgetProxy = new QGraphicsProxyWidget(this); + mShowCountChkBx = new QCheckBox("Comptage"); + WidgetProxy->setWidget(mShowCountChkBx); + WidgetProxy->setPos(x+xSpacing,y+ySpacing); + mShowCountChkBx->setChecked(true); + connect(mShowCountChkBx,SIGNAL(stateChanged(int)),this,SLOT(CheckBoxClicked(int))); + + WidgetProxy = new QGraphicsProxyWidget(this); + mShowPGChkBx = new QCheckBox("P. Guidage"); + WidgetProxy->setWidget(mShowPGChkBx); + WidgetProxy->setPos(x+(xSpacing),y+(ySpacing*2)); + mShowPGChkBx->setChecked(true); + connect(mShowPGChkBx,SIGNAL(stateChanged(int)),this,SLOT(CheckBoxClicked(int))); + + WidgetProxy = new QGraphicsProxyWidget(this); + mShowPPChkBx = new QCheckBox("P. Porteur"); + WidgetProxy->setWidget(mShowPPChkBx); + WidgetProxy->setPos(x,y+(ySpacing*2)); + mShowPPChkBx->setChecked(true); + connect(mShowPPChkBx,SIGNAL(stateChanged(int)),this,SLOT(CheckBoxClicked(int))); + + WidgetProxy = new QGraphicsProxyWidget(this); + mShowMPM10ChkBx = new QCheckBox("MPM10"); + WidgetProxy->setWidget(mShowMPM10ChkBx); + WidgetProxy->setPos(x,y); + mShowMPM10ChkBx->setChecked(true); + connect(mShowMPM10ChkBx,SIGNAL(stateChanged(int)),this,SLOT(CheckBoxClicked(int))); + + WidgetProxy = new QGraphicsProxyWidget(this); + mShowMRChkBx = new QCheckBox("MR63/73"); + WidgetProxy->setWidget(mShowMRChkBx); + WidgetProxy->setPos(x+(xSpacing),y); + mShowMRChkBx->setChecked(true); + connect(mShowMRChkBx,SIGNAL(stateChanged(int)),this,SLOT(CheckBoxClicked(int))); + + WidgetProxy = new QGraphicsProxyWidget(this); + mShowProblematicTrainsChkbx = new QCheckBox("Passage Problématique"); + WidgetProxy->setWidget(mShowProblematicTrainsChkbx); + WidgetProxy->setPos(x,y+(ySpacing*3)); + mShowProblematicTrainsChkbx->setChecked(true); + connect(mShowProblematicTrainsChkbx,SIGNAL(stateChanged(int)),this,SLOT(CheckBoxClicked(int))); + + + QGraphicsTextItem *Label = new QGraphicsTextItem(this); + Label->setPlainText("Station:"); + Label->setPos(190,418); + + WidgetProxy = new QGraphicsProxyWidget(this); + mProtectLogChkBx = new QCheckBox("Passage protégé"); + WidgetProxy->setWidget(mProtectLogChkBx); + WidgetProxy->setPos(190,390); + mProtectLogChkBx->setChecked(false); + connect(mProtectLogChkBx,SIGNAL(clicked()),this,SLOT(ProtectLogCheckBoxClicked())); + mProtectLogChkBx->setEnabled(false); + + WidgetProxy = new QGraphicsProxyWidget(this); + mStationsFilterComboBox = new QComboBox(); + WidgetProxy->setWidget(mStationsFilterComboBox); + WidgetProxy->setPos(250,420); + mStationsFilterComboBox->insertItems(0,QStringList() << "Toutes" << "Angrignon" << "Snowdon" << "Henri Bourassa" << "Honoré Beaugrand" << "Longueuil" << "Berri UQAM" << "Montmorency (10/12)" << "Montmorency (10/22)" << "Côte Vertu" << "Saint-Michel"); + mStationsFilterComboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents); + mStationsFilterComboBox->adjustSize(); + mStationsFilterComboBox->setMaxVisibleItems(15); + connect(mStationsFilterComboBox,SIGNAL(activated(int)),this,SLOT(StationFilterSelected(int))); + + mViewZTLogBtn = new CPushButton(this,"./Images/log.png",false,0); + mViewZTLogBtn->resize(50,50); + mViewZTLogBtn->setPos(400,25); + connect(mViewZTLogBtn,SIGNAL(clicked(CPushButton*)),this,SLOT(ViewZTLogBtnClicked(CPushButton*))); + + mSaveCSVLogBtn = new CPushButton(this,"./Images/csv.png",false,0); + mSaveCSVLogBtn->resize(50,50); + mSaveCSVLogBtn->setPos(400,100); + connect(mSaveCSVLogBtn,SIGNAL(clicked(CPushButton*)),this,SLOT(SaveCSVLogBtnClicked(CPushButton*))); + + mDeleteFileButton = new CPushButton(this,"./Images/file_delete.png",false,0); + mDeleteFileButton->resize(50,50); + mDeleteFileButton->setPos(400,175); + connect(mDeleteFileButton,SIGNAL(clicked(CPushButton*)),this,SLOT(DeleteSelectedLog(CPushButton*))); + + + mSaveCSVLogBtn->hide(); + mDeleteFileButton->hide(); + + + + +} + +void CLogsListPage::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + Q_UNUSED(event) +// mBackgroundRect->setRect(boundingRect()); +} + +void CLogsListPage::ButtonClicked(CTextButtonWidget *BtnPtr) +{ + if(BtnPtr == mViewLogDataButton) + { + if(mLogMgrHandle->GetLogsCount() == 0) + return; + int cursel = mLogsTable->selectedItems().at(0)->data(Qt::UserRole).toInt(); + CLogElement* Element = mLogMgrHandle->GetLogsList()->at(cursel); + mProgramHandle->LogViewRequest(mLogMgrHandle->LoadLogData(Element),this); + mLogMgrHandle->FreeLogData(Element); + + } + else if(BtnPtr == mExportCSVLogButton) + { + if(mLogMgrHandle->GetLogsCount() == 0) + return; + + QString Filename; + int cursel = mLogsTable->selectedItems().at(0)->data(Qt::UserRole).toInt(); + CLogElement* Element = mLogMgrHandle->GetLogsList()->at(cursel); + mLogMgrHandle->LoadLogData(Element); + if(Element->mZTLogType == ZT1_LOG_TYPE) + { + CZT1LogElement *temp = (CZT1LogElement*)Element; + Filename = temp->mLogFileName.replace("bin","csv"); + CTrainLogFileMgr::instance()->SaveCSVFile(Filename,&temp->mZTLogData,&temp->mFlags,&temp->mZTDetections,temp->mStationName); + } + else + { + CZT2LogElement *temp = (CZT2LogElement*)Element; + Filename = temp->mLogFileName.replace("bin","csv"); + CTrainLogFileMgr::instance()->SaveCSVFile(Filename,&temp->mZTLogData,&temp->mZTDetections,temp->mStationName); + } + mLogMgrHandle->FreeLogData(Element); + } +} + +void CLogsListPage::EnableEngineeringMode() +{ + mSaveCSVLogBtn->show(); + mDeleteFileButton->show(); + mProtectLogChkBx->setEnabled(true); +} + +unsigned int CLogsListPage::RefreshList() +{ + ClearTable(); + + bool ShowZT1Items = (mShowZT1ItemsChkBx->checkState() == Qt::Checked); + bool ShowZT2Items = (mShowZT2ItemsChkBx->checkState() == Qt::Checked); + bool ShowNoDetections = (mShowNoDetectionsChkBx->checkState() == Qt::Checked); + + bool ShowPPDetections = (mShowPPChkBx->checkState() == Qt::Checked); + bool ShowPGDetections = (mShowPGChkBx->checkState() == Qt::Checked); + bool ShowCountDetections = (mShowCountChkBx->checkState() == Qt::Checked); + bool ShowFNDetections = (mShowFNChkBx->checkState() == Qt::Checked); + bool ShowMRTrains = (mShowMRChkBx->checkState() == Qt::Checked); + bool ShowMPM10Trains = (mShowMPM10ChkBx->checkState() == Qt::Checked); + bool ShowProblematicTrains = (mShowProblematicTrainsChkbx->checkState() == Qt::Checked); + + + mLogsTable->setRowCount(mLogMgrHandle->GetLogsCount()); + + if(mLogMgrHandle->GetLogsCount() == 0) + return RET_OK; + + int CurRow = 0; + + QList *LogsList = mLogMgrHandle->GetLogsList(); + for(unsigned int i = 0; i < mLogMgrHandle->GetLogsCount(); i++) + { + if(LogsList->at(i)->mZTLogType == ZT1_LOG_TYPE && ShowZT1Items == true) + { + CZT1LogElement *ZT1LogElement = (CZT1LogElement*)LogsList->at(i); + QString stationtext = mStationsFilterComboBox->currentText(); + if((ZT1LogElement->mStationName == mStationsFilterComboBox->currentText() || mStationsFilterComboBox->currentText() == "Toutes") && + ((ShowMPM10Trains == true) || (ShowMPM10Trains == false && ZT1LogElement->mTrainType != TRAIN_TYPE_MPM10)) && + ((ShowMRTrains == true) || (ShowMRTrains == false && ZT1LogElement->mTrainType != TRAIN_TYPE_MR63_MR73)) && + (ShowProblematicTrains == true || (ShowProblematicTrains == false && ZT1LogElement->mFlags.mIsProblematicPassage != 1))) + { + + int NbDetections = ZT1LogElement->mZTDetections.size(); + if(ShowNoDetections == true && NbDetections == 0) + { + QTableWidgetItem * NewItem = new QTableWidgetItem(ZT1LogElement->mPassageDateTime.toString("yyyy/MM/dd - hh:mm:ss")); + NewItem->setData(Qt::UserRole,QVariant(i)); + NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + mLogsTable->setItem(CurRow,0,NewItem); + + NewItem = new QTableWidgetItem(ZT1LogElement->mStationName); + NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + mLogsTable->setItem(CurRow,1,NewItem); + + NewItem = new QTableWidgetItem(QString().sprintf("%d",NbDetections)); + NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + mLogsTable->setItem(CurRow,2,NewItem); + + NewItem = new QTableWidgetItem(QString().sprintf("ZT1")); + NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + mLogsTable->setItem(CurRow,3,NewItem); + + CurRow++; + } + else if(ShowNoDetections == false && NbDetections == 0) + { + } + else + { + bool FilterItem = true; + + for(int trig = 0; trig < NbDetections; trig++) + { + quint32 DetectionID = ZT1LogElement->mZTDetections.at(trig)->mDetectionID; + + if((ShowCountDetections == true && DetectionID == DETECTION_MAGNETIC_SENSOR_COUNT) || + (ShowFNDetections == true && DetectionID == DETECTION_FN_DETECTION) || + (ShowPGDetections == true && DetectionID == DETECTION_PG_DETECTION) || + (ShowPPDetections == true && (DetectionID == DETECTION_PPI_DETECTION || DetectionID == DETECTION_PPE_DETECTION)) || + (DetectionID == DETECTION_PEQ1_DETECTION) || + (DetectionID == DETECTION_PEQ2_DETECTION)) + { + FilterItem = false; + break; + } + + } + + if(FilterItem == false) + { + QTableWidgetItem * NewItem = new QTableWidgetItem(ZT1LogElement->mPassageDateTime.toString("yyyy/MM/dd - hh:mm:ss")); + NewItem->setData(Qt::UserRole,QVariant(i)); + NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + mLogsTable->setItem(CurRow,0,NewItem); + + NewItem = new QTableWidgetItem(ZT1LogElement->mStationName); + NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + mLogsTable->setItem(CurRow,1,NewItem); + + NewItem = new QTableWidgetItem(QString().sprintf("%d",NbDetections)); + NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + mLogsTable->setItem(CurRow,2,NewItem); + + NewItem = new QTableWidgetItem(QString().sprintf("ZT1")); + NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + mLogsTable->setItem(CurRow,3,NewItem); + + CurRow++; + } + } + } + } + else if(LogsList->at(i)->mZTLogType == ZT2_LOG_TYPE && ShowZT2Items == true) + { + CZT2LogElement *ZT2LogElement = (CZT2LogElement*)LogsList->at(i); + + if((ZT2LogElement->mStationName == mStationsFilterComboBox->currentText() || mStationsFilterComboBox->currentText() == "Toutes") && + (ShowProblematicTrains == true || (ShowProblematicTrains == false && ZT2LogElement->mFlags.mIsProblematicPassage != 1))) + { + int NbDetections = ZT2LogElement->mZTDetections.size(); + if(ShowNoDetections == true && NbDetections == 0) + { + QTableWidgetItem * NewItem = new QTableWidgetItem(ZT2LogElement->mPassageDateTime.toString("yyyy/MM/dd - hh:mm:ss")); + NewItem->setData(Qt::UserRole,QVariant(i)); + NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + mLogsTable->setItem(CurRow,0,NewItem); + + NewItem = new QTableWidgetItem(ZT2LogElement->mStationName); + NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + mLogsTable->setItem(CurRow,1,NewItem); + + NewItem = new QTableWidgetItem(QString().sprintf("%d",ZT2LogElement->mZTDetections.size())); + NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + mLogsTable->setItem(CurRow,2,NewItem); + + NewItem = new QTableWidgetItem(QString().sprintf("ZT2")); + NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + mLogsTable->setItem(CurRow,3,NewItem); + + CurRow++; + } + else if(ShowNoDetections == false && NbDetections == 0) + { + } + else + { + bool FilterItem = true; + + for(int trig = 0; trig < NbDetections; trig++) + { + quint32 DetectionID = ZT2LogElement->mZTDetections.at(trig)->mDetectionID; + + if((ShowCountDetections == true && DetectionID == DETECTION_ZT2_MAGNETIC_SENCOR_COUNT) || + (ShowPPDetections == true && (DetectionID == DETECTION_ZT2_PPI_DETECTION || DetectionID == DETECTION_ZT2_PPE_DETECTION))) + { + FilterItem = false; + break; + } + } + + if(FilterItem == false) + { + QTableWidgetItem * NewItem = new QTableWidgetItem(ZT2LogElement->mPassageDateTime.toString("yyyy/MM/dd - hh:mm:ss")); + NewItem->setData(Qt::UserRole,QVariant(i)); + NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + mLogsTable->setItem(CurRow,0,NewItem); + + NewItem = new QTableWidgetItem(ZT2LogElement->mStationName); + NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + mLogsTable->setItem(CurRow,1,NewItem); + + NewItem = new QTableWidgetItem(QString().sprintf("%d",ZT2LogElement->mZTDetections.size())); + NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + mLogsTable->setItem(CurRow,2,NewItem); + + NewItem = new QTableWidgetItem(QString().sprintf("ZT2")); + NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + mLogsTable->setItem(CurRow,3,NewItem); + + CurRow++; + } + } + } + } + } + + mLogsTable->setRowCount(CurRow); + + mLogsTable->setColumnWidth(0,150); + mLogsTable->setColumnWidth(1,100); + mLogsTable->setColumnWidth(2,50); + mLogsTable->setColumnWidth(3,50); + + mLogsTable->sortItems(0,Qt::DescendingOrder); + + mLogsTable->setCurrentCell(0,0); + LogsTableCellClicked(0,0); + + + return RET_OK; + +} + +void CLogsListPage::ClearTable() +{ + for(int Col = 0; Col < mLogsTable->columnCount(); Col++) + { + for(int Row = 0; Row < mLogsTable->rowCount(); Row++) + { + delete mLogsTable->item(Row,Col); + //mLogsTable->item(Row,Col) = 0; + } + } + mLogsTable->setRowCount(0); + mLogsTable->clearContents(); + +} + +void CLogsListPage::LogsTableCellSelected( int row, int col, int prevrow, int prevcol) +{ + Q_UNUSED(prevrow) + Q_UNUSED(prevcol) + + + if(row < 0 || col < 0) + return; + + LogsTableCellClicked(row,col); +} + +void CLogsListPage::LogsTableCellClicked(int row, int column) +{ + Q_UNUSED(column); + + int rowcount = mLogsTable->rowCount(); + if(rowcount == 0) + return; + +// qDebug("Selection : %d",row); + QList *LogsList = mLogMgrHandle->GetLogsList(); + + float MeanSpeed = 0.0; + QString Summary; + + if(mLogsTable->item(row,0) == 0) + return; + + int ItemIndex = mLogsTable->item(row,0)->data(Qt::UserRole).toInt(); + //if(LogsList->at(row)->mZTLogType == ZT1_LOG_TYPE) + if(LogsList->at(ItemIndex)->mZTLogType == ZT1_LOG_TYPE) + { +// //CZT1LogElement *ZT1LogElement = (CZT1LogElement*) LogsList->at(row); + CZT1LogElement *ZT1LogElement = (CZT1LogElement*) LogsList->at(ItemIndex); + + if(ZT1LogElement->mFileProtected == true) + { + mProtectLogChkBx->setCheckState(Qt::Checked); + } + else + { + mProtectLogChkBx->setCheckState(Qt::Unchecked); + } + + QString Problem = "N/A"; + if(ZT1LogElement->mFlags.mIsProblematicPassage == 1) + { + Problem = "OUI"; + } + else if(ZT1LogElement->mFlags.mIsProblematicPassage == 0) + { + Problem = "NON"; + } + MeanSpeed = ZT1LogElement->mMeanSpeed; + Summary.sprintf("Passage:\n\nDate: %s\nHeure: %s\nZone Test : ZT1\nTrain : %s\nNombre d'éléments: %d\nProblématique: %s\n\n\nDéclenchements: \n", + ZT1LogElement->mPassageDateTime.toString("yyyy/MM/dd").toAscii().data(), + ZT1LogElement->mPassageDateTime.toString("hh:mm:ss").toAscii().data(), + CZTData::GetTrainTypeString(ZT1LogElement->mTrainType), + ZT1LogElement->mNbElements, + Problem.toAscii().data()); + + if(ZT1LogElement->mZTDetections.size() > 0) + { + for(int i = 0; i < ZT1LogElement->mZTDetections.size(); i++) + { + QString temp; + if(ZT1LogElement->mZTDetections.at(i)->mDetectionID == DETECTION_FN_DETECTION) + { + temp.sprintf("%s au bogie %d\n",CZTData::GetErrorString(ZT1LogElement->mZTDetections.at(i)->mDetectionID),ZT1LogElement->mZTDetections.at(i)->mRank); + } + else + { + temp.sprintf("%s au rang %d\n",CZTData::GetErrorString(ZT1LogElement->mZTDetections.at(i)->mDetectionID),ZT1LogElement->mZTDetections.at(i)->mRank); + } + Summary += temp; + if(i >= MAX_DETECTION_LIST_NBR - 1) + { + temp = " - Autres déclenchements non affichés -"; + Summary += temp; + break; + } + } + } + else + Summary += "Aucun déclenchement"; + } + //else if(LogsList->at(row)->mZTLogType == ZT2_LOG_TYPE) + else if(LogsList->at(ItemIndex)->mZTLogType == ZT2_LOG_TYPE) + { + //CZT2LogElement *ZT2LogElement = (CZT2LogElement*) LogsList->at(row); + CZT2LogElement *ZT2LogElement = (CZT2LogElement*) LogsList->at(ItemIndex); + + if(ZT2LogElement->mFileProtected == true) + { + mProtectLogChkBx->setCheckState(Qt::Checked); + } + else + { + mProtectLogChkBx->setCheckState(Qt::Unchecked); + } + + QString Problem = "N/A"; + if(ZT2LogElement->mFlags.mIsProblematicPassage == 1) + { + Problem = "OUI"; + } + else if(ZT2LogElement->mFlags.mIsProblematicPassage == 0) + { + Problem = "NON"; + } + Summary.sprintf("Statistiques du passage:\n\nDate: %s\nHeure: %s\nZone Test: ZT2\nNombre d'éléments: %d\nProblématique: %s\n\n\n\nDéclenchements: \n", + ZT2LogElement->mPassageDateTime.toString("yyyy/MM/dd").toAscii().data(), + ZT2LogElement->mPassageDateTime.toString("hh:mm:ss").toAscii().data(), + ZT2LogElement->mNbElements, + Problem.toAscii().data()); + + if(ZT2LogElement->mZTDetections.size() > 0) + { + for(int i = 0; i < ZT2LogElement->mZTDetections.size(); i++) + { + QString temp; + temp.sprintf("%s au rang %d\n",CZTData::GetErrorString(ZT2LogElement->mZTDetections.at(i)->mDetectionID),ZT2LogElement->mZTDetections.at(i)->mRank); + Summary += temp; + if(i >= MAX_DETECTION_LIST_NBR-1) + { + temp = "- Autres déclenchements non affichés -"; + Summary += temp; + break; + } + } + } + else + Summary += "Aucun déclenchement"; + + } + mSummaryText->setPlainText(Summary); + + CLogElement* Element = mLogMgrHandle->LoadLogData(LogsList->at(ItemIndex)); + mProgramHandle->LogViewRequest(Element,this); + mLogMgrHandle->FreeLogData(Element); + +} + +void CLogsListPage::StationFilterSelected(int Index) +{ + Q_UNUSED(Index); + RefreshList(); +} + +void CLogsListPage::ViewZTLogBtnClicked(CPushButton *btn) +{ + if(mLogsTable->rowCount() == 0) + return; + + int cursel = mLogsTable->selectedItems().at(0)->data(Qt::UserRole).toInt(); + CLogElement* Element = mLogMgrHandle->GetLogsList()->at(cursel); + QString FilePath; + QDateTime PassageDateTime; + + if(Element->mZTLogType == ZT1_LOG_TYPE) + { + CZT1LogElement* log = (CZT1LogElement*)Element; + FilePath = log->mLogFileName; + PassageDateTime = log->mPassageDateTime; + } + else + { + CZT2LogElement* log = (CZT2LogElement*)Element; + FilePath = log->mLogFileName; + PassageDateTime = log->mPassageDateTime; + } + + QFileInfo FileDir(FilePath); + QString ZTLogFilePath = FileDir.absolutePath(); + ZTLogFilePath += "/ZTLog.txt"; + + int line =0; + QFile *LogFile = new QFile(ZTLogFilePath); + if(LogFile) + { + if(LogFile->open(QIODevice::ReadOnly | QIODevice::Text | QIODevice::Unbuffered) == true) + { + QString LogText(LogFile->readAll()); + + //Try to find the line corresponding to the selected train passage in the log + QDateTime DateTimeLine1,DateTimeLine2; + + QTextStream strm(&LogText); + strm.seek(0); + + bool finished = false; + QString temp; + do + { + temp = strm.readLine(); + line++; + + if(strm.atEnd()) + break; + } + while(temp.length() < 10); + + QStringList parts = temp.split(" : "); + QString LineText,DateString; + LineText.clear(); + + if(PassageDateTime > DateTimeLine1) + { + if(parts.size() != 0) + { + DateString = parts.at(0); + DateTimeLine1 = QDateTime::fromString(DateString,"yyyy/MM/dd - hh:mm:ss.zzz"); + while(!finished) + { + temp = strm.readLine(); + line++; + if(temp.length() > 10) + { + parts = temp.split(" : "); + if(parts.size() != 0) + { + DateString = parts.at(0); + DateTimeLine2 = QDateTime::fromString(DateString,"yyyy/MM/dd - hh:mm:ss.zzz"); + + if(PassageDateTime >= DateTimeLine1 && PassageDateTime <= DateTimeLine2) + { + LineText = parts.at(0); + finished = true; + } + } + + } + else + { + if(strm.atEnd()) + finished = true; + } + DateTimeLine1 = DateTimeLine2; + } + } + } + + mProgramHandle->ShowZTLogRequest(LogText,LineText); + LogFile->close(); + } + delete LogFile; + } +} + +void CLogsListPage::SaveCSVLogBtnClicked(CPushButton *) +{ + if(mLogsTable->rowCount() == 0) + return; + + QString Filename; + int cursel = mLogsTable->selectedItems().at(0)->data(Qt::UserRole).toInt(); + CLogElement* Element = mLogMgrHandle->GetLogsList()->at(cursel); + mLogMgrHandle->LoadLogData(Element); + if(Element->mZTLogType == ZT1_LOG_TYPE) + { + CZT1LogElement *temp = (CZT1LogElement*)Element; + QString dummy; + dummy = temp->mLogFileName;//.replace("bin","csv"); + Filename = dummy.replace("bin","csv"); + + QString CSVFileName = QFileDialog::getSaveFileName(0,"Exporter .csv",Filename,tr("CSV (*.csv)")); + + CTrainLogFileMgr::instance()->SaveCSVFile(CSVFileName,&temp->mZTLogData,&temp->mFlags,&temp->mZTDetections,temp->mStationName); + } + else + { + CZT2LogElement *temp = (CZT2LogElement*)Element; + QString dummy; + dummy = temp->mLogFileName; + Filename = dummy.replace("bin","csv"); + + QString CSVFileName = QFileDialog::getSaveFileName(0,"Exporter .csv",Filename,tr("CSV (*.csv)")); + + CTrainLogFileMgr::instance()->SaveCSVFile(CSVFileName,&temp->mZTLogData,&temp->mZTDetections,temp->mStationName); + } + mLogMgrHandle->FreeLogData(Element); +} +void CLogsListPage::DeleteSelectedLog(CPushButton *) +{ + if(mLogsTable->rowCount() == 0) + return; + + int SelRow = mLogsTable->selectedItems().at(0)->row(); + int SelCol = mLogsTable->selectedItems().at(0)->column(); + + mLogMgrHandle->DeleteLog(mLogsTable->selectedItems().at(0)->data(Qt::UserRole).toInt()); + RefreshList(); + + mLogsTable->setCurrentCell(SelRow,SelCol); +} + +//Grab the mouse if the user clicks outside buttons +void CLogsListPage::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ +// qDebug("CLogsListPage"); + Q_UNUSED(event) +} +void CLogsListPage::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + Q_UNUSED(event) +} +void CLogsListPage::CheckBoxClicked(int state) +{ + Q_UNUSED(state) + RefreshList(); +} + +void CLogsListPage::ProtectLogCheckBoxClicked() +{ + int state = mProtectLogChkBx->checkState(); + int cursel = mLogsTable->selectedItems().at(0)->data(Qt::UserRole).toInt(); + CLogElement* Element = mLogMgrHandle->GetLogsList()->at(cursel); + + if(state == Qt::Checked) + { + if(mProgramHandle->SetLogProtection(true,Element,this) == RET_ERROR) + { + mProtectLogChkBx->setCheckState(Qt::Unchecked); + } + } + else + { + if(mProgramHandle->SetLogProtection(false,Element,this) == RET_ERROR) + { + mProtectLogChkBx->setCheckState(Qt::Checked); + } + } +} + +void CLogsListPage::TableDoubleClicked(int row, int col) +{ + Q_UNUSED(col) + Q_UNUSED(row) + // ButtonClicked(mViewLogDataButton); +} diff --git a/sources/GuiElements/LogsListPage.h b/sources/GuiElements/LogsListPage.h new file mode 100644 index 0000000..8f311a1 --- /dev/null +++ b/sources/GuiElements/LogsListPage.h @@ -0,0 +1,104 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Description du fichier si nécessaire. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20131024 JFM + Verision d'origine. + +### YYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + + +#ifndef LOGSLISTPAGE_H +#define LOGSLISTPAGE_H + +#include "GlobalDefine.h" +#include +#include "Guipage.h" +#include +#include "PushButton.h" +#include "TextButtonWidget.h" +#include "LogMgr.h" +#include +#include +#include + +#define MAX_DETECTION_LIST_NBR 6 + +class COutilZT; + +class CLogsListPage : public CGuiPage +{ +Q_OBJECT +public: + virtual ~CLogsListPage(); + CLogsListPage(QGraphicsWidget *Parent = 0); + + + COutilZT *mProgramHandle; + CLogMgr *mLogMgrHandle; + + unsigned int RefreshList(); + void EnableEngineeringMode(); + + virtual void resizeEvent(QGraphicsSceneResizeEvent *event); + virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); + virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); + +private: + + QTableWidget *mLogsTable; + QGraphicsTextItem *mSummaryText; + CTextButtonWidget *mViewLogDataButton; + CTextButtonWidget *mExportCSVLogButton; + + QCheckBox *mShowZT1ItemsChkBx, *mShowZT2ItemsChkBx, *mShowNoDetectionsChkBx; + QCheckBox *mShowFNChkBx, *mShowCountChkBx, *mShowPGChkBx, *mShowPPChkBx,*mShowMPM10ChkBx, *mShowMRChkBx, *mShowProblematicTrainsChkbx;//, *mShowAllChkBx; + + QTimer *mListParsingTimer; + QComboBox *mStationsFilterComboBox; + + QString mStationFilter; + + CPushButton *mViewZTLogBtn, *mSaveCSVLogBtn,*mDeleteFileButton; + QCheckBox *mProtectLogChkBx; + + //bool mShowZT1Items,mShowZT2Items,mShowNoDetections,mUSBDetected; + + void ClearTable(); + + + +public slots: + void ButtonClicked(CTextButtonWidget *); + void LogsTableCellClicked(int, int); + void LogsTableCellSelected(int,int,int,int); + void CheckBoxClicked(int); + void TableDoubleClicked(int,int); + void StationFilterSelected(int); + void ViewZTLogBtnClicked(CPushButton *); + void SaveCSVLogBtnClicked(CPushButton *); + void DeleteSelectedLog(CPushButton*); + void ProtectLogCheckBoxClicked(); +// void ParsingTimerExipred(); + +}; + +#endif // LOGSLISTPAGE_H diff --git a/sources/GuiElements/MainPage.cpp b/sources/GuiElements/MainPage.cpp new file mode 100644 index 0000000..f06c709 --- /dev/null +++ b/sources/GuiElements/MainPage.cpp @@ -0,0 +1,133 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Page principale de la ZT. C'est sur cette dernière que tout est affiché. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20121221 JFM + Verision d'origine. + +### YYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + + +#include "MainPage.h" +#include +#include "GlobalDefine.h" +#include +#include +#include "OutilZT.h" +#include +//#include "Version.h" + +CMainPage::CMainPage(QGraphicsWidget *Parent) +{ + setGeometry(0,0,SCREEN_RES_WIDTH,SCREEN_RES_HEIGHT); + + mProgramHandle = 0; + +// QGraphicsTextItem *SoftVersion = new QGraphicsTextItem(this); +// QFont TextFont; +// TextFont.setPointSize(15); +// TextFont.setBold(true); +// SoftVersion->setFont(TextFont); +// SoftVersion->setPlainText(QString().sprintf("Version: %s",SOFT_VERSION)); +// SoftVersion->setZValue(1); +// SoftVersion->adjustSize(); +// SoftVersion->setPos(800,2); + +// mTimeDisplayText = new QGraphicsTextItem(this); +// mTimeDisplayText->setPos(400,2); +// mTimeDisplayText->setFont(TextFont); +// mTimeDisplayText->setZValue(1); + + mDatabaseModePushButton = new CPushButton(this,"./Images/Save-icon.png"); + mDatabaseModePushButton->setPos(10,10); + mDatabaseModePushButton->resize(50,50); + connect( mDatabaseModePushButton, SIGNAL( clicked(CPushButton*) ), this, SLOT(ButtonPressed(CPushButton*) ) ); + + mNetworkModePushButton = new CPushButton(this,"./Images/ethernet.png"); + mNetworkModePushButton->setPos(10,150); + mNetworkModePushButton->resize(50,50); + connect( mNetworkModePushButton, SIGNAL( clicked(CPushButton*) ), this, SLOT(ButtonPressed(CPushButton*) ) ); + mNetworkModePushButton->hide(); + + mZTLogsListPushButton = new CPushButton(this,"./Images/log.png"); + mZTLogsListPushButton->setPos(10,80); + mZTLogsListPushButton->resize(50,50); + connect( mZTLogsListPushButton, SIGNAL( clicked(CPushButton*) ), this, SLOT(ButtonPressed(CPushButton*) ) ); + + mToolsPushButton = new CPushButton(this,"./Images/tools.png"); + mToolsPushButton->setPos(10,375); + mToolsPushButton->resize(50,50); + connect( mToolsPushButton, SIGNAL( clicked(CPushButton*) ), this, SLOT(ButtonPressed(CPushButton*) ) ); + + mDatabaseOptionsPushButton = new CPushButton(this,"./Images/database.png"); + mDatabaseOptionsPushButton->setPos(10,300); + mDatabaseOptionsPushButton->resize(50,50); + connect( mDatabaseOptionsPushButton, SIGNAL( clicked(CPushButton*) ), this, SLOT(ButtonPressed(CPushButton*) ) ); + + + + + + +// CPushButton *LogsPushButton = new CPushButton(this,"./Images/Save-icon.png"); +// LogsPushButton->setPos(70,700); +// LogsPushButton->resize(65,65); +// connect( LogsPushButton, SIGNAL( clicked(CPushButton*) ), this, SLOT(LogsButtonPressed()) ); + + +// mTimeDisplayTimer = new QTimer(); +// connect(mTimeDisplayTimer,SIGNAL(timeout()),this,SLOT(UpdateTime())); +// mTimeDisplayTimer->setSingleShot(false); +// mTimeDisplayTimer->start(1000); + +} + +void CMainPage::ButtonPressed(CPushButton *Btn) +{ + if(Btn == mToolsPushButton) + { + mProgramHandle->ShowOptionsRequest(); + } + else if(Btn == mNetworkModePushButton) + { + mProgramHandle->EnterNetworkModeRequest(); + } + else if(Btn == mDatabaseModePushButton) + { + mProgramHandle->EnterDatabaseModeRequest(); + } + else if(Btn == mDatabaseOptionsPushButton) + { + mProgramHandle->ShowDatabaseMgrRequest(); + } + else if(Btn == mZTLogsListPushButton) + { + mProgramHandle->EnterZTLogModeRequest(); + } +} + + +void CMainPage::UpdateTime() +{ +// QDateTime time = QDateTime::currentDateTime(); +// mTimeDisplayText->setPlainText(time.toString("yyyy/MM/dd hh:mm:ss")); + +} diff --git a/sources/GuiElements/MainPage.h b/sources/GuiElements/MainPage.h new file mode 100644 index 0000000..ab3fa9c --- /dev/null +++ b/sources/GuiElements/MainPage.h @@ -0,0 +1,77 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Description du fichier si nécessaire. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20121221 JFM + Verision d'origine. + +### YYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + + +#ifndef MAINPAGE_H +#define MAINPAGE_H + + +#include "GlobalDefine.h" +#include +#include "Guipage.h" +#include +#include "PushButton.h" +#include + + +class COutilZT; +class CEvent; + +class CMainPage : public CGuiPage +{ +Q_OBJECT +public: + CMainPage(QGraphicsWidget *Parent = 0); + CPushButton *mToolsPushButton; + CPushButton *mNetworkModePushButton; + CPushButton *mDatabaseModePushButton; + CPushButton *mDatabaseOptionsPushButton; + CPushButton *mZTLogsListPushButton; + QGraphicsTextItem *mTimeDisplayText; + QTimer *mTimeDisplayTimer; + + + COutilZT *mProgramHandle; + + + + + +private: + + + + +public slots: + void UpdateTime(); + void ButtonPressed(CPushButton*); + + + +}; + +#endif // MAINPAGE_H diff --git a/sources/GuiElements/NetworkCtrlPage.cpp b/sources/GuiElements/NetworkCtrlPage.cpp new file mode 100644 index 0000000..e3ba9e0 --- /dev/null +++ b/sources/GuiElements/NetworkCtrlPage.cpp @@ -0,0 +1,216 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Page affichant la liste des passages de train. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20131021 JFM + Verision d'origine. + +### YYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + + +#include "NetworkCtrlPage.h" +#include +#include "OutilZT.h" +#include +#include +#include + + + + +CNetworkCtrlPage::~CNetworkCtrlPage() +{ + delete mRadioButtonsGroup; +} + +CNetworkCtrlPage::CNetworkCtrlPage(QGraphicsWidget *Parent) +{ + QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); + setParentItem(Parent); + mProgramHandle = 0; + mIsConnecting = false; + + mNetworkConnectButton = new CToggleTextButtonWidget("Déconnecter"," Connecter ",QPixmap("./Images/red_cross.png"),QPixmap("./Images/green_check.png"),25,125); + mNetworkConnectButton->setParentItem(this); +// mNetworkConnectButton->setPos(10,350); + mNetworkConnectButton->setPos(10,25); + connect(mNetworkConnectButton,SIGNAL(ToggleBtnActivate(CToggleTextButtonWidget*)),this,SLOT(ConnectButtonPressed())); + connect(mNetworkConnectButton,SIGNAL(ToggleBtnDeActivate(CToggleTextButtonWidget*)),this,SLOT(ConnectButtonReleased())); + + mZTStatusRefreshButton = new CTextButtonWidget("Rafraîchir"); + mZTStatusRefreshButton->setParentItem(this); + mZTStatusRefreshButton->setPos(180,75); + connect(mZTStatusRefreshButton,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*))); + + mZTLogDownloadButton = new CTextButtonWidget("Voir ZTLog"); + mZTLogDownloadButton->setParentItem(this); + mZTLogDownloadButton->setPos(50,75); + connect(mZTLogDownloadButton,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*))); + + mTrainLogsDownloadButton = new CTextButtonWidget("Téléch. Passages"); + mTrainLogsDownloadButton->setParentItem(this); + mTrainLogsDownloadButton->setPos(50,125); + connect(mTrainLogsDownloadButton,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*))); + + mRadioButtonsGroup = new QButtonGroup(); + mViewRemoteControlRadioBtn = new QRadioButton("Voir contrôle"); + QGraphicsProxyWidget *RadioButtonsProxyWidget = new QGraphicsProxyWidget(this); + RadioButtonsProxyWidget->setWidget(mViewRemoteControlRadioBtn); + RadioButtonsProxyWidget->setPos(180,0); + RadioButtonsProxyWidget->resize(150,15); + connect(mViewRemoteControlRadioBtn,SIGNAL(toggled(bool)),this,SLOT(RemoteViewRadioButtonToggled(bool))); + mViewRemoteTrainLogsRadioBtn = new QRadioButton("Voir passages"); + RadioButtonsProxyWidget = new QGraphicsProxyWidget(this); + RadioButtonsProxyWidget->setWidget(mViewRemoteTrainLogsRadioBtn); + RadioButtonsProxyWidget->setPos(180,20); + RadioButtonsProxyWidget->resize(150,15); + connect(mViewRemoteTrainLogsRadioBtn,SIGNAL(toggled(bool)),this,SLOT(RemoteViewRadioButtonToggled(bool))); + mViewRemoteLiveZtRadioBtn = new QRadioButton("Voir temps réel"); + RadioButtonsProxyWidget = new QGraphicsProxyWidget(this); + RadioButtonsProxyWidget->setWidget(mViewRemoteLiveZtRadioBtn); + RadioButtonsProxyWidget->setPos(180,40); + RadioButtonsProxyWidget->resize(150,15); + connect(mViewRemoteLiveZtRadioBtn,SIGNAL(toggled(bool)),this,SLOT(RemoteViewRadioButtonToggled(bool))); + mViewRemoteTrainLogsRadioBtn->setChecked(true); + mRadioButtonsGroup->addButton(mViewRemoteControlRadioBtn); + mRadioButtonsGroup->addButton(mViewRemoteTrainLogsRadioBtn); + mRadioButtonsGroup->addButton(mViewRemoteLiveZtRadioBtn); + + + mTxRxWidget = new CTxRxWidget(); + mTxRxWidget->setParentItem(this); + mTxRxWidget->setPos(180,100); +} + +void CNetworkCtrlPage::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + Q_UNUSED(event) +// mBackgroundRect->setRect(boundingRect()); +} + +void CNetworkCtrlPage::ButtonClicked(CTextButtonWidget *BtnPtr) +{ + if(BtnPtr == mZTStatusRefreshButton) + { + mProgramHandle->RefreshRemoteZTStatusRequest(); + } + else if(BtnPtr == mZTLogDownloadButton) + { + mProgramHandle->DownloadZTLogRequest(); + } + else if(BtnPtr == mTrainLogsDownloadButton) + { + mProgramHandle->DownloadTrainLogsRequest(); + } +} + +void CNetworkCtrlPage::ConnectButtonPressed() +{ + mNetworkConnectButton->ForceDeactivation(); + mNetworkConnectButton->OverrideText("Annuler..."); + + if(mIsConnecting == false) + { + if(mProgramHandle->ConnectToZTRequest() == RET_OK) + { + mIsConnecting = true; + } + } + else + { + mProgramHandle->DisconnectZTRequest(); + mIsConnecting = false; + } + +} + +void CNetworkCtrlPage::ConnectButtonReleased() +{ + mProgramHandle->DisconnectZTRequest(); + +} + +void CNetworkCtrlPage::NetworkZTConnected(int ID) +{ + mNetworkConnectButton->ForceActivation(); + mIsConnecting = false; +} +void CNetworkCtrlPage::NetworkZTConnectionFailed(int ID) +{ + mNetworkConnectButton->ForceDeactivation(); + mIsConnecting = false; +} + +void CNetworkCtrlPage::NetworkRx() +{ + mTxRxWidget->Receive(); +} + +void CNetworkCtrlPage::NetworkTx() +{ + mTxRxWidget->Transmit(); +} + +void CNetworkCtrlPage::DisableNetworkButtons() +{ + mZTStatusRefreshButton->DisableButton(); + mZTLogDownloadButton->DisableButton(); + mTrainLogsDownloadButton->DisableButton(); +} + +void CNetworkCtrlPage::EnableNetworkButtons() +{ + mZTStatusRefreshButton->EnableButton(); + mZTLogDownloadButton->EnableButton(); + mTrainLogsDownloadButton->EnableButton(); +} + +void CNetworkCtrlPage::RemoteViewRadioButtonToggled(bool state) +{ + + if(mViewRemoteControlRadioBtn->isChecked()) + { + if(mProgramHandle != 0) + mProgramHandle->ShowRemoteControlPage(); + } + else if(mViewRemoteTrainLogsRadioBtn->isChecked()) + { + if(mProgramHandle != 0) + mProgramHandle->ShowRemoteTrainLogsViewPages(); + } + else if(mViewRemoteLiveZtRadioBtn->isChecked()) + { + if(mProgramHandle != 0) + mProgramHandle->ShowRemoteLiveZTPage(); + + } +} + +//Grab the mouse if the user clicks outside buttons +void CNetworkCtrlPage::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + qDebug("CNetworkCtrlPage"); + Q_UNUSED(event) +} +void CNetworkCtrlPage::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + Q_UNUSED(event) +} diff --git a/sources/GuiElements/NetworkCtrlPage.h b/sources/GuiElements/NetworkCtrlPage.h new file mode 100644 index 0000000..f4371ea --- /dev/null +++ b/sources/GuiElements/NetworkCtrlPage.h @@ -0,0 +1,87 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Description du fichier si nécessaire. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20131024 JFM + Verision d'origine. + +### YYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + + +#ifndef NETWORKCTRLPAGE_H +#define NETWORKCTRLPAGE_H + +#include "GlobalDefine.h" +#include +#include "Guipage.h" +#include +#include "ToggleTextButtonWidget.h" +#include "TextButtonWidget.h" +#include "TxRxWidget.h" +#include +#include + +class COutilZT; + +class CNetworkCtrlPage : public CGuiPage +{ +Q_OBJECT +public: + virtual ~CNetworkCtrlPage(); + CNetworkCtrlPage(QGraphicsWidget *Parent = 0); + + + COutilZT *mProgramHandle; + + virtual void resizeEvent(QGraphicsSceneResizeEvent *event); + virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); + virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); + + void DisableNetworkButtons(); + void EnableNetworkButtons(); + +private: + CToggleTextButtonWidget *mNetworkConnectButton; + CTextButtonWidget *mZTStatusRefreshButton; + CTxRxWidget *mTxRxWidget; + CTextButtonWidget *mZTLogDownloadButton; + CTextButtonWidget *mTrainLogsDownloadButton; + QRadioButton *mViewRemoteTrainLogsRadioBtn, *mViewRemoteControlRadioBtn, *mViewRemoteLiveZtRadioBtn; + QButtonGroup *mRadioButtonsGroup; + + bool mIsConnecting; + + +public slots: + void ButtonClicked(CTextButtonWidget *); + void ConnectButtonPressed(); + void ConnectButtonReleased(); + void NetworkZTConnected(int); + void NetworkZTConnectionFailed(int); + void NetworkTx(); + void NetworkRx(); + void RemoteViewRadioButtonToggled(bool); + +// void ParsingTimerExipred(); + +}; + +#endif // NETWORKCTRLPAGE_H diff --git a/sources/GuiElements/NetworkZTListPage.cpp b/sources/GuiElements/NetworkZTListPage.cpp new file mode 100644 index 0000000..2188682 --- /dev/null +++ b/sources/GuiElements/NetworkZTListPage.cpp @@ -0,0 +1,490 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Page affichant la liste des passages de train. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20131021 JFM + Verision d'origine. + +### YYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + + +#include "NetworkZTListPage.h" +#include +#include "OutilZT.h" +#include +#include +#include +#include +#include + + +CNetworkZTListPage::~CNetworkZTListPage() +{ + ClearTable(); +} + +CNetworkZTListPage::CNetworkZTListPage(QGraphicsWidget *Parent) +{ + QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); + setParentItem(Parent); + mProgramHandle = 0; + + + mZTListTable = new QTableWidget(0,3); + QGraphicsProxyWidget *TableProxy = new QGraphicsProxyWidget(this); + TableProxy->setWidget(mZTListTable); + TableProxy->setPos(3,20); + TableProxy->resize(320,300); + TableProxy->setZValue(3); + mZTListTable->resize(320,300); + mZTListTable->horizontalHeader()->setStretchLastSection(true); + mZTListTable->setSelectionBehavior(QAbstractItemView::SelectRows); + mZTListTable->setSelectionMode(QAbstractItemView::SingleSelection); + mZTListTable->clearContents(); + mZTListTable->setRowCount(NB_ZT_ID); + mZTListTable->setHorizontalHeaderLabels(QStringList() << "Zone Test" << "Addr. IP" << "Connection"); +// connect(mLogsTable,SIGNAL(cellClicked(int,int)),this,SLOT(LogsTableCellClicked(int,int))); + connect(mZTListTable,SIGNAL(currentCellChanged(int,int,int,int)),this,SLOT(ZTListTableCellSelected(int,int,int,int))); + connect(mZTListTable,SIGNAL(cellDoubleClicked(int,int)),SLOT(TableDoubleClicked(int,int))); + + + for(int i = 0; i < NB_ZT_ID; i++) + { + QTableWidgetItem * NewItem = new QTableWidgetItem(COutilZT::GetStationName(i)); + NewItem->setData(Qt::UserRole,QVariant(i)); + NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + mZTListTable->setItem(i,0,NewItem); + NewItem = new QTableWidgetItem("192.168.100.100"); + NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + mZTListTable->setItem(i,1,NewItem); + NewItem = new QTableWidgetItem("Inconnu"); + NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + mZTListTable->setItem(i,2,NewItem); + } + + mZTListTable->resizeColumnsToContents(); + + mZTListTable->setCurrentCell(0,0); +} + + + +void CNetworkZTListPage::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + Q_UNUSED(event) +// mBackgroundRect->setRect(boundingRect()); +} + +void CNetworkZTListPage::ButtonClicked(CTextButtonWidget *BtnPtr) +{ + +} + +unsigned int CNetworkZTListPage::RefreshList() +{ + +// ClearTable(); + +// bool ShowZT1Items = (mShowZT1ItemsChkBx->checkState() == Qt::Checked); +// bool ShowZT2Items = (mShowZT2ItemsChkBx->checkState() == Qt::Checked); +// bool ShowNoDetections = (mShowNoDetectionsChkBx->checkState() == Qt::Checked); + +// bool ShowPPDetections = (mShowPPChkBx->checkState() == Qt::Checked); +// bool ShowPGDetections = (mShowPGChkBx->checkState() == Qt::Checked); +// bool ShowCountDetections = (mShowCountChkBx->checkState() == Qt::Checked); +// bool ShowFNDetections = (mShowFNChkBx->checkState() == Qt::Checked); + + +// mLogsTable->setRowCount(mLogMgrHandle->GetLogsCount()); + +// if(mLogMgrHandle->GetLogsCount() == 0) +// return RET_OK; + +// int CurRow = 0; + +// QList *LogsList = mLogMgrHandle->GetLogsList(); +// for(unsigned int i = 0; i < mLogMgrHandle->GetLogsCount(); i++) +// { +// if(LogsList->at(i)->mZTLogType == ZT1_LOG_TYPE && ShowZT1Items == true) +// { +// CZT1LogElement *ZT1LogElement = (CZT1LogElement*)LogsList->at(i); +// QString stationtext = mStationsFilterComboBox->currentText(); +// if(ZT1LogElement->mStationName == mStationsFilterComboBox->currentText() || mStationsFilterComboBox->currentText() == "Toutes") +// { +// int NbDetections = ZT1LogElement->mZTDetections.size(); +// if(ShowNoDetections == true && NbDetections == 0) +// { +// QTableWidgetItem * NewItem = new QTableWidgetItem(ZT1LogElement->mPassageDateTime.toString("yyyy/MM/dd - hh:mm:ss")); +// NewItem->setData(Qt::UserRole,QVariant(i)); +// NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); +// mLogsTable->setItem(CurRow,0,NewItem); + +// NewItem = new QTableWidgetItem(ZT1LogElement->mStationName); +// NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); +// mLogsTable->setItem(CurRow,1,NewItem); + +// NewItem = new QTableWidgetItem(QString().sprintf("%d",NbDetections)); +// NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); +// mLogsTable->setItem(CurRow,2,NewItem); + +// NewItem = new QTableWidgetItem(QString().sprintf("ZT1")); +// NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); +// mLogsTable->setItem(CurRow,3,NewItem); + +// CurRow++; +// } +// else if(ShowNoDetections == false && NbDetections == 0) +// { +// } +// else +// { +// bool FilterItem = true; + +// for(int trig = 0; trig < NbDetections; trig++) +// { +// quint32 DetectionID = ZT1LogElement->mZTDetections.at(trig)->mDetectionID; + +// if((ShowCountDetections == true && DetectionID == DETECTION_MAGNETIC_SENSOR_COUNT) || +// (ShowFNDetections == true && DetectionID == DETECTION_FN_DETECTION) || +// (ShowPGDetections == true && DetectionID == DETECTION_PG_DETECTION) || +// (ShowPPDetections == true && (DetectionID == DETECTION_PPI_DETECTION || DetectionID == DETECTION_PPE_DETECTION))) +// { +// FilterItem = false; +// break; +// } +// } + +// if(FilterItem == false) +// { +// QTableWidgetItem * NewItem = new QTableWidgetItem(ZT1LogElement->mPassageDateTime.toString("yyyy/MM/dd - hh:mm:ss")); +// NewItem->setData(Qt::UserRole,QVariant(i)); +// NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); +// mLogsTable->setItem(CurRow,0,NewItem); + +// NewItem = new QTableWidgetItem(ZT1LogElement->mStationName); +// NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); +// mLogsTable->setItem(CurRow,1,NewItem); + +// NewItem = new QTableWidgetItem(QString().sprintf("%d",NbDetections)); +// NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); +// mLogsTable->setItem(CurRow,2,NewItem); + +// NewItem = new QTableWidgetItem(QString().sprintf("ZT1")); +// NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); +// mLogsTable->setItem(CurRow,3,NewItem); + +// CurRow++; +// } +// } +// } + + + +// } +// else if(LogsList->at(i)->mZTLogType == ZT2_LOG_TYPE && ShowZT2Items == true) +// { +// CZT2LogElement *ZT2LogElement = (CZT2LogElement*)LogsList->at(i); + +// if(ZT2LogElement->mStationName == mStationsFilterComboBox->currentText() || mStationsFilterComboBox->currentText() == "Toutes") +// { +// int NbDetections = ZT2LogElement->mZTDetections.size(); +// if(ShowNoDetections == true && NbDetections == 0) +// { +// QTableWidgetItem * NewItem = new QTableWidgetItem(ZT2LogElement->mPassageDateTime.toString("yyyy/MM/dd - hh:mm:ss")); +// NewItem->setData(Qt::UserRole,QVariant(i)); +// NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); +// mLogsTable->setItem(CurRow,0,NewItem); + +// NewItem = new QTableWidgetItem(ZT2LogElement->mStationName); +// NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); +// mLogsTable->setItem(CurRow,1,NewItem); + +// NewItem = new QTableWidgetItem(QString().sprintf("%d",ZT2LogElement->mZTDetections.size())); +// NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); +// mLogsTable->setItem(CurRow,2,NewItem); + +// NewItem = new QTableWidgetItem(QString().sprintf("ZT2")); +// NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); +// mLogsTable->setItem(CurRow,32,NewItem); + +// CurRow++; +// } +// else if(ShowNoDetections == false && NbDetections == 0) +// { +// } +// else +// { +// bool FilterItem = true; + +// for(int trig = 0; trig < NbDetections; trig++) +// { +// quint32 DetectionID = ZT2LogElement->mZTDetections.at(trig)->mDetectionID; + +// if((ShowCountDetections == true && DetectionID == DETECTION_ZT2_MAGNETIC_SENCOR_COUNT) || +// (ShowPPDetections == true && (DetectionID == DETECTION_ZT2_PPI_DETECTION || DetectionID == DETECTION_ZT2_PPE_DETECTION))) +// { +// FilterItem = false; +// break; +// } +// } + +// if(FilterItem == false) +// { +// QTableWidgetItem * NewItem = new QTableWidgetItem(ZT2LogElement->mPassageDateTime.toString("yyyy/MM/dd - hh:mm:ss")); +// NewItem->setData(Qt::UserRole,QVariant(i)); +// NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); +// mLogsTable->setItem(CurRow,0,NewItem); + +// NewItem = new QTableWidgetItem(ZT2LogElement->mStationName); +// NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); +// mLogsTable->setItem(CurRow,1,NewItem); + +// NewItem = new QTableWidgetItem(QString().sprintf("%d",ZT2LogElement->mZTDetections.size())); +// NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); +// mLogsTable->setItem(CurRow,2,NewItem); + +// NewItem = new QTableWidgetItem(QString().sprintf("ZT2")); +// NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); +// mLogsTable->setItem(CurRow,32,NewItem); + +// CurRow++; +// } +// } +// } +// } +// } + +// mLogsTable->setRowCount(CurRow); + +// mLogsTable->setColumnWidth(0,150); +// mLogsTable->setColumnWidth(1,75); +// mLogsTable->setColumnWidth(2,50); +// mLogsTable->setColumnWidth(3,50); + +// mLogsTable->sortItems(0,Qt::DescendingOrder); + +// mLogsTable->setCurrentCell(0,0); +// LogsTableCellClicked(0,0); + + + return RET_OK; + +} + +void CNetworkZTListPage::ClearTable() +{ + for(int Col = 0; Col < mZTListTable->columnCount(); Col++) + { + for(int Row = 0; Row < mZTListTable->rowCount(); Row++) + { + delete mZTListTable->item(Row,Col); + } + } + mZTListTable->setRowCount(0); + mZTListTable->clearContents(); + +} +unsigned int CNetworkZTListPage::SetConfig(CSettingsData *SettingsData) +{ + if(SettingsData->mNetworkCfgList.size() != NB_ZT_ID) + return RET_ERROR; + + for(int i = 0; i < NB_ZT_ID; i++) + { + mZTListTable->item(i,1)->setText(SettingsData->mNetworkCfgList.at(i).mIPAdress); + } + + return RET_OK; +} + +void CNetworkZTListPage::ZTListTableCellSelected( int row, int col, int prevrow, int prevcol) +{ + Q_UNUSED(prevrow) + Q_UNUSED(prevcol) + + +// if(row < 0 || col < 0) +// return; + +// LogsTableCellClicked(row,col); +} + +int CNetworkZTListPage::GetSelectedZT() +{ + return mZTListTable->selectedItems().at(0)->data(Qt::UserRole).toInt(); +} + +void CNetworkZTListPage::ZTListTableCellClicked(int row, int column) +{ + Q_UNUSED(column); + +// int rowcount = mLogsTable->rowCount(); +// if(rowcount == 0) +// return; + +//// qDebug("Selection : %d",row); +// QList *LogsList = mLogMgrHandle->GetLogsList(); + +// float MeanSpeed = 0.0; +// QString Summary; + +// if(mLogsTable->item(row,0) == 0) +// return; + +// int ItemIndex = mLogsTable->item(row,0)->data(Qt::UserRole).toInt(); +// //if(LogsList->at(row)->mZTLogType == ZT1_LOG_TYPE) +// if(LogsList->at(ItemIndex)->mZTLogType == ZT1_LOG_TYPE) +// { +//// //CZT1LogElement *ZT1LogElement = (CZT1LogElement*) LogsList->at(row); +// CZT1LogElement *ZT1LogElement = (CZT1LogElement*) LogsList->at(ItemIndex); + +// MeanSpeed = ZT1LogElement->mMeanSpeed; +// Summary.sprintf("Passage:\n\nDate: %s\nHeure: %s\nZone Test : ZT1\nTrain : %s\nNombre d'éléments: %d\n\n\nDéclenchements: \n", +// ZT1LogElement->mPassageDateTime.toString("yyyy/MM/dd").toAscii().data(), +// ZT1LogElement->mPassageDateTime.toString("hh:mm:ss").toAscii().data(), +// CZTData::GetTrainTypeString(ZT1LogElement->mTrainType), +// ZT1LogElement->mNbElements); + +// if(ZT1LogElement->mZTDetections.size() > 0) +// { +// for(int i = 0; i < ZT1LogElement->mZTDetections.size(); i++) +// { +// QString temp; +// if(ZT1LogElement->mZTDetections.at(i)->mDetectionID == DETECTION_FN_DETECTION) +// { +// temp.sprintf("%s au bogie %d\n",CZTData::GetErrorString(ZT1LogElement->mZTDetections.at(i)->mDetectionID),ZT1LogElement->mZTDetections.at(i)->mRank); +// } +// else +// { +// temp.sprintf("%s au rang %d\n",CZTData::GetErrorString(ZT1LogElement->mZTDetections.at(i)->mDetectionID),ZT1LogElement->mZTDetections.at(i)->mRank); +// } +// Summary += temp; +// if(i >= MAX_DETECTION_LIST_NBR - 1) +// { +// temp = " - Autres déclenchements non affichés -"; +// Summary += temp; +// break; +// } +// } +// } +// else +// Summary += "Aucun déclenchement"; +// } +// //else if(LogsList->at(row)->mZTLogType == ZT2_LOG_TYPE) +// else if(LogsList->at(ItemIndex)->mZTLogType == ZT2_LOG_TYPE) +// { +// //CZT2LogElement *ZT2LogElement = (CZT2LogElement*) LogsList->at(row); +// CZT2LogElement *ZT2LogElement = (CZT2LogElement*) LogsList->at(ItemIndex); + +// Summary.sprintf("Statistiques du passage:\n\nDate: %s\nHeure: %s\nZone Test: ZT2\nNombre d'éléments: %d\n\n\nDéclenchements: \n", +// ZT2LogElement->mPassageDateTime.toString("yyyy/MM/dd").toAscii().data(), +// ZT2LogElement->mPassageDateTime.toString("hh:mm:ss").toAscii().data(), +// ZT2LogElement->mNbElements); + + // if(ZT2LogElement->mZTDetections.size() > 0) + // { + // for(int i = 0; i < ZT2LogElement->mZTDetections.size(); i++) + // { + // QString temp; + // temp.sprintf("%s au rang %d\n",CZTData::GetErrorString(ZT2LogElement->mZTDetections.at(i)->mDetectionID),ZT2LogElement->mZTDetections.at(i)->mRank); + // Summary += temp; + // if(i >= MAX_DETECTION_LIST_NBR-1) + // { + // temp = "- Autres déclenchements non affichés -"; + // Summary += temp; + // break; + // } + // } + // } + // else + // Summary += "Aucun déclenchement"; + + // } + // mSummaryText->setPlainText(Summary); + +} + + +//Grab the mouse if the user clicks outside buttons +void CNetworkZTListPage::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ +// qDebug("CNetworkZTListPage"); + Q_UNUSED(event) +} +void CNetworkZTListPage::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + Q_UNUSED(event) +} + +void CNetworkZTListPage::TableDoubleClicked(int row, int col) +{ + Q_UNUSED(col) + Q_UNUSED(row) + // ButtonClicked(mViewLogDataButton); +} + +void CNetworkZTListPage::ZTNetworkStatusChanged(int ZTID,int Status) +{ + if(ZTID >= NB_ZT_ID) + return; + +// qDebug() << "ZT Network status changed. ID: " << ZTID << "Status : " << Status; + + QString ZTStatus; + QColor Color; + switch(Status) + { + case CNetworkManager::ZT_NETWORK_OFFLINE_STATUS: + { + ZTStatus = "Hors Ligne"; + Color = Qt::red; + break; + } + case CNetworkManager::ZT_NETWORK_ONLINE_STATUS: + { + ZTStatus = "En Ligne"; + Color = Qt::darkGreen; + break; + } + case CNetworkManager::ZT_NETWORK_SEARCHING_STATUS: + { + ZTStatus = "Recherche..."; + Color = Qt::black; + break; + } + case CNetworkManager::ZT_NETWORK_UNKNOWN_STATUS: + { + ZTStatus = "Inconnu"; + Color = Qt::black; + break; + } + case CNetworkManager::ZT_NETWORK_CONNECTED_STATUS: + { + ZTStatus = "Connecté"; + Color = Qt::darkBlue; + break; + } + } + + mZTListTable->item(ZTID,2)->setText(ZTStatus); + mZTListTable->item(ZTID,2)->setForeground(QBrush(Color)); + +} diff --git a/sources/GuiElements/NetworkZTListPage.h b/sources/GuiElements/NetworkZTListPage.h new file mode 100644 index 0000000..d029c5f --- /dev/null +++ b/sources/GuiElements/NetworkZTListPage.h @@ -0,0 +1,85 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Description du fichier si nécessaire. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20131024 JFM + Verision d'origine. + +### YYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + + +#ifndef NETWORKZTLISTPAGE_H +#define NETWORKZTLISTPAGE_H + +#include "GlobalDefine.h" +#include +#include "Guipage.h" +#include +#include "PushButton.h" +#include "TextButtonWidget.h" +#include +#include +#include +#include "ZTData.h" + + +class COutilZT; + +class CNetworkZTListPage : public CGuiPage +{ +Q_OBJECT +public: + virtual ~CNetworkZTListPage(); + CNetworkZTListPage(QGraphicsWidget *Parent = 0); + + + COutilZT *mProgramHandle; + + unsigned int RefreshList(); + unsigned int SetConfig(CSettingsData *SettingsData); + int GetSelectedZT(); + + virtual void resizeEvent(QGraphicsSceneResizeEvent *event); + virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); + virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); + + + +private: + + QTableWidget *mZTListTable; + + void ClearTable(); + + + +public slots: + void ButtonClicked(CTextButtonWidget *); + void ZTListTableCellClicked(int, int); + void ZTListTableCellSelected(int,int,int,int); + void TableDoubleClicked(int,int); + void ZTNetworkStatusChanged(int,int); + +// void ParsingTimerExipred(); + +}; + +#endif // NETWORKZTLISTPAGE_H diff --git a/sources/GuiElements/OptionsPage.cpp b/sources/GuiElements/OptionsPage.cpp new file mode 100644 index 0000000..618fff5 --- /dev/null +++ b/sources/GuiElements/OptionsPage.cpp @@ -0,0 +1,211 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Page de sélection des options (sélection des fonctions de détection, ingénierie, + mode entretien, etc.). + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20131021 JFM + Verision d'origine. + +### YYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + + +#include "OptionsPage.h" +#include +#include "GlobalDefine.h" +#include +#include +#include "OutilZT.h" +#include +#include +#include +#include +#include "OutilZT.h" +#include +#include "OutilZTVersion.h" + + +COptionsPage::~COptionsPage() +{ +} + +COptionsPage::COptionsPage(QGraphicsWidget *Parent) +{ + Q_UNUSED(Parent) + + mProgramHandle = 0; + mSettings = 0; + + + + mBackgroundRect = new QGraphicsRectItem(boundingRect(), this); + QBrush BackgroundBrush(QColor(245, 245, 255)); + mBackgroundRect->setBrush(BackgroundBrush); + + QGraphicsTextItem *Title = new QGraphicsTextItem("Options",this); + QFont font; + font.setPointSize(18); + Title->setFont(font); + Title->setPos(250,10); + + QGraphicsTextItem *SoftVersion = new QGraphicsTextItem(this); + font.setPointSize(14); + SoftVersion->setFont(font); + QString VersionString = "OutilZT version: "; + VersionString += SOFTWARE_VERSION; + SoftVersion->setPlainText(VersionString); + SoftVersion->setPos(25,210); + + QPixmap *FilePixmap = new QPixmap("./Images/open-file-icon.png"); + mLogDataDirDialogButton = new CTextButtonWidget("Sélectionner",0,50,150,15,FilePixmap); + mLogDataDirDialogButton->setParentItem(this); + mLogDataDirDialogButton->setPos(25,100); + connect(mLogDataDirDialogButton, SIGNAL(TxtButtonClicked(CTextButtonWidget*)), this, SLOT(ButtonClicked(CTextButtonWidget*))); + mLogDataDirDialogButton->hide(); + + mCancelButton = new CTextButtonWidget("Fermer"); + mCancelButton->setParentItem(this); + mCancelButton->setPos(50,310); + connect(mCancelButton,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*))); + + font.setPointSize(12); + mLogsPathText = new QGraphicsTextItem(this); + mLogsPathText->setPlainText("Répertoire de données: "); + mLogsPathText->setFont(font); + mLogsPathText->setPos(25,65); + + QGraphicsTextItem *StationName; + QLineEdit *StationIP; + QGraphicsProxyWidget *Proxy; + int xpos = 375; + int ypos = 150; + for(int i = 0; i < NB_ZT_ID; i++) + { + StationName = new QGraphicsTextItem(this); + StationName->setFont(font); + StationName->setPlainText(COutilZT::GetStationName(i)); + StationName->adjustSize(); + + StationName->setPos(xpos-StationName->boundingRect().width(), ypos + (i*30)); + + StationIP = new QLineEdit("100.100.100.100"); + Proxy = new QGraphicsProxyWidget(this); + Proxy->setWidget(StationIP); + // StationIP->setInputMask("000.000.000.000;"); + Proxy->setPos(xpos+10,ypos +(i*30)+3); + StationIP->resize(100,20); + StationIP->setEnabled(false); + + mIpAddressList.append(StationIP); + } + + mApplyNetworkSettingsBtn = new CTextButtonWidget("Appliquer"); + mApplyNetworkSettingsBtn->setParentItem(this); + mApplyNetworkSettingsBtn->setPos(50,260); + connect(mApplyNetworkSettingsBtn,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*))); + + + +} + +void COptionsPage::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + Q_UNUSED(event) + mBackgroundRect->setRect(boundingRect()); +} + +void COptionsPage::ButtonClicked(CTextButtonWidget *BtnPtr) +{ + if(BtnPtr == mCancelButton) + { + hide(); + } + else if(BtnPtr == mLogDataDirDialogButton) + { + QString DataFilePath; + DataFilePath.clear(); + QFileDialog FileDlg; + FileDlg.setFileMode(QFileDialog::DirectoryOnly); +// DataFilePath = FileDlg.getOpenFileName(0,"Répertoire de données",QString(),QString(),0,QFileDialog::ShowDirsOnly); + DataFilePath = FileDlg.getExistingDirectory(0,"Répertoire de données"); + + if(DataFilePath.isEmpty()) + return; + + qDebug("open file %s",DataFilePath.toAscii().data()); + mProgramHandle->DataSourceDirChanged(DataFilePath); + QString tmp = "Répertoire de données: "; + tmp += mProgramHandle->GetLogDataPath(); + mLogsPathText->setPlainText(tmp); + + } + else if(BtnPtr == mApplyNetworkSettingsBtn) + { + if(mSettings == 0) + return; + for(int i = 0; i < mSettings->mNetworkCfgList.size(); i++) + { + mSettings->mNetworkCfgList[i].mIPAdress = mIpAddressList.at(i)->text(); + } + mProgramHandle->NetworkDataChanged(); + } +} + +void COptionsPage::SetLogsDataPath(QString Path) +{ + mLogsPathText->setPlainText(Path); +} + +unsigned int COptionsPage::SetSettings(CSettingsData *SettingsData) +{ + mSettings = SettingsData; + mLogsPathText->setPlainText(SettingsData->mDataSourceDirectoryPath); + + if(SettingsData->mNetworkCfgList.size() != mIpAddressList.size()) + return RET_ERROR; + + for(int i = 0; i < mIpAddressList.size(); i++) + { + mIpAddressList.at(i)->setText(SettingsData->mNetworkCfgList.at(i).mIPAdress); + } + + return RET_OK; +} + +void COptionsPage::EnableEngineeringMode() +{ + mLogDataDirDialogButton->show(); + + for(int i = 0; i < mIpAddressList.size(); i++) + { + mIpAddressList.at(i)->setEnabled(true); + } +} + +//Grab the mouse if the user clicks outside buttons +void COptionsPage::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ +// qDebug("COptionsPage"); + Q_UNUSED(event) +} +void COptionsPage::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + Q_UNUSED(event) +} diff --git a/sources/GuiElements/OptionsPage.h b/sources/GuiElements/OptionsPage.h new file mode 100644 index 0000000..97cade2 --- /dev/null +++ b/sources/GuiElements/OptionsPage.h @@ -0,0 +1,83 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Description du fichier si nécessaire. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20131021 JFM + Verision d'origine. + +### YYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + + +#ifndef OPTIONSPAGE_H +#define OPTIONSPAGE_H + +#include "GlobalDefine.h" +#include +#include "Guipage.h" +#include +#include "PushButton.h" +#include "TextButtonWidget.h" +#include "ZTData.h" +#include "QLineEdit" + +class COutilZT; + +class COptionsPage : public CGuiPage +{ +Q_OBJECT +public: + COptionsPage(QGraphicsWidget *Parent = 0); + ~COptionsPage(); + CPushButton *mToolsPushButton; + + + COutilZT *mProgramHandle; + + virtual void resizeEvent(QGraphicsSceneResizeEvent *event); + virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); + virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); + + void SetLogsDataPath(QString Path); + + unsigned int SetSettings(CSettingsData *SettingsData); + void EnableEngineeringMode(); + + + +private: + + QGraphicsRectItem *mBackgroundRect; + CTextButtonWidget *mLogDataDirDialogButton; + CTextButtonWidget *mCancelButton; + CTextButtonWidget *mApplyNetworkSettingsBtn; + + QGraphicsTextItem *mLogsPathText; + + QList mIpAddressList; + CSettingsData *mSettings; + + +public slots: + void ButtonClicked(CTextButtonWidget *); + +}; + +#endif // OPTIONSPAGE_H diff --git a/sources/GuiElements/ProgressBarPage.cpp b/sources/GuiElements/ProgressBarPage.cpp new file mode 100644 index 0000000..4b58412 --- /dev/null +++ b/sources/GuiElements/ProgressBarPage.cpp @@ -0,0 +1,118 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Page de sélection des options (sélection des fonctions de détection, ingénierie, + mode entretien, etc.). + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20131021 JFM + Verision d'origine. + +### YYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + + + +#include "ProgressBarPage.h" +#include + + +CProgressBarPage::~CProgressBarPage() +{ +} + +CProgressBarPage::CProgressBarPage(QGraphicsWidget *Parent) +{ + Q_UNUSED(Parent) + resize(400,100); + + mBackgroundRect = new QGraphicsRectItem(boundingRect(), this); + QBrush BackgroundBrush(QColor(245, 245, 255)); + mBackgroundRect->setBrush(BackgroundBrush); + + mTitle = new QGraphicsTextItem("Title",this); + QFont font; + font.setPointSize(15); + mTitle->setFont(font); + mTitle->setPos(10,2); + + font.setPointSize(10); + mMiscLabel = new QGraphicsTextItem(this); + mMiscLabel->setPlainText("MiscLabel"); + mMiscLabel->setFont(font); + mMiscLabel->setPos(10,50); + + mProgressBar = new QProgressBar(); + QGraphicsProxyWidget *proxy = new QGraphicsProxyWidget(this); + proxy->setWidget(mProgressBar); + proxy->setPos(10,30); + mProgressBar->resize(390,20); + + SetProgressBarRange(100); + mProgressBar->setValue(0); +} + +void CProgressBarPage::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + Q_UNUSED(event) +// mBackgroundRect->setRect(boundingRect()); +} + +void CProgressBarPage::SetProgressBarRange(int range) +{ + mProgressBar->setRange(0,range); + Reset(); +} + +void CProgressBarPage::Tick() +{ + mCurValue++; + mProgressBar->setValue(mCurValue); + mProgressBar->update(); +} + +void CProgressBarPage::Reset() +{ + mCurValue = 0; +} + +void CProgressBarPage::SetMiscLabel(QString Label) +{ + mMiscLabel->setPlainText(Label); +} + +void CProgressBarPage::ClearMiscLabel() +{ + mMiscLabel->setPlainText(""); +} + +void CProgressBarPage::SetTitle(QString Title) +{ + mTitle->setPlainText(Title); +} + + +//Grab the mouse if the user clicks outside buttons +void CProgressBarPage::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + Q_UNUSED(event) +} +void CProgressBarPage::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + Q_UNUSED(event) +} diff --git a/sources/GuiElements/ProgressBarPage.h b/sources/GuiElements/ProgressBarPage.h new file mode 100644 index 0000000..6314ba8 --- /dev/null +++ b/sources/GuiElements/ProgressBarPage.h @@ -0,0 +1,78 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Description du fichier si nécessaire. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20131021 JFM + Verision d'origine. + +### YYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + + +#ifndef PROGRESSBARPAGE_H +#define PROGRESSBARPAGE_H + +#include "GlobalDefine.h" +#include +#include "Guipage.h" +#include +#include + + + +//class COutilZT; + +class CProgressBarPage : public CGuiPage +{ +Q_OBJECT +public: + CProgressBarPage(QGraphicsWidget *Parent = 0); + ~CProgressBarPage(); + +// COutilZT *mProgramHandle; + + virtual void resizeEvent(QGraphicsSceneResizeEvent *event); + virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); + virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); + + void SetProgressBarRange(int range); + void Tick(); + void Reset(); + void SetMiscLabel(QString Label); + void ClearMiscLabel(); + void SetTitle(QString Title); + + + +private: + + QGraphicsRectItem *mBackgroundRect; + QGraphicsTextItem *mMiscLabel, *mTitle; + QProgressBar *mProgressBar; + int mCurValue; + + + +public slots: +// void ButtonClicked(CTextButtonWidget *); + +}; + +#endif // PROGRESSBARPAGE_H diff --git a/sources/GuiElements/PushButton.cpp b/sources/GuiElements/PushButton.cpp new file mode 100644 index 0000000..2d29ba3 --- /dev/null +++ b/sources/GuiElements/PushButton.cpp @@ -0,0 +1,258 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2013 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Widget graphique Bouton qui consiste en une image sur laquelle l'on peut + cliquer. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20130204 JFM + Verision d'origine. + +### YYYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + +#include "PushButton.h" +#include +#include +#include +#include +#include +#include +#include + +CPushButton::CPushButton(QGraphicsItem *Parent,QString NormalFileName, bool UseTextOverlay,int ButtonData) +{ + Q_UNUSED(ButtonData) + setParentItem(Parent); + + setAcceptHoverEvents(true); + + m_Normal = new QGraphicsPixmapItem(QPixmap(NormalFileName)); + + ClickTransparency = 1; + + //Inform QGraphicsItem of the geometry + setGeometry(m_Normal->boundingRect()); + + ispressed = false; + isFlashingValid = false; + mDisplayFlashIcon = false; + isreleasing = false; + UseOverlay = UseTextOverlay; + ButtonTextOverlay = ""; + + + timeLine = new QTimeLine(PRESS_EFFECT_FADE_TIMEOUT); + timeLine->setCurveShape(QTimeLine::EaseInCurve); + connect(timeLine, SIGNAL(valueChanged(qreal)), this, SLOT(TimeLine(qreal))); + +} + +CPushButton::~CPushButton() +{ + delete m_Normal; + delete timeLine; +} + +void CPushButton::paint(QPainter *Painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + +// Painter->setCompositionMode(QPainter::CompositionMode_DestinationOver); + /*if(isDown() || isChecked()) + { + m_Normal->paint(Painter,option,widget); + qDebug("Paint Called, button down"); + } + else if(underMouse()) + { + m_Hovered->paint(Painter,option,widget); + qDebug("Paint Called, hovered"); + } + else + { + m_Pressed->paint(Painter,option,widget); + qDebug("Paint Called, normal"); + }*/ + + + if(ispressed) + { + + //QRadialGradient gradient(50, 50, 50, 50, 50); + QRadialGradient gradient(m_Normal->boundingRect().center(),m_Normal->boundingRect().width()/2); + gradient.setColorAt(0, QColor::fromRgbF(1, 1, 1,1)); + gradient.setColorAt(1, QColor::fromRgbF(1, 1, 1,0)); + + QBrush brush(gradient); + // m_Pressed->paint(Painter,option,widget); + m_Normal->paint(Painter,option,widget); + Painter->setBrush(brush); + Painter->setPen(Qt::NoPen); + //Painter->drawEllipse(m_Normal->boundingRect()); + Painter->drawEllipse(m_Normal->boundingRect()); + + //qDebug("Paint Called, pressed"); + } + /* else if(ishovered) + { + m_Hovered->paint(Painter,option,widget); + // qDebug("Paint Called, hovered"); + }*/ + else + { + if(mDisplayFlashIcon) + { + m_Flashing->paint(Painter,option,widget); + } + else + { + + //draw button icon + m_Normal->paint(Painter,option,widget); + + //draw text overlay + QRectF textRect = m_Normal->boundingRect();//.adjusted(15, 10, -10, -15); + int flags = Qt::AlignHCenter | Qt::AlignVCenter; + + QFont font; + font.setPixelSize(16); + font.setBold(true); + Painter->setPen(Qt::red); + Painter->setFont(font); + Painter->drawText(textRect, flags, ButtonTextOverlay); + + //if necessary, draw halo animation + if(isreleasing) + { + //QRadialGradient gradient(50, 50, 50, 50, 50); + QRadialGradient gradient(m_Normal->boundingRect().center(),m_Normal->boundingRect().width()/2); + gradient.setColorAt(0, QColor::fromRgbF(1, 1, 1,ClickTransparency)); + gradient.setColorAt(1, QColor::fromRgbF(1, 1, 1, 0)); + + QBrush brush(gradient); + // m_Pressed->paint(Painter,option,widget); + m_Normal->paint(Painter,option,widget); + Painter->setBrush(brush); + Painter->setPen(Qt::NoPen); + //Painter->drawEllipse(m_Normal->boundingRect()); + Painter->drawEllipse(m_Normal->boundingRect()); + } + + } + // qDebug("Paint Called, normal"); + } + + +} + +void CPushButton::hoverEnterEvent ( QGraphicsSceneHoverEvent * event ) +{ + event->accept(); + update(); + // qDebug("Hover Enter Called"); +} +void CPushButton::hoverLeaveEvent ( QGraphicsSceneHoverEvent * event ) +{ + event->accept(); + update(); + // qDebug("Hover Leave Called"); +} +void CPushButton::mousePressEvent ( QGraphicsSceneMouseEvent * event ) +{ + Q_UNUSED(event) + // + ispressed = true; + update(); + emit pressed(this); + + + // qDebug("Mouse Press Event"); + //event->ignore(); + +} +void CPushButton::mouseReleaseEvent( QGraphicsSceneMouseEvent * event) +{ + Q_UNUSED(event) + ispressed = false; + + emit released(this); + isreleasing = true; + + timeLine->start(); + // qDebug("Button Mouse Release Event"); + +} + +void CPushButton::StartFlashing() +{ + mFlashTimer->start(mFlashTimeout); +} +void CPushButton::StopFlashing() +{ + mFlashTimer->stop(); + mDisplayFlashIcon = false; +} +void CPushButton::setFlashingData(QString FlashFileName,int FlashDelay) +{ + QPixmap temp(FlashFileName); + QBitmap temp2 = temp.createMaskFromColor(QColor(255,255,255),Qt::MaskOutColor); +// temp.setMask(temp2); + m_Flashing = new QGraphicsPixmapItem(temp); + if(!m_Flashing) + { + isFlashingValid = false; + return; + } + isFlashingValid = true; + mFlashTimeout = FlashDelay; + mFlashTimer = new QTimer(this); + connect(mFlashTimer,SIGNAL(timeout()),this,SLOT(FlashButton())); + +} +void CPushButton::FlashButton() +{ + mDisplayFlashIcon = !mDisplayFlashIcon; + update(); +} + +void CPushButton::TimeLine(qreal value) +{ + ClickTransparency = 1-value; + + update(); + + if(value == 1) + { + isreleasing = false; + emit clicked(this); + } + + +} + +void CPushButton::SetTextOverlay(QString Text) +{ + ButtonTextOverlay = Text.left(MAX_OVERLAY_TEXT_LENGTH); + update(); +} + +void CPushButton::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + m_Normal->setPixmap(m_Normal->pixmap().scaled(event->newSize().width(),event->newSize().height())); + this->resize(event->newSize().width(),event->newSize().height()); +} diff --git a/sources/GuiElements/PushButton.h b/sources/GuiElements/PushButton.h new file mode 100644 index 0000000..6aa1310 --- /dev/null +++ b/sources/GuiElements/PushButton.h @@ -0,0 +1,77 @@ +#ifndef PUSHBUTTON_H +#define PUSHBUTTON_H + +//#include +#include +#include +#include +class QGraphicsPixmapItem; +#include +#include + +class QTimer; + +#define PRESS_EFFECT_FADE_TIMEOUT 200 +#define MAX_OVERLAY_TEXT_LENGTH 3 + +class CPushButton : public QGraphicsWidget +{ + Q_OBJECT +public: + CPushButton(QGraphicsItem *Parent, QString NormalFileName,bool UseTextOverlay = false, int ButtonData = 0); + virtual ~CPushButton(); + + void setFlashingData(QString FlashingFileName,int FlashingDelay); + void StartFlashing(void); + void StopFlashing(void); + void SetTextOverlay(QString Text); + void SetButtonData(unsigned long int ButtonData){mButtonData = ButtonData;} + unsigned long int GetBUttonData(){return mButtonData;} + + + void paint( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0 ); + // QRectF boundingRect() const; + + bool ispressed; + bool isreleasing; + bool isFlashingValid; + bool mDisplayFlashIcon; + bool UseOverlay; + QTimer *mFlashTimer; + int mFlashTimeout; + QString ButtonTextOverlay; + unsigned long int mButtonData; + + protected: + //virtual void paintEvent(QPaintEvent *e); + virtual void hoverEnterEvent ( QGraphicsSceneHoverEvent * event ); + virtual void hoverLeaveEvent ( QGraphicsSceneHoverEvent * event ); + virtual void mousePressEvent ( QGraphicsSceneMouseEvent * event ); + virtual void mouseReleaseEvent( QGraphicsSceneMouseEvent * event); + virtual void resizeEvent(QGraphicsSceneResizeEvent *event); + + private: + QTimeLine *timeLine; + qreal ClickTransparency; + + signals: + void clicked(CPushButton *ButtonPtr); + void pressed(CPushButton *ButtonPtr); + void released(CPushButton *ButtonPtr); + + public slots: + void FlashButton(); + void TimeLine(qreal value); + + private: + QGraphicsPixmapItem *m_Normal; + QGraphicsPixmapItem *m_Pressed; + QGraphicsPixmapItem *m_Hovered; + QGraphicsPixmapItem *m_Flashing; + + + + +}; + +#endif // PUSHBUTTON_H diff --git a/sources/GuiElements/RankRulerWidget.cpp b/sources/GuiElements/RankRulerWidget.cpp new file mode 100644 index 0000000..6121ab9 --- /dev/null +++ b/sources/GuiElements/RankRulerWidget.cpp @@ -0,0 +1,293 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 - 2013 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Élément graphique qui affiche une règle qui indique le décompte des rangs + du train dans le temps. Ce qui permet de savoir à quel rang un événement + est survenu lors de la consultation d'un passage de train. + + +*/ + +/* ************************************************************************** */ +/* Revision: +### YYYMMDD JFM + Verision d'origine. + +### YYYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + +#include "RankRulerWidget.h" +#include +#include +#include + +CRankRulerWidget::~CRankRulerWidget() +{ + delete mRulerPixmap; +} + +CRankRulerWidget::CRankRulerWidget(qreal RulerPixelWidth, QGraphicsItem *Parent) +{ + setParentItem(Parent); + mPixelWidth = RulerPixelWidth; + mLabel = new QGraphicsTextItem(this); + + mRulerPixmap = new QPixmap(boundingRect().width(),boundingRect().height()); +// mRulerPixmap->fill(Qt::white); + mRankItems.clear(); + +} + +void CRankRulerWidget::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + Q_UNUSED(event) + + delete mRulerPixmap; + mRulerPixmap = new QPixmap(boundingRect().width(),boundingRect().height()); + Render(); +} + +void CRankRulerWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + Q_UNUSED(widget) + + if(mRankItems.isEmpty()) + return; + + painter->setClipRect(option->exposedRect); + painter->drawPixmap(0,0,*mRulerPixmap); + +// if(mRankItems.isEmpty()) +// return; +// QFont font; +// font.setPixelSize(12); +// painter->setFont(font); +// qreal pitch = mPixelWidth/(mEndTime - mStartTime); //pixel/ns + +// int StartIndex = 0,EndIndex = 0; +// bool StartFound = false; + +// for(int i = 0; i < mRankItems.size(); i++) +// { +// if(StartFound == false) +// { +// if(mStartTime <= mRankItems.at(i).mStartTime) +// { +// StartIndex = i; +// StartFound = true; +// } +// } + +// if(mRankItems.at(i).mEndTime <= mEndTime) +// { +// EndIndex = i; +// } +// } + +// if(StartIndex > 0) +// { +// if(mStartTime < mRankItems.at(StartIndex).mStartTime) +// { +// QRectF LabelRect; +// qreal StartPixel = 0;//mStartTime * pitch; +// qreal EndPixel = (mRankItems.at(StartIndex).mStartTime - mStartTime) * pitch; +// qreal Height = boundingRect().height(); + +// LabelRect.setRect(StartPixel,0,(EndPixel-StartPixel),Height); +// painter->drawLine(StartPixel,0,StartPixel,Height); +// painter->drawLine(EndPixel,0,EndPixel,Height); +// painter->drawText(LabelRect,mRankItems.at(StartIndex-1).mLabel,Qt::AlignHCenter | Qt::AlignVCenter); + +// } +// } + +// for(int i = StartIndex; i <= EndIndex; i++) +// { +// QRectF LabelRect; +// qreal StartPixel = (mRankItems.at(i).mStartTime - mStartTime) * pitch; + +// qreal EndPixel; +// if(mRankItems.at(i).mEndTime > mEndTime) +// EndPixel = (mEndTime - mStartTime) * pitch; +// else +// EndPixel = (mRankItems.at(i).mEndTime - mStartTime) * pitch; + +// qreal Height = boundingRect().height(); + +// LabelRect.setRect(StartPixel,0,(EndPixel-StartPixel),Height); +// painter->drawLine(StartPixel,0,StartPixel,Height); +// painter->drawLine(EndPixel,0,EndPixel,Height); +// painter->drawText(LabelRect,mRankItems.at(i).mLabel,Qt::AlignHCenter | Qt::AlignVCenter); +// } +// if(EndIndex < mRankItems.size()-1) +// { +// if(mEndTime > mRankItems.at(EndIndex).mStartTime) +// { +// QRectF LabelRect; +// qreal StartPixel = (mRankItems.at(EndIndex).mEndTime - mStartTime) * pitch; +// qreal EndPixel = (mEndTime - mStartTime) * pitch; +// qreal Height = boundingRect().height(); + +// LabelRect.setRect(StartPixel,0,(EndPixel-StartPixel),Height); +// painter->drawLine(StartPixel,0,StartPixel,Height); +// painter->drawLine(EndPixel,0,EndPixel,Height); +//// if(EndIndex == StartIndex) +//// painter->drawText(LabelRect,mRankItems.at(EndIndex).mLabel,Qt::AlignHCenter | Qt::AlignVCenter); +//// else +// painter->drawText(LabelRect,mRankItems.at(EndIndex+1).mLabel,Qt::AlignHCenter | Qt::AlignVCenter); + +// } +// } +} + +void CRankRulerWidget::Render() +{ + + if(mRankItems.isEmpty()) + return; + + mRulerPixmap->fill(Qt::white); + QPainter *painter = new QPainter(mRulerPixmap); + + QFont font; + font.setPixelSize(12); + painter->setFont(font); + qreal pitch = mPixelWidth/(mEndTime - mStartTime); //pixel/ns + + + + int StartIndex = 0,EndIndex = 0; + bool StartFound = false; + + for(int i = 0; i < mRankItems.size(); i++) + { + if(StartFound == false) + { + if(mStartTime <= mRankItems.at(i).mStartTime) + { + StartIndex = i; + StartFound = true; + } + } + + if(mRankItems.at(i).mEndTime <= mEndTime) + { + EndIndex = i; + } + } + + if(StartIndex > 0) + { + if(mStartTime < mRankItems.at(StartIndex).mStartTime) + { + QRectF LabelRect; + qreal StartPixel = 0;//mStartTime * pitch; + qreal EndPixel = (mRankItems.at(StartIndex).mStartTime - mStartTime) * pitch; + qreal Height = boundingRect().height(); + + LabelRect.setRect(StartPixel,0,(EndPixel-StartPixel),Height); + painter->drawLine(StartPixel,0,StartPixel,Height); + painter->drawLine(EndPixel,0,EndPixel,Height); + painter->drawText(LabelRect,mRankItems.at(StartIndex-1).mLabel,Qt::AlignHCenter | Qt::AlignVCenter); + + } + } + + for(int i = StartIndex; i <= EndIndex; i++) + { + QRectF LabelRect; + qreal StartPixel = (mRankItems.at(i).mStartTime - mStartTime) * pitch; + + qreal EndPixel; + if(mRankItems.at(i).mEndTime > mEndTime) + EndPixel = (mEndTime - mStartTime) * pitch; + else + EndPixel = (mRankItems.at(i).mEndTime - mStartTime) * pitch; + + qreal Height = boundingRect().height(); + + LabelRect.setRect(StartPixel,0,(EndPixel-StartPixel),Height); + painter->drawLine(StartPixel,0,StartPixel,Height); + painter->drawLine(EndPixel,0,EndPixel,Height); + painter->drawText(LabelRect,mRankItems.at(i).mLabel,Qt::AlignHCenter | Qt::AlignVCenter); + } + if(EndIndex < mRankItems.size()-1) + { + if(mEndTime > mRankItems.at(EndIndex).mStartTime) + { + QRectF LabelRect; + qreal StartPixel = (mRankItems.at(EndIndex).mEndTime - mStartTime) * pitch; + qreal EndPixel = (mEndTime - mStartTime) * pitch; + qreal Height = boundingRect().height(); + + LabelRect.setRect(StartPixel,0,(EndPixel-StartPixel),Height); + painter->drawLine(StartPixel,0,StartPixel,Height); + painter->drawLine(EndPixel,0,EndPixel,Height); +// if(EndIndex == StartIndex) +// painter->drawText(LabelRect,mRankItems.at(EndIndex).mLabel,Qt::AlignHCenter | Qt::AlignVCenter); +// else + painter->drawText(LabelRect,mRankItems.at(EndIndex+1).mLabel,Qt::AlignHCenter | Qt::AlignVCenter); + + } + } + + delete painter; +} + + +unsigned int CRankRulerWidget::SetRange(quint64 StartTime, quint64 EndTime) +{ + if(StartTime > EndTime) + return false; + + if(mRankItems.isEmpty()) + return false; + + + mStartTime = StartTime; + mEndTime = EndTime; + mTimeOffset = mRankItems.first().mStartTime; + + Render(); + + update(); + + return RET_OK; +} + +unsigned int CRankRulerWidget::AddRankItem(QString Rank, quint64 StartTime, quint64 EndTime) +{ + CRankWidgetItem NewItem; + NewItem.mLabel = Rank; + NewItem.mStartTime = StartTime; + NewItem.mEndTime = EndTime; + + mRankItems.append(NewItem); + return RET_OK; +} + +void CRankRulerWidget::SetLabel(QString Label, int Offset) +{ + QFont font; + font.setBold(true); + mLabel->setFont(font); + mLabel->setPlainText(Label); + mLabel->setPos(-Offset,boundingRect().height()/2 - mLabel->boundingRect().height()/2); +} + +void CRankRulerWidget::ClearRuler() +{ + mRankItems.clear(); +} diff --git a/sources/GuiElements/RankRulerWidget.h b/sources/GuiElements/RankRulerWidget.h new file mode 100644 index 0000000..b277c0d --- /dev/null +++ b/sources/GuiElements/RankRulerWidget.h @@ -0,0 +1,74 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 - 2013 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Description du fichier si nécessaire. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20131030 JFM + Verision d'origine. + +### 20131107 Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + +#ifndef RANKRULERWIDGET_H +#define RANKRULERWIDGET_H + +#include "GlobalDefine.h" +#include + +class CRankWidgetItem +{ +public: + QString mLabel; + quint64 mStartTime; + quint64 mEndTime; +}; + +class CRankRulerWidget : public QGraphicsWidget +{ + Q_OBJECT +public: + CRankRulerWidget(qreal RulerPixelWidth,QGraphicsItem *Parent = 0); + ~CRankRulerWidget(); + + + virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); + + unsigned int SetRange(quint64 StartTime, quint64 EndTime); + unsigned int AddRankItem(QString Rank,quint64 StartTime,quint64 EndTime); + void SetLabel(QString Label,int Offset); + void ClearRuler(); + void resizeEvent(QGraphicsSceneResizeEvent *event); + + +private: + qreal mPixelWidth; + quint64 mStartTime, mEndTime, mTimeOffset; + qreal mPixelPitch; + QGraphicsTextItem *mLabel; + + QPixmap *mRulerPixmap; + + QList mRankItems; + + + void Render(); + +}; + +#endif // RANKRULERWIDGET_H diff --git a/sources/GuiElements/RemoteZTCtrlPage.cpp b/sources/GuiElements/RemoteZTCtrlPage.cpp new file mode 100644 index 0000000..9a2f51d --- /dev/null +++ b/sources/GuiElements/RemoteZTCtrlPage.cpp @@ -0,0 +1,395 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Page affichant la liste des passages de train. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20131021 JFM + Verision d'origine. + +### YYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + + +#include "RemoteZTCtrlPage.h" +#include +#include "OutilZT.h" +#include +#include +#include +#include +#include "TCPProtocol.h" + + +CRemoteZTCtrlPage::~CRemoteZTCtrlPage() +{ +// delete mListParsingTimer; +} + +CRemoteZTCtrlPage::CRemoteZTCtrlPage(QGraphicsWidget *Parent) +{ + QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); + setParentItem(Parent); + mProgramHandle = 0; + + + mDeleteLogFile = new CTextButtonWidget("Effacer fichier LOG"); + mDeleteLogFile->setParentItem(this); + mDeleteLogFile->setPos(10,10); + connect(mDeleteLogFile,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*))); + + mSetZTFunctionsBtn = new CTextButtonWidget("Envoyer Config"); + mSetZTFunctionsBtn->setParentItem(this); + mSetZTFunctionsBtn->setPos(10,50); + connect(mSetZTFunctionsBtn,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*))); + + QFont font; + QPointF ArrayTopLeft; + ArrayTopLeft.setX(250); + ArrayTopLeft.setY(100); + qreal XButtonSpacing = 90; + qreal YLineSpacing = 40; + QString ONPixmapFilePath = "./Images/Slider_Green.png"; + QString OFFPixmapFilePath = "./Images/Slider_Red.png"; + QSizeF SlideButtonSize(50,30); + font.setPointSize(12); + + + QGraphicsTextItem *Label = new QGraphicsTextItem("Analyse",this); + Label->setFont(font); + Label->setPos(ArrayTopLeft.x() - 10,ArrayTopLeft.y() - YLineSpacing); + + Label = new QGraphicsTextItem("TK",this); + Label->setFont(font); + Label->setPos(ArrayTopLeft.x() + XButtonSpacing +5 ,ArrayTopLeft.y() - YLineSpacing); + + int i = 0; + Label = new QGraphicsTextItem("Frotteur Négatif:",this); + Label->setFont(font); + Label->setPos(35,ArrayTopLeft.y() + (i*YLineSpacing)); + mFNFuncToggleBtn = new CToggleButtonWidget(ONPixmapFilePath,OFFPixmapFilePath,this); + mFNFuncToggleBtn->resize(SlideButtonSize); + mFNFuncToggleBtn->setPos(ArrayTopLeft.x(),ArrayTopLeft.y() + (i*YLineSpacing)); + mFNTKToggleBtn = new CToggleButtonWidget(ONPixmapFilePath,OFFPixmapFilePath,this); + mFNTKToggleBtn->resize(SlideButtonSize); + mFNTKToggleBtn->setPos(ArrayTopLeft.x() + XButtonSpacing,ArrayTopLeft.y() + (i*YLineSpacing)); + + i++; + Label = new QGraphicsTextItem("Pneu de guidage:",this); + Label->setFont(font); + Label->setPos(35,ArrayTopLeft.y() + (i*YLineSpacing)); + mPGFuncToggleBtn = new CToggleButtonWidget(ONPixmapFilePath,OFFPixmapFilePath,this); + mPGFuncToggleBtn->resize(SlideButtonSize); + mPGFuncToggleBtn->setPos(ArrayTopLeft.x(),ArrayTopLeft.y() + (i*YLineSpacing)); + mPGTKToggleBtn = new CToggleButtonWidget(ONPixmapFilePath,OFFPixmapFilePath,this); + mPGTKToggleBtn->resize(SlideButtonSize); + mPGTKToggleBtn->setPos(ArrayTopLeft.x() + XButtonSpacing,ArrayTopLeft.y() + (i*YLineSpacing)); + + i++; + Label = new QGraphicsTextItem("Pneu porteur:",this); + Label->setFont(font); + Label->setPos(35,ArrayTopLeft.y() + (i*YLineSpacing)); + mPPFuncToggleBtn = new CToggleButtonWidget(ONPixmapFilePath,OFFPixmapFilePath,this); + mPPFuncToggleBtn->resize(SlideButtonSize); + mPPFuncToggleBtn->setPos(ArrayTopLeft.x(),ArrayTopLeft.y() + (i*YLineSpacing)); + mPPTKToggleBtn = new CToggleButtonWidget(ONPixmapFilePath,OFFPixmapFilePath,this); + mPPTKToggleBtn->resize(SlideButtonSize); + mPPTKToggleBtn->setPos(ArrayTopLeft.x() + XButtonSpacing,ArrayTopLeft.y() + (i*YLineSpacing)); + + i++; + Label = new QGraphicsTextItem("Pneu porteur ZT2:",this); + Label->setFont(font); + Label->setPos(35,ArrayTopLeft.y() + (i*YLineSpacing)); + mPP2FuncToggleBtn = new CToggleButtonWidget(ONPixmapFilePath,OFFPixmapFilePath,this); + mPP2FuncToggleBtn->resize(SlideButtonSize); + mPP2FuncToggleBtn->setPos(ArrayTopLeft.x(),ArrayTopLeft.y() + (i*YLineSpacing)); + mPP2TKToggleBtn = new CToggleButtonWidget(ONPixmapFilePath,OFFPixmapFilePath,this); + mPP2TKToggleBtn->resize(SlideButtonSize); + mPP2TKToggleBtn->setPos(ArrayTopLeft.x() + XButtonSpacing,ArrayTopLeft.y() + (i*YLineSpacing)); + + i++; + Label = new QGraphicsTextItem("ZT1:",this); + Label->setFont(font); + Label->setPos(35,ArrayTopLeft.y() + (i*YLineSpacing)); + mZT1FuncToggleBtn = new CToggleButtonWidget(ONPixmapFilePath,OFFPixmapFilePath,this); + mZT1FuncToggleBtn->resize(SlideButtonSize); + mZT1FuncToggleBtn->setPos(ArrayTopLeft.x(),ArrayTopLeft.y() + (i*YLineSpacing)); + connect(mZT1FuncToggleBtn,SIGNAL(ButtonToggled(CToggleButtonWidget*)),this,SLOT(ToggleButtonToggled(CToggleButtonWidget*))); + mZT1TKToggleBtn = new CToggleButtonWidget(ONPixmapFilePath,OFFPixmapFilePath,this); + mZT1TKToggleBtn->resize(SlideButtonSize); + mZT1TKToggleBtn->setPos(ArrayTopLeft.x() + XButtonSpacing,ArrayTopLeft.y() + (i*YLineSpacing)); + connect(mZT1TKToggleBtn,SIGNAL(ButtonToggled(CToggleButtonWidget*)),this,SLOT(ToggleButtonToggled(CToggleButtonWidget*))); + + i++; + Label = new QGraphicsTextItem("ZT2:",this); + Label->setFont(font); + Label->setPos(35,ArrayTopLeft.y() + (i*YLineSpacing)); + mZT2FuncToggleBtn = new CToggleButtonWidget(ONPixmapFilePath,OFFPixmapFilePath,this); + mZT2FuncToggleBtn->resize(SlideButtonSize); + mZT2FuncToggleBtn->setPos(ArrayTopLeft.x(),ArrayTopLeft.y() + (i*YLineSpacing)); + connect(mZT2FuncToggleBtn,SIGNAL(ButtonToggled(CToggleButtonWidget*)),this,SLOT(ToggleButtonToggled(CToggleButtonWidget*))); + mZT2TKToggleBtn = new CToggleButtonWidget(ONPixmapFilePath,OFFPixmapFilePath,this); + mZT2TKToggleBtn->resize(SlideButtonSize); + mZT2TKToggleBtn->setPos(ArrayTopLeft.x() + XButtonSpacing,ArrayTopLeft.y() + (i*YLineSpacing)); + connect(mZT2TKToggleBtn,SIGNAL(ButtonToggled(CToggleButtonWidget*)),this,SLOT(ToggleButtonToggled(CToggleButtonWidget*))); + +} + +void CRemoteZTCtrlPage::ToggleButtonToggled(CToggleButtonWidget *ToggleButton) +{ + + if(ToggleButton == mZT1FuncToggleBtn) + { + if(mZT1FuncToggleBtn->GetButtonState() == TOGGLE_BUTTON_OFF) + { + mFNFuncToggleBtn->SetButtonState(TOGGLE_BUTTON_OFF); + mFNFuncToggleBtn->SetButtonEnabled(false); + mPGFuncToggleBtn->SetButtonState(TOGGLE_BUTTON_OFF); + mPGFuncToggleBtn->SetButtonEnabled(false); + mPPFuncToggleBtn->SetButtonState(TOGGLE_BUTTON_OFF); + mPPFuncToggleBtn->SetButtonEnabled(false); + } + else + { + mFNFuncToggleBtn->SetButtonState(TOGGLE_BUTTON_ON); + mFNFuncToggleBtn->SetButtonEnabled(true); + mPGFuncToggleBtn->SetButtonState(TOGGLE_BUTTON_ON); + mPGFuncToggleBtn->SetButtonEnabled(true); + mPPFuncToggleBtn->SetButtonState(TOGGLE_BUTTON_ON); + mPPFuncToggleBtn->SetButtonEnabled(true); + } + } + if(ToggleButton == mZT1TKToggleBtn) + { + if(mZT1TKToggleBtn->GetButtonState() == TOGGLE_BUTTON_OFF) + { + mFNTKToggleBtn->SetButtonState(TOGGLE_BUTTON_OFF); + mFNTKToggleBtn->SetButtonEnabled(false); + mPGTKToggleBtn->SetButtonState(TOGGLE_BUTTON_OFF); + mPGTKToggleBtn->SetButtonEnabled(false); + mPPTKToggleBtn->SetButtonState(TOGGLE_BUTTON_OFF); + mPPTKToggleBtn->SetButtonEnabled(false); + } + else + { + mFNTKToggleBtn->SetButtonState(TOGGLE_BUTTON_ON); + mFNTKToggleBtn->SetButtonEnabled(true); + mPGTKToggleBtn->SetButtonState(TOGGLE_BUTTON_ON); + mPGTKToggleBtn->SetButtonEnabled(true); + mPPTKToggleBtn->SetButtonState(TOGGLE_BUTTON_ON); + mPPTKToggleBtn->SetButtonEnabled(true); + } + } + + if(ToggleButton == mZT2FuncToggleBtn) + { + if(mZT2FuncToggleBtn->GetButtonState() == TOGGLE_BUTTON_OFF) + { + mPP2FuncToggleBtn->SetButtonEnabled(false); + mPP2FuncToggleBtn->SetButtonState(TOGGLE_BUTTON_OFF); + } + else + { + mPP2FuncToggleBtn->SetButtonEnabled(true); + mPP2FuncToggleBtn->SetButtonState(TOGGLE_BUTTON_ON); + } + } + if(ToggleButton == mZT2TKToggleBtn) + { + if(mZT2TKToggleBtn->GetButtonState() == TOGGLE_BUTTON_OFF) + { + mPP2TKToggleBtn->SetButtonEnabled(false); + mPP2TKToggleBtn->SetButtonState(TOGGLE_BUTTON_OFF); + } + else + { + mPP2TKToggleBtn->SetButtonEnabled(true); + mPP2TKToggleBtn->SetButtonState(TOGGLE_BUTTON_ON); + } + } +} + +void CRemoteZTCtrlPage::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + Q_UNUSED(event) +// mBackgroundRect->setRect(boundingRect()); +} + +void CRemoteZTCtrlPage::ButtonClicked(CTextButtonWidget *BtnPtr) +{ + if(BtnPtr == mDeleteLogFile) + { + mProgramHandle->DeleteRemoteZTLogRequest(); + } + else if(BtnPtr == mSetZTFunctionsBtn) + { + CTCPZTFunctionsStatus FunctionsConfig; + + //update FN flags + if(mFNFuncToggleBtn->GetButtonState() == TOGGLE_BUTTON_ON) + FunctionsConfig.mFNAnalysisActive = true; + else + FunctionsConfig.mFNAnalysisActive = false; + + if(mFNTKToggleBtn->GetButtonState() == TOGGLE_BUTTON_ON) + FunctionsConfig.mFNTKActive = true; + else + FunctionsConfig.mFNTKActive = false; + + //update PG flags + if(mPGFuncToggleBtn->GetButtonState() == TOGGLE_BUTTON_ON) + FunctionsConfig.mPGAnalysisActive = true; + else + FunctionsConfig.mPGAnalysisActive = false; + + if(mPGTKToggleBtn->GetButtonState() == TOGGLE_BUTTON_ON) + FunctionsConfig.mPGTKActive = true; + else + FunctionsConfig.mPGTKActive = false; + + //update PP flags + if(mPPFuncToggleBtn->GetButtonState() == TOGGLE_BUTTON_ON) + FunctionsConfig.mPP1AnalysisActive = true; + else + FunctionsConfig.mPP1AnalysisActive = false; + + if(mPPTKToggleBtn->GetButtonState() == TOGGLE_BUTTON_ON) + FunctionsConfig.mPP1TKActive = true; + else + FunctionsConfig.mPP1TKActive = false; + + //update PP2 flags + if(mPP2FuncToggleBtn->GetButtonState() == TOGGLE_BUTTON_ON) + FunctionsConfig.mPP2AnalysisActive = true; + else + FunctionsConfig.mPP2AnalysisActive = false; + + if(mPP2TKToggleBtn->GetButtonState()) + FunctionsConfig.mPP2TKActive = true; + else + FunctionsConfig.mPP2TKActive = false; + + //update ZT1 flags + if(mZT1FuncToggleBtn->GetButtonState() == TOGGLE_BUTTON_ON) + FunctionsConfig.mZT1AnalysisActive = true; + else + FunctionsConfig.mZT1AnalysisActive = false; + + if(mZT1TKToggleBtn->GetButtonState()) + FunctionsConfig.mZT1TKActive = true; + else + FunctionsConfig.mZT1TKActive = false; + + + //update ZT2 flags + if(mZT2FuncToggleBtn->GetButtonState() == TOGGLE_BUTTON_ON) + FunctionsConfig.mZT2AnalysisActive = true; + else + FunctionsConfig.mZT2AnalysisActive = false; + + if(mZT2TKToggleBtn->GetButtonState()) + FunctionsConfig.mZT2TKActive = true; + else + FunctionsConfig.mZT2TKActive = false; + + mProgramHandle->SetZTFunctionsStatus(FunctionsConfig); + } +} + +void CRemoteZTCtrlPage::UpdateDisplay(const CTCPZTStatus *RemoteZTStatus) +{ + //update FN buttons + if(RemoteZTStatus->mFNAnalysisActive == true) + mFNFuncToggleBtn->SetButtonState(TOGGLE_BUTTON_ON); + else + mFNFuncToggleBtn->SetButtonState(TOGGLE_BUTTON_OFF); + if(RemoteZTStatus->mFNTKActive == true) + mFNTKToggleBtn->SetButtonState(TOGGLE_BUTTON_ON); + else + mFNTKToggleBtn->SetButtonState(TOGGLE_BUTTON_OFF); + + //update PG buttons + if(RemoteZTStatus->mPGAnalysisActive == true) + mPGFuncToggleBtn->SetButtonState(TOGGLE_BUTTON_ON); + else + mPGFuncToggleBtn->SetButtonState(TOGGLE_BUTTON_OFF); + if(RemoteZTStatus->mPGTKActive == true) + mPGTKToggleBtn->SetButtonState(TOGGLE_BUTTON_ON); + else + mPGTKToggleBtn->SetButtonState(TOGGLE_BUTTON_OFF); + + //update PP buttons + if(RemoteZTStatus->mPP1AnalysisActive == true) + mPPFuncToggleBtn->SetButtonState(TOGGLE_BUTTON_ON); + else + mPPFuncToggleBtn->SetButtonState(TOGGLE_BUTTON_OFF); + if(RemoteZTStatus->mPP1TKActive == true) + mPPTKToggleBtn->SetButtonState(TOGGLE_BUTTON_ON); + else + mPPTKToggleBtn->SetButtonState(TOGGLE_BUTTON_OFF); + + //update PP2 buttons + if(RemoteZTStatus->mPP2AnalysisActive == true) + mPP2FuncToggleBtn->SetButtonState(TOGGLE_BUTTON_ON); + else + mPP2FuncToggleBtn->SetButtonState(TOGGLE_BUTTON_OFF); + if(RemoteZTStatus->mPP2TKActive == true) + mPP2TKToggleBtn->SetButtonState(TOGGLE_BUTTON_ON); + else + mPP2TKToggleBtn->SetButtonState(TOGGLE_BUTTON_OFF); + + //update ZT1 buttons + if(RemoteZTStatus->mZT1AnalysisActive == true) + mZT1FuncToggleBtn->SetButtonState(TOGGLE_BUTTON_ON); + else + mZT1FuncToggleBtn->SetButtonState(TOGGLE_BUTTON_OFF); + if(RemoteZTStatus->mZT1TKActive == true) + mZT1TKToggleBtn->SetButtonState(TOGGLE_BUTTON_ON); + else + mZT1TKToggleBtn->SetButtonState(TOGGLE_BUTTON_OFF); + + //update ZT2 buttons + if(RemoteZTStatus->mZT2AnalysisActive == true) + mZT2FuncToggleBtn->SetButtonState(TOGGLE_BUTTON_ON); + else + mZT2FuncToggleBtn->SetButtonState(TOGGLE_BUTTON_OFF); + if(RemoteZTStatus->mZT2TKActive == true) + mZT2TKToggleBtn->SetButtonState(TOGGLE_BUTTON_ON); + else + mZT2TKToggleBtn->SetButtonState(TOGGLE_BUTTON_OFF); +} + +void CRemoteZTCtrlPage::NetworkZTConnected(int ID) +{ + +} +void CRemoteZTCtrlPage::NetworkZTDisconnected(int ID) +{ + +} + +//Grab the mouse if the user clicks outside buttons +void CRemoteZTCtrlPage::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ +// qDebug("CRemoteZTCtrlPage"); + Q_UNUSED(event) +} +void CRemoteZTCtrlPage::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + Q_UNUSED(event) +} diff --git a/sources/GuiElements/RemoteZTCtrlPage.h b/sources/GuiElements/RemoteZTCtrlPage.h new file mode 100644 index 0000000..6838bdb --- /dev/null +++ b/sources/GuiElements/RemoteZTCtrlPage.h @@ -0,0 +1,82 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Description du fichier si nécessaire. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20131024 JFM + Verision d'origine. + +### YYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + + +#ifndef REMOTEZTCTRLPAGE_H +#define REMOTEZTCTRLPAGE_H + +#include "GlobalDefine.h" +#include +#include "Guipage.h" +#include +#include "TextButtonWidget.h" +#include "ToggleButtonWidget.h" + + +class COutilZT; +class CTCPZTStatus; + +class CRemoteZTCtrlPage : public CGuiPage +{ +Q_OBJECT +public: + virtual ~CRemoteZTCtrlPage(); + CRemoteZTCtrlPage(QGraphicsWidget *Parent = 0); + + COutilZT *mProgramHandle; + + CTextButtonWidget *mDeleteLogFile; + CTextButtonWidget *mSetZTFunctionsBtn; + + CToggleButtonWidget *mFNFuncToggleBtn, *mFNTKToggleBtn; + CToggleButtonWidget *mPGFuncToggleBtn, *mPGTKToggleBtn; + CToggleButtonWidget *mPPFuncToggleBtn, *mPPTKToggleBtn; + CToggleButtonWidget *mPP2FuncToggleBtn, *mPP2TKToggleBtn; + CToggleButtonWidget *mZT1FuncToggleBtn, *mZT1TKToggleBtn; + CToggleButtonWidget *mZT2FuncToggleBtn, *mZT2TKToggleBtn; + + void UpdateDisplay(const CTCPZTStatus *RemoteZTStatus); + + virtual void resizeEvent(QGraphicsSceneResizeEvent *event); + virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); + virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); + +private: + + + +public slots: + void ButtonClicked(CTextButtonWidget *); + void NetworkZTConnected(int); + void NetworkZTDisconnected(int); + void ToggleButtonToggled(CToggleButtonWidget *ToggleButton); + +// void ParsingTimerExipred(); + +}; + +#endif // REMOTEZTPAGE_H diff --git a/sources/GuiElements/RemoteZTPage.cpp b/sources/GuiElements/RemoteZTPage.cpp new file mode 100644 index 0000000..27cb3cf --- /dev/null +++ b/sources/GuiElements/RemoteZTPage.cpp @@ -0,0 +1,182 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Page affichant la liste des passages de train. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20131021 JFM + Verision d'origine. + +### YYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + + +#include "RemoteZTPage.h" +#include +#include "OutilZT.h" +#include +#include +#include +#include + + +CRemoteZTPage::~CRemoteZTPage() +{ +// delete mListParsingTimer; +} + +CRemoteZTPage::CRemoteZTPage(QGraphicsWidget *Parent) +{ + QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); + setParentItem(Parent); + mProgramHandle = 0; + + QFont font; + font.setPointSize(20); + font.setBold(true); + mStationName = new QGraphicsTextItem(this); + mStationName->setPlainText("Non connecté"); + mStationName->setFont(font); + mStationName->setPos(20,10); + + font.setPointSize(15); + font.setBold(false); + mRemoteZTStatus = new QGraphicsTextItem(this); + mRemoteZTStatus->setPlainText("Status de la ZT:"); + mRemoteZTStatus->setFont(font); + mRemoteZTStatus->setPos(20,60); + +} + +void CRemoteZTPage::SetRemoteZTName(QString Name) +{ + mStationName->setPlainText(Name); +} + +void CRemoteZTPage::SetRemoteZTStatus(const CTCPZTStatus *status) +{ + // QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); + QString StatString; + QTextStream stream(&StatString,QIODevice::ReadWrite); + StatString.clear(); + stream.seek(0); + stream.setAutoDetectUnicode(true); + + StatString.append("Status de la ZT:\n"); + StatString.append("ZT1: "); + switch(status->mZT1Status) + { + case SB_ZT_ACTIVE_STATUS: + { + StatString.append("ACTIVÉE"); + break; + } + case SB_ZT_INACTIVE_STATUS: + { + StatString.append("DÉSACTIVÉE"); + break; + } + case SB_ZT_NOT_PRESENT_STATUS: + { + StatString.append("ABSENTE (!?)"); + break; + } + case SB_ZT_DISABLED_STATUS: + { + StatString.append("HORS-SERVICE"); + break; + } + } + StatString.append("\n"); + StatString.append("ZT2: "); + switch(status->mZT2Status) + { + case SB_ZT_ACTIVE_STATUS: + { + StatString.append("ACTIVÉE"); + break; + } + case SB_ZT_INACTIVE_STATUS: + { + StatString.append("DÉSACTIVÉE"); + break; + } + case SB_ZT_NOT_PRESENT_STATUS: + { + StatString.append("ABSENTE"); + break; + } + case SB_ZT_DISABLED_STATUS: + { + StatString.append("HORS-SERVICE"); + break; + } + } + StatString.append("\n"); + + StatString.append(QString("Nombre de passages: %1\n").arg(status->mNbPass)); + StatString.append(QString("Nombre de déclenchements: %1\n").arg(status->mNbTrigs)); + StatString.append(QString("Date de démarrage de la ZT: %1\n").arg(status->mZTStartDateTime.toString("yyyy/MM/dd - hh:mm"))); + StatString.append(QString("Date actuelle de la ZT: %1\n").arg(status->mActualDateTime.toString("yyyy/MM/dd - hh:mm"))); + StatString.append(QString("Seuil du pneu de guidage: %1\n").arg(status->mPGTreshold)); + StatString.append(QString( "Mode Maintenance activé: %1\n").arg(status->mModeMaintenanceON)); + StatString.append(QString("Mode calibration activé: %1\n").arg(status->mCalibModeON)); + StatString.append(QString("Clef USB connectée: %1\n").arg(status->mUSBKeyConnected)); + StatString.append(QString("Frotteur négatif: TK=[%1] - Analyse=[%2]\n").arg(status->mFNTKActive).arg(status->mFNAnalysisActive)); + StatString.append(QString("Pneu de guidage: TK=[%1] - Analyse=[%2]\n").arg(status->mPGTKActive).arg(status->mPGAnalysisActive)); + StatString.append(QString("Pneu porteur: TK=[%1] - Analyse=[%2]\n").arg(status->mPP1TKActive).arg(status->mPP1AnalysisActive)); + StatString.append(QString("Pneu porteur ZT2: TK=[%1] - Analyse=[%2]\n").arg(status->mPP2TKActive).arg(status->mPP2AnalysisActive)); + StatString.append(QString("ZT1: TK=[%1] - Analyse=[%2]\n").arg(status->mZT1TKActive).arg(status->mZT1AnalysisActive)); + StatString.append(QString("ZT2: TK=[%1] - Analyse=[%2]\n").arg(status->mZT2TKActive).arg(status->mZT2AnalysisActive)); + + + mRemoteZTStatus->setPlainText(StatString); + +} + +void CRemoteZTPage::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + Q_UNUSED(event) +// mBackgroundRect->setRect(boundingRect()); +} + +void CRemoteZTPage::ButtonClicked(CTextButtonWidget *BtnPtr) +{ + +} + +void CRemoteZTPage::NetworkZTConnected(int ID) +{ + +} +void CRemoteZTPage::NetworkZTDisconnected(int ID) +{ + mStationName->setPlainText("Non connecté"); + mRemoteZTStatus->setPlainText("Status de la ZT:"); +} + +//Grab the mouse if the user clicks outside buttons +void CRemoteZTPage::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ +// qDebug("CRemoteZTPage"); + Q_UNUSED(event) +} +void CRemoteZTPage::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + Q_UNUSED(event) +} diff --git a/sources/GuiElements/RemoteZTPage.h b/sources/GuiElements/RemoteZTPage.h new file mode 100644 index 0000000..207695f --- /dev/null +++ b/sources/GuiElements/RemoteZTPage.h @@ -0,0 +1,74 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Description du fichier si nécessaire. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20131024 JFM + Verision d'origine. + +### YYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + + +#ifndef REMOTEZTPAGE_H +#define REMOTEZTPAGE_H + +#include "GlobalDefine.h" +#include +#include "Guipage.h" +#include +#include "ToggleTextButtonWidget.h" + + +class COutilZT; +class CTCPZTStatus; + +class CRemoteZTPage : public CGuiPage +{ +Q_OBJECT +public: + virtual ~CRemoteZTPage(); + CRemoteZTPage(QGraphicsWidget *Parent = 0); + + void SetRemoteZTName(QString Name); + void SetRemoteZTStatus(const CTCPZTStatus *status); + + COutilZT *mProgramHandle; + + virtual void resizeEvent(QGraphicsSceneResizeEvent *event); + virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); + virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); + +private: + + QGraphicsTextItem *mStationName; + + QGraphicsTextItem *mRemoteZTStatus; + + +public slots: + void ButtonClicked(CTextButtonWidget *); + void NetworkZTConnected(int); + void NetworkZTDisconnected(int); + +// void ParsingTimerExipred(); + +}; + +#endif // REMOTEZTPAGE_H diff --git a/sources/GuiElements/TextButtonWidget.cpp b/sources/GuiElements/TextButtonWidget.cpp new file mode 100644 index 0000000..c5334a4 --- /dev/null +++ b/sources/GuiElements/TextButtonWidget.cpp @@ -0,0 +1,277 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2013 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Widget Bouton dans lequel est affiché du texte. Une image peut aussi être + affichée à l'intérieur du bouton. +*/ + +/* ************************************************************************** */ +/* Revision: +### 20130306 JFM + Verision d'origine. + +### YYYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + +#include "TextButtonWidget.h" +#include +#include + +CTextButtonWidget::CTextButtonWidget(QString Text, int TextButtonData,int ButtonHeight,int ButtonWidth,int FontSize, QPixmap *ButtonImage) +{ + + mIsEnabled = true; + + if(ButtonImage) + { + mButtonImagePtr = ButtonImage; + } + else + mButtonImagePtr = 0; + + mIsPressed = false; + mWidgetText = Text; + mTextButtonData = TextButtonData; + mButtonHeight = ButtonHeight; + mBackgroundColor = QColor(245, 245, 255, 220); + + if(FontSize == 0) + mFontSize = mButtonHeight -10; + else + mFontSize = FontSize; + + //Fit widget size with text + + mTextFont.setPixelSize(mFontSize); + mTextFont.setBold(true); + + int IconOffset = 0; + QFontMetrics FontMetrics(mTextFont); + if(ButtonWidth == 0) + { + if(mButtonImagePtr != 0) + IconOffset = mButtonHeight + 5; + //mButtonWidth = FontMetrics.width(mWidgetText)+IconOffset + 10; + mButtonWidth = FontMetrics.boundingRect(mWidgetText).width()+IconOffset + 10; + } + else + mButtonWidth = ButtonWidth; + + resize(mButtonWidth,mButtonHeight); + + // setGeometry(0,0,TEXT_BUTTON_WIDGET_WIDTH,TEXT_BUTTON_WIDGET_HEIGHT); + setGeometry(0,0,rect().width(),rect().height()); + mIsSelected = false; + mWidgetOrigin.setX(0); + mWidgetOrigin.setY(0); + + mTimeLine = new QTimeLine(200,this); + mTimeLine->setCurveShape(QTimeLine::SineCurve); + connect(mTimeLine, SIGNAL(valueChanged(qreal)), this, SLOT(TimeLineEvent(qreal))); + + mButtonImagePtr = ButtonImage; + + //QRect WidgetRect(mWidgetOrigin.x(),mWidgetOrigin.y(),TEXT_BUTTON_WIDGET_WIDTH,TEXT_BUTTON_WIDGET_HEIGHT); + QRect WidgetRect(mWidgetOrigin.x(),mWidgetOrigin.y(),rect().width(),rect().height()); + + QRectF textRect = WidgetRect.adjusted(5, 2, -2, -2); +// int flags = Qt::AlignVCenter | Qt::AlignLeft; + +} + +void CTextButtonWidget::CheckScrolling() +{ + int IconOffset = 0; + if(mButtonImagePtr != 0) + IconOffset = rect().height(); + + QFontMetrics FontMetrics(mTextFont); + if(FontMetrics.boundingRect(mWidgetText).width()+IconOffset > rect().width()) + { + mScrollingRequired = true; + mWidgetText.append(" "); + } + else + mScrollingRequired = false; +} + +void CTextButtonWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + PaintButtonWidget(painter,option,widget); +} +void CTextButtonWidget::PaintButtonWidget(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) +{ + Q_UNUSED(widget) + Q_UNUSED(option) +// painter->setOpacity(1); + if(mIsEnabled == false) + { + painter->setPen(QPen(Qt::black, 2)); + } + else + { + if(mIsPressed) + painter->setPen(QPen(Qt::red, 2)); + else + painter->setPen(QPen(Qt::black, 2)); + } +// if(mIsAnimating) +// painter->setBrush(QColor(0, 50, 255, 220)); +// else + //painter->setBrush(QColor(245, 245, 255, 220)); + painter->setBrush(mBackgroundColor); + //QRect WidgetRect(mWidgetOrigin.x(),mWidgetOrigin.y(),TEXT_BUTTON_WIDGET_WIDTH,TEXT_BUTTON_WIDGET_HEIGHT); + QRect WidgetRect(mWidgetOrigin.x(),mWidgetOrigin.y(),rect().width(),rect().height()); + + //painter->drawRoundedRect(WidgetRect,10,10); + painter->drawRect(WidgetRect); + + QRectF textRect; + if(mButtonImagePtr) + textRect = WidgetRect.adjusted(rect().height() + 5, 2, -2, -2); //if there is an image, it will be square so text must begin at 5 + height of button (height determines size of image) + else + textRect = WidgetRect.adjusted(5, 2, -2, -2); + + int flags = Qt::AlignVCenter | Qt::AlignLeft; + +// QFont font; +// font.setPixelSize(mButtonHeight/2 - 10); +// font.setBold(true); + painter->setPen(QPen(Qt::black,1)); + painter->setFont(mTextFont); + painter->drawText(textRect, flags, mWidgetText); + + if(mButtonImagePtr) + { + painter->drawPixmap(WidgetRect.left(),WidgetRect.top(),mButtonImagePtr->scaled(rect().height(),rect().height())); + } + } + +void CTextButtonWidget::SetButtonImage(QPixmap *ButtonImage) +{ + if(ButtonImage != NULL) + { + mButtonImagePtr = ButtonImage; + update(rect()); + } +} + +void CTextButtonWidget::SetButtonText(QString ButtonText) +{ + mWidgetText = ButtonText; + update(rect()); +} + +void CTextButtonWidget::SetButtonPos(int x, int y) +{ + mWidgetOrigin.setX(x); + mWidgetOrigin.setY(y); +} + +void CTextButtonWidget::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + Q_UNUSED(event) +// qDebug("Mouse pressed Text Button Widget"); +// mIsSelected = true; +// event->ignore(); +// update(); + +// qDebug("Mouse pressed Text Button Widget"); + if(mIsEnabled == false) + return; + + mIsPressed = true; + update(rect()); + emit TxtButtonPressed(this); + // QGraphicsWidget::mousePressEvent(event); +} + +void CTextButtonWidget::SetBackgroundColor(QColor color) +{ + mBackgroundColor = color; + update(rect()); +} + +void CTextButtonWidget::mouseReleaseEvent( QGraphicsSceneMouseEvent * event) +{ + Q_UNUSED(event) +///* qDebug("Mouse released Text Button Widget"); +// mIsSelected = false; +// update(); +// if(isVisible()) +// emit clicked(this); +// event->ignore();*/ +// //qDebug("Start Timeline"); +// mIsAnimating = true; +// mTimeLine->start(); +// qDebug("Mouse released Text Button Widget"); + + if(mIsEnabled == false) + return; + + mIsPressed = false; + update(rect()); + emit TxtButtonReleased(this); + +// qDebug("Text Button Widget clicked"); + emit TxtButtonClicked(this); + + // QGraphicsWidget::mouseReleaseEvent(event); +} + +//void CTextButtonWidget::ButtonClicked() +//{ +// mIsSelected = false; +// qDebug("A button is clicked"); +//} + +void CTextButtonWidget::TimeLineEvent(qreal value) +{ + Q_UNUSED(value) +//// ClickTransparency = 255*value; + +// update(); + +// if(value == 0) +// { +// mIsAnimating = false; +// emit clicked(this); +// } +} + +void CTextButtonWidget::TickScrollingText() +{ + if(mScrollingRequired && isVisible()) + { + QChar Character = mWidgetText.at(mSongNameIndex); + mWidgetText.remove(mSongNameIndex,1); + mWidgetText.append(Character); + update(); + } +} + +void CTextButtonWidget::DisableButton() +{ + mIsEnabled = false; + mBackgroundColor = QColor(100, 100, 110, 220); + update(rect()); +} + +void CTextButtonWidget::EnableButton() +{ + mIsEnabled = true; + mBackgroundColor = QColor(245, 245, 255, 220); + update(rect()); +} diff --git a/sources/GuiElements/TextButtonWidget.h b/sources/GuiElements/TextButtonWidget.h new file mode 100644 index 0000000..4217d81 --- /dev/null +++ b/sources/GuiElements/TextButtonWidget.h @@ -0,0 +1,64 @@ +#ifndef TEXTBUTTONWIDGET_H +#define TEXTBUTTONWIDGET_H + +#include +#include +#include + +#define TEXT_BUTTON_WIDGET_WIDTH 280 +#define TEXT_BUTTON_WIDGET_HEIGHT 25 + +class CTextButtonWidget : public QGraphicsWidget +{ + Q_OBJECT +public: + CTextButtonWidget(QString Text, int TextButtonData = 0,int ButtonHeight = TEXT_BUTTON_WIDGET_HEIGHT,int ButtonWidth = 0,int FontSize = 0,QPixmap *ButtonImage = 0); + + QString mWidgetText; + QString mDisplayText; + int mTextButtonData; + bool mIsSelected; + QRectF mButtonsAreaWindow; + QTimeLine *mTimeLine; + bool mIsPressed; + bool mScrollingRequired; + qreal ClickTransparency; + int mSongNameIndex; + QPixmap *mButtonImagePtr; + unsigned int mButtonHeight; + unsigned int mButtonWidth; + unsigned int mFontSize; + QColor mBackgroundColor; + QFont mTextFont; + bool mIsEnabled; + + void paint( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0 ); + void SetButtonPos(int x, int y); + void PaintButtonWidget(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0 ); + void SetButtonImage(QPixmap *ButtonImage); + void SetButtonText(QString ButtonText); + void SetBackgroundColor(QColor color); + void CheckScrolling(void); + void EnableButton(void); + void DisableButton(void); + + + QPoint mWidgetOrigin; + + virtual void mousePressEvent ( QGraphicsSceneMouseEvent * event ); + virtual void mouseReleaseEvent( QGraphicsSceneMouseEvent * event); + void ButtonClicked(void); + + public slots: + void TimeLineEvent(qreal value); + void TickScrollingText(); + + signals: + void TxtButtonClicked(CTextButtonWidget *TextButtonPtr); + void TxtButtonPressed(CTextButtonWidget *TextButtonPtr); + void TxtButtonReleased(CTextButtonWidget *TextButtonPtr); + + +}; + +#endif // TEXTBUTTONWIDGET_H diff --git a/sources/GuiElements/ToggleButtonWidget.cpp b/sources/GuiElements/ToggleButtonWidget.cpp new file mode 100644 index 0000000..b76f1ac --- /dev/null +++ b/sources/GuiElements/ToggleButtonWidget.cpp @@ -0,0 +1,130 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2013 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Widget Bouton de style "toggle" qui affiche une image lorsqu'il est désactivé + et une autre image lorsqu'il est activé. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20130306 JFM + Verision d'origine. + +### YYYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + +#include "ToggleButtonWidget.h" +#include +#include + +CToggleButtonWidget::CToggleButtonWidget(QString ONImageFilePath, QString OFFImageFilePath,QGraphicsItem *Parent, QString Label) +{ + setParentItem(Parent); + mButtonState = TOGGLE_BUTTON_OFF; + + mONPixmap = new QGraphicsPixmapItem(QPixmap(ONImageFilePath), this); + mONPixmap->hide(); + mOFFPixmap = new QGraphicsPixmapItem(QPixmap(OFFImageFilePath), this); + mOFFPixmap->show(); + + mButtonEnabled = true; + mButtonData = 0; + + if(Label.isEmpty() == false) + { + QGraphicsTextItem *BtnLabel = new QGraphicsTextItem(this); + BtnLabel->setPlainText(Label); + BtnLabel->adjustSize(); + BtnLabel->setPos(-BtnLabel->boundingRect().width()-3,0); + } +} + + +void CToggleButtonWidget::SetData(unsigned int data) +{ + mButtonData = data; +} +unsigned int CToggleButtonWidget::GetData() +{ + return mButtonData; +} + +void CToggleButtonWidget::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + Q_UNUSED(event) +} + +void CToggleButtonWidget::mouseReleaseEvent( QGraphicsSceneMouseEvent * event) +{ + Q_UNUSED(event) + + if(mButtonEnabled == false) + return ; + + if(mButtonState == TOGGLE_BUTTON_ON) + mButtonState = TOGGLE_BUTTON_OFF; + else + mButtonState = TOGGLE_BUTTON_ON; + + UpdateButton(); + emit ButtonToggled(this); +} + +void CToggleButtonWidget::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + Q_UNUSED(event) + + + mONPixmap->setPixmap(mONPixmap->pixmap().scaled(boundingRect().width(),boundingRect().height())); + mOFFPixmap->setPixmap(mOFFPixmap->pixmap().scaled(boundingRect().width(),boundingRect().height())); +} + +unsigned int CToggleButtonWidget::GetButtonState() +{ + return mButtonState; +} + +unsigned int CToggleButtonWidget::SetButtonEnabled(bool Enabled) +{ + mButtonEnabled = Enabled; + return RET_OK; +} + +unsigned int CToggleButtonWidget::SetButtonState(unsigned int State) +{ + if(mButtonState != TOGGLE_BUTTON_OFF && mButtonState != TOGGLE_BUTTON_ON) + return RET_ERROR; + + mButtonState = State; + UpdateButton(); + + return RET_OK; +} + + +void CToggleButtonWidget::UpdateButton() +{ + if(mButtonState == TOGGLE_BUTTON_OFF) + { + mOFFPixmap->show(); + mONPixmap->hide(); + } + else + { + mOFFPixmap->hide(); + mONPixmap->show(); + } +} diff --git a/sources/GuiElements/ToggleButtonWidget.h b/sources/GuiElements/ToggleButtonWidget.h new file mode 100644 index 0000000..1375270 --- /dev/null +++ b/sources/GuiElements/ToggleButtonWidget.h @@ -0,0 +1,47 @@ +#ifndef TOGGLEBUTTONWIDGET_H +#define TOGGLEBUTTONWIDGET_H + + +#include "GlobalDefine.h" +#include +#include +#include + +#define TOGGLE_BUTTON_ON 1 +#define TOGGLE_BUTTON_OFF 0 + +class CToggleButtonWidget : public QGraphicsWidget +{ + Q_OBJECT +public: + CToggleButtonWidget(QString ONImageFilePath, QString OFFImageFilePath,QGraphicsItem *Parent,QString Label = QString()); + + + virtual void mousePressEvent ( QGraphicsSceneMouseEvent * event ); + virtual void mouseReleaseEvent( QGraphicsSceneMouseEvent * event); + virtual void resizeEvent(QGraphicsSceneResizeEvent *event); + + QGraphicsPixmapItem *mONPixmap, *mOFFPixmap; + + unsigned int GetButtonState(); + unsigned int SetButtonState(unsigned int State); + unsigned int SetButtonEnabled(bool Enabled); + void SetData(unsigned int data); + unsigned int GetData(); + +private: + unsigned int mButtonState; + bool mButtonEnabled; + unsigned int mButtonData; + + void UpdateButton(); + + + + signals: + void ButtonToggled(CToggleButtonWidget*); + + +}; + +#endif // TOGGLEBUTTONWIDGET_H diff --git a/sources/GuiElements/ToggleTextButtonWidget.cpp b/sources/GuiElements/ToggleTextButtonWidget.cpp new file mode 100644 index 0000000..c87a8a6 --- /dev/null +++ b/sources/GuiElements/ToggleTextButtonWidget.cpp @@ -0,0 +1,91 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2013 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + . + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20130306 JFM + Verision d'origine. + +### YYYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + +#include "TextButtonWidget.h" +#include +#include + +CToggleTextButtonWidget::CToggleTextButtonWidget(QString ActivatedText, QString DeActivatedText, QPixmap ActivatedButtonImage, QPixmap DeActivatedButtonImage, int ButtonHeight,int ButtonWidth,int FontSize, int ToggleTextButtonData) +{ + mButtonState = false; + mActivatedBtnText = ActivatedText; + mDeActivatedButtonText = DeActivatedText; + mActivatedBtnImage = ActivatedButtonImage; + mDeActivatedBtnImage = DeActivatedButtonImage; + mButtonHeight = ButtonHeight; + mButtonData = ToggleTextButtonData; + + mTextButton = new CTextButtonWidget(DeActivatedText,mButtonData,mButtonHeight,ButtonWidth,FontSize,&mDeActivatedBtnImage); + connect(mTextButton, SIGNAL(TxtButtonClicked(CTextButtonWidget *)), this, SLOT(ChildTextButtonClicked(CTextButtonWidget *))); + + setGeometry(mTextButton->rect()); + mTextButton->setParentItem(this); +} +CToggleTextButtonWidget::~CToggleTextButtonWidget() +{ + delete mTextButton; +} + +void CToggleTextButtonWidget::ChildTextButtonClicked(CTextButtonWidget *TextButtonPtr) +{ + if(mButtonState) + { + mTextButton->SetButtonImage(&mDeActivatedBtnImage); + mTextButton->SetButtonText(mDeActivatedButtonText); + mTextButton->SetBackgroundColor(QColor(245, 245, 255, 220)); + mButtonState = false; + emit ToggleBtnDeActivate(this); + } + else + { + mTextButton->SetButtonImage(&mActivatedBtnImage); + mTextButton->SetButtonText(mActivatedBtnText); + mTextButton->SetBackgroundColor(Qt::green); + mButtonState = true; + emit ToggleBtnActivate(this); + } +} + +void CToggleTextButtonWidget::ForceActivation() +{ + mTextButton->SetButtonImage(&mActivatedBtnImage); + mTextButton->SetButtonText(mActivatedBtnText); + mTextButton->SetBackgroundColor(Qt::green); + mButtonState = true; +} +void CToggleTextButtonWidget::ForceDeactivation() +{ + mTextButton->SetButtonImage(&mDeActivatedBtnImage); + mTextButton->SetButtonText(mDeActivatedButtonText); + mTextButton->SetBackgroundColor(QColor(245, 245, 255, 220)); + mButtonState = false; +} + +void CToggleTextButtonWidget::OverrideText(QString text) +{ + mTextButton->SetButtonText(text); +} diff --git a/sources/GuiElements/ToggleTextButtonWidget.h b/sources/GuiElements/ToggleTextButtonWidget.h new file mode 100644 index 0000000..d8483fa --- /dev/null +++ b/sources/GuiElements/ToggleTextButtonWidget.h @@ -0,0 +1,44 @@ +#ifndef TOGGLETEXTBUTTONWIDGET_H +#define TOGGLETEXTBUTTONWIDGET_H + +#include +#include +#include +#include "TextButtonWidget.h" + +#define TOGGLE_TEXT_BUTTON_WIDGET_WIDTH 280 +#define TOGGLE_TEXT_BUTTON_WIDGET_HEIGHT 25 + +class CToggleTextButtonWidget : public QGraphicsWidget +{ + Q_OBJECT +public: + CToggleTextButtonWidget(QString ActivatedText,QString DeActivatedText, + QPixmap ActivatedButtonImage,QPixmap DeActivatedButtonImage, + int ButtonHeight = TOGGLE_TEXT_BUTTON_WIDGET_HEIGHT,int ButtonWidth = 0,int FontSize = 0, int ToggleTextButtonData = 0); + virtual ~CToggleTextButtonWidget(); + + void ForceDeactivation(); + void ForceActivation(); + void OverrideText(QString text); + + public slots: + void ChildTextButtonClicked(CTextButtonWidget *TextButtonPtr); +// void TxtButtonPressed(CTextButtonWidget *TextButtonPtr); +// void TxtButtonReleased(CTextButtonWidget *TextButtonPtr); + + signals: + void ToggleBtnActivate(CToggleTextButtonWidget* ButtonInstancePtr); + void ToggleBtnDeActivate(CToggleTextButtonWidget* ButtonInstancePtr); + +private: + CTextButtonWidget *mTextButton; + QString mActivatedBtnText,mDeActivatedButtonText; + QPixmap mActivatedBtnImage,mDeActivatedBtnImage; + unsigned int mButtonHeight,mButtonWidth; + int mButtonData; + bool mButtonState; //false = deactivated(up), true = activated (down) + +}; + +#endif // TOGGLETEXTBUTTONWIDGET_H diff --git a/sources/GuiElements/TxRxWidget.cpp b/sources/GuiElements/TxRxWidget.cpp new file mode 100644 index 0000000..7208ba0 --- /dev/null +++ b/sources/GuiElements/TxRxWidget.cpp @@ -0,0 +1,92 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2013 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + . + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20130306 JFM + Verision d'origine. + +### YYYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + +#include "TxRxWidget.h" +#include +#define TXRX_WIDGET_SIZE 30 + +CTxRxWidget::CTxRxWidget(QString Label) +{ + mRxLedOffPixmap = new QGraphicsPixmapItem(QPixmap("./Images/green-led-off-md.png").scaled(TXRX_WIDGET_SIZE,TXRX_WIDGET_SIZE),this); + mRxLedOnPixmap = new QGraphicsPixmapItem(QPixmap("./Images/green-led-on-md.png").scaled(TXRX_WIDGET_SIZE,TXRX_WIDGET_SIZE),this); + mTxLedOffPixmap = new QGraphicsPixmapItem(QPixmap("./Images/red-led-off-md.png").scaled(TXRX_WIDGET_SIZE,TXRX_WIDGET_SIZE),this); + mTxLedOnPixmap = new QGraphicsPixmapItem(QPixmap("./Images/red-led-on-md.png").scaled(TXRX_WIDGET_SIZE,TXRX_WIDGET_SIZE),this); + + mRxLedOffPixmap->setPos(0,20); + mRxLedOnPixmap->setPos(0,20); + mTxLedOffPixmap->setPos(30,20); + mTxLedOnPixmap->setPos(30,20); + + mRxLedOnPixmap->hide(); + mTxLedOnPixmap->hide(); + + mRxToggleTimer = new QTimer(); + connect(mRxToggleTimer, SIGNAL(timeout()), this, SLOT(ToggleRxLed())); + mRxToggleTimer->setSingleShot(true); + + mTxToggleTimer = new QTimer(); + connect(mTxToggleTimer, SIGNAL(timeout()), this, SLOT(ToggleTxLed())); + mTxToggleTimer->setSingleShot(true); + + mLabel = new QGraphicsTextItem(this); + mLabel->setPlainText(Label); + mLabel->setPos(5,0); + + + +} + +CTxRxWidget::~CTxRxWidget() +{ +} + +void CTxRxWidget::Receive() +{ + mRxLedOnPixmap->show(); + mRxLedOffPixmap->hide(); + mRxToggleTimer->start(100); +} + +void CTxRxWidget::Transmit() +{ + mTxLedOnPixmap->show(); + mTxLedOffPixmap->hide(); + mTxToggleTimer->start(50); +} + +void CTxRxWidget::ToggleRxLed() +{ + mRxLedOnPixmap->hide(); + mRxLedOffPixmap->show(); + +} +void CTxRxWidget::ToggleTxLed() +{ + mTxLedOnPixmap->hide(); + mTxLedOffPixmap->show(); + +} diff --git a/sources/GuiElements/TxRxWidget.h b/sources/GuiElements/TxRxWidget.h new file mode 100644 index 0000000..289784e --- /dev/null +++ b/sources/GuiElements/TxRxWidget.h @@ -0,0 +1,33 @@ +#ifndef TXRXWIDGET_H +#define TXRXWIDGET_H + +#include +#include +#include + +class CTxRxWidget : public QGraphicsWidget +{ + Q_OBJECT +public: + + CTxRxWidget(QString Lable = QString()); + virtual ~CTxRxWidget(); + + QGraphicsTextItem *mLabel; + QGraphicsPixmapItem *mRxLedOnPixmap,*mRxLedOffPixmap; + QGraphicsPixmapItem *mTxLedOnPixmap,*mTxLedOffPixmap; + + void Receive(void); + void Transmit(void); + + QTimer *mRxToggleTimer; + QTimer *mTxToggleTimer; + +public slots: + + void ToggleRxLed(); + void ToggleTxLed(); + +}; + +#endif // TXRXWIDGET_H diff --git a/sources/GuiElements/ZTLogViewerPage.cpp b/sources/GuiElements/ZTLogViewerPage.cpp new file mode 100644 index 0000000..00630ac --- /dev/null +++ b/sources/GuiElements/ZTLogViewerPage.cpp @@ -0,0 +1,165 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Page permettant de visualiser le fichier ZTLog.txt + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20131021 JFM + Verision d'origine. + +### YYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + + +#include "ZTLogViewerPage.h" +#include +#include "GlobalDefine.h" +#include +#include +#include +#include +#include +#include +#include + + + + +CZTLogViewerPage::CZTLogViewerPage(QGraphicsWidget *Parent, bool Embedded) +{ + Q_UNUSED(Parent) + + mZTLogText.clear(); + mIsEmbedded = Embedded; + + + +// QGraphicsTextItem *Title = new QGraphicsTextItem("Paramètres généraux",this); +// QFont font; +// font.setPointSize(18); +// Title->setFont(font); +// Title->setPos(40,10); + +// Title = new QGraphicsTextItem("Ajuster date & heure",this); +// Title->setFont(font); +// Title->setPos(270,130); + + if(!Embedded) + { + mBackgroundRect = new QGraphicsRectItem(boundingRect(), this); + QBrush BackgroundBrush(QColor(245, 245, 255)); + mBackgroundRect->setBrush(BackgroundBrush); + + mCancelButton = new CTextButtonWidget("Fermer"); + mCancelButton->setParentItem(this); + mCancelButton->setPos(700,550); + connect(mCancelButton,SIGNAL(TxtButtonClicked(CTextButtonWidget*)),this,SLOT(ButtonClicked(CTextButtonWidget*))); + } + + + //mZTLogTextZone = new QTextEdit(); + mZTLogTextZone = new QPlainTextEdit(); + QGraphicsProxyWidget *Proxy = new QGraphicsProxyWidget(this); + Proxy->setWidget(mZTLogTextZone); + Proxy->setPos(10,10); + mZTLogTextZone->resize(780,500); + mZTLogTextZone->setReadOnly(true); + mZTLogTextZone->setWordWrapMode(QTextOption::NoWrap); + QPalette p = mZTLogTextZone->palette(); + p.setColor(QPalette::Highlight,QColor(200,100,100)); + mZTLogTextZone->setPalette(p); + +} + +void CZTLogViewerPage::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + Q_UNUSED(event) + + if(mIsEmbedded) + { + mZTLogTextZone->resize(event->newSize().toSize()); + } + else + { + mBackgroundRect->setRect(boundingRect()); + } +} + +void CZTLogViewerPage::SetZTLogText(QString Text, QString FocusText) +{ + mZTLogText = Text; + LoadAndDisplayZTLog(); + + if(FocusText.length() != 0) + { + QTextCursor cursor = mZTLogTextZone->document()->find(FocusText); + cursor.select(QTextCursor::LineUnderCursor); + mZTLogTextZone->setFocus(); + mZTLogTextZone->setTextCursor(cursor); + QScrollBar *VerticalSB = mZTLogTextZone->verticalScrollBar(); + mZTLogTextZone->centerCursor(); + //VerticalSB->setValue(); + } +} + +void CZTLogViewerPage::ButtonClicked(CTextButtonWidget *BtnPtr) +{ + if(BtnPtr == mCancelButton) + { + mZTLogTextZone->clear(); + hide(); + } +} + +void CZTLogViewerPage::LoadAndDisplayZTLog() +{ + mZTLogTextZone->clear(); + + mZTLogTextZone->setPlainText(mZTLogText); +} + +void CZTLogViewerPage::ScrollToLine(int Line) +{ + QTextBlock TextBlock = mZTLogTextZone->document()->findBlockByLineNumber(Line-1); + QTextCursor cursor = mZTLogTextZone->textCursor(); + cursor.setPosition(TextBlock.position()); + mZTLogTextZone->setFocus(); + mZTLogTextZone->setTextCursor(cursor); + mZTLogTextZone->centerCursor(); +} + +void CZTLogViewerPage::showEvent(QShowEvent *event) +{ + + + + return; + + Q_UNUSED(event) +} + +//Grab the mouse if the user clicks outside buttons +void CZTLogViewerPage::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ +// qDebug("CZTLogViewerPage"); + Q_UNUSED(event) +} +void CZTLogViewerPage::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + Q_UNUSED(event) +} diff --git a/sources/GuiElements/ZTLogViewerPage.h b/sources/GuiElements/ZTLogViewerPage.h new file mode 100644 index 0000000..49a9fcb --- /dev/null +++ b/sources/GuiElements/ZTLogViewerPage.h @@ -0,0 +1,74 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Page permettant de visualiser le fichier ZTLog.txt + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20131122 JFM + Verision d'origine. + +### YYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + + +#ifndef ZTLOGVIEWERPAGE_H +#define ZTLOGVIEWERPAGE_H + +#include "GlobalDefine.h" +#include +#include "Guipage.h" +#include +#include "TextButtonWidget.h" +#include +#include + +class CZoneTest; + +class CZTLogViewerPage : public CGuiPage +{ +Q_OBJECT +public: + CZTLogViewerPage(QGraphicsWidget *Parent = 0, bool Embedded = false); + + void SetZTLogText(QString Text, QString FocusText = QString()); + void ScrollToLine(int Line); + + virtual void resizeEvent(QGraphicsSceneResizeEvent *event); + virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); + virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); + virtual void showEvent ( QShowEvent * event ); + + + +private: + QGraphicsRectItem *mBackgroundRect; + CTextButtonWidget *mCancelButton; +// QTextEdit *mZTLogTextZone; + QPlainTextEdit *mZTLogTextZone; + QString mZTLogText; + bool mIsEmbedded; + + void LoadAndDisplayZTLog(); + + +public slots: + void ButtonClicked(CTextButtonWidget *); + +}; + +#endif // ZTLOGVIEWERPAGE_H diff --git a/sources/GuiElements/ZTLogsListPage.cpp b/sources/GuiElements/ZTLogsListPage.cpp new file mode 100644 index 0000000..66b4ed1 --- /dev/null +++ b/sources/GuiElements/ZTLogsListPage.cpp @@ -0,0 +1,272 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Page affichant la liste des fichiers ZTLOG. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20131021 JFM + Verision d'origine. + +### YYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + + +#include "ZTLogsListPage.h" +#include +#include "OutilZT.h" +#include "TrainLogFileMgr.h" +#include +#include +#include +#include +#include + + + +CZTLogsListPage::~CZTLogsListPage() +{ + +// delete mListParsingTimer; +} + +CZTLogsListPage::CZTLogsListPage(QGraphicsWidget *Parent) +{ + QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); + setParentItem(Parent); + mProgramHandle = 0; + mZTLogFilesManager = 0; + mStationFilter.clear(); + + mZTLogsTable = new QTableWidget(0,3); + QGraphicsProxyWidget *TableProxy = new QGraphicsProxyWidget(this); + TableProxy->setWidget(mZTLogsTable); + TableProxy->setPos(3,20); + TableProxy->resize(380,350); + mZTLogsTable->resize(420,350); + mZTLogsTable->setSelectionBehavior(QAbstractItemView::SelectRows); + mZTLogsTable->setSelectionMode(QAbstractItemView::SingleSelection); + mZTLogsTable->clearContents(); + mZTLogsTable->setRowCount(0); + mZTLogsTable->setHorizontalHeaderLabels(QStringList() << "Station" << "Début" << "Fin"); +// connect(mZTLogsTable,SIGNAL(cellClicked(int,int)),this,SLOT(LogsTableCellClicked(int,int))); + connect(mZTLogsTable,SIGNAL(currentCellChanged(int,int,int,int)),this,SLOT(LogsTableCellSelected(int,int,int,int))); + connect(mZTLogsTable,SIGNAL(cellDoubleClicked(int,int)),SLOT(TableDoubleClicked(int,int))); + + mSummaryText = new QGraphicsTextItem(this); + QFont textfont; + textfont.setPointSize(12); + mSummaryText->setFont(textfont); + mSummaryText->setPlainText("ZTLog:"); + mSummaryText->setPos(3,370); + + QGraphicsProxyWidget *WidgetProxy = new QGraphicsProxyWidget(this); + QGraphicsTextItem *Label = new QGraphicsTextItem(this); + Label->setPlainText("Station:"); + Label->setPos(190,418); + + WidgetProxy = new QGraphicsProxyWidget(this); + mStationsFilterComboBox = new QComboBox(); + WidgetProxy->setWidget(mStationsFilterComboBox); + WidgetProxy->setPos(250,420); + mStationsFilterComboBox->insertItems(0,QStringList() << "Toutes" << "Angrignon" << "Snowdon" << "Henri Bourassa" << "Honoré Beaugrand" << "Longueuil" << "Berri UQAM" << "Montmorency 10/12" << "Montmorency 10/22" << "Côte Vertu" << "Saint-Michel"); + mStationsFilterComboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents); + mStationsFilterComboBox->adjustSize(); + mStationsFilterComboBox->setMaxVisibleItems(15); + connect(mStationsFilterComboBox,SIGNAL(activated(int)),this,SLOT(StationFilterSelected(int))); +} + +void CZTLogsListPage::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + Q_UNUSED(event) +// mBackgroundRect->setRect(boundingRect()); +} + +void CZTLogsListPage::ButtonClicked(CTextButtonWidget *BtnPtr) +{ +// if(BtnPtr == mViewLogDataButton) +// { +// if(mLogMgrHandle->GetLogsCount() == 0) +// return; + +// int cursel = mZTLogsTable->selectedItems().at(0)->data(Qt::UserRole).toInt(); +// CLogElement* Element = mLogMgrHandle->GetLogsList()->at(cursel); +// mProgramHandle->LogViewRequest(mLogMgrHandle->LoadLogData(Element),this); +// mLogMgrHandle->FreeLogData(Element); + +// } +// else if(BtnPtr == mExportCSVLogButton) +// { +// if(mLogMgrHandle->GetLogsCount() == 0) +// return; + +// QString Filename; +// int cursel = mZTLogsTable->selectedItems().at(0)->data(Qt::UserRole).toInt(); +// CLogElement* Element = mLogMgrHandle->GetLogsList()->at(cursel); +// mLogMgrHandle->LoadLogData(Element); +// if(Element->mZTLogType == ZT1_LOG_TYPE) +// { +// CZT1LogElement *temp = (CZT1LogElement*)Element; +// Filename = temp->mLogFileName.replace("bin","csv"); +// CTrainLogFileMgr::instance()->SaveCSVFile(Filename,&temp->mZTLogData,&temp->mFlags,&temp->mZTDetections,temp->mStationName); +// } +// else +// { +// CZT2LogElement *temp = (CZT2LogElement*)Element; +// Filename = temp->mLogFileName.replace("bin","csv"); +// CTrainLogFileMgr::instance()->SaveCSVFile(Filename,&temp->mZTLogData,&temp->mZTDetections,temp->mStationName); +// } +// mLogMgrHandle->FreeLogData(Element); +// } +} + +unsigned int CZTLogsListPage::RefreshList() +{ + ClearTable(); + mProgramHandle->ShowZTLogFile(""); + + QList *ZTLogsList = mZTLogFilesManager->GetZTLogsList(); + + if(ZTLogsList->size() == 0) + return RET_OK; + + mZTLogsTable->setRowCount(ZTLogsList->size()); + + int CurRow = 0; + for(int i = 0; i < ZTLogsList->size(); i++) + { + QString stationtext = mStationsFilterComboBox->currentText(); + if(ZTLogsList->at(i).mStationName == stationtext || stationtext == "Toutes") + { + QTableWidgetItem * NewItem = new QTableWidgetItem(ZTLogsList->at(i).mStationName); + NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + NewItem->setData(Qt::UserRole,QVariant(i)); + mZTLogsTable->setItem(CurRow,0,NewItem); + + NewItem = new QTableWidgetItem(ZTLogsList->at(i).mStartDateTime.toString("yyyy/MM/dd - hh:mm:ss")); + NewItem->setData(Qt::UserRole,QVariant(i)); + NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + mZTLogsTable->setItem(CurRow,1,NewItem); + + NewItem = new QTableWidgetItem(ZTLogsList->at(i).mEndDateTime.toString("yyyy/MM/dd - hh:mm:ss")); + NewItem->setData(Qt::UserRole,QVariant(i)); + NewItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); + mZTLogsTable->setItem(CurRow,2,NewItem); + + CurRow++; + } + } + + mZTLogsTable->setRowCount(CurRow); + + mZTLogsTable->resizeColumnsToContents(); + + mZTLogsTable->sortItems(0,Qt::DescendingOrder); + + mZTLogsTable->setCurrentCell(0,0); + LogsTableCellClicked(0,0); + + + return RET_OK; + +} + +void CZTLogsListPage::ClearTable() +{ + for(int Col = 0; Col < mZTLogsTable->columnCount(); Col++) + { + for(int Row = 0; Row < mZTLogsTable->rowCount(); Row++) + { + delete mZTLogsTable->item(Row,Col); + } + } + mZTLogsTable->setRowCount(0); + mZTLogsTable->clearContents(); + +} + +void CZTLogsListPage::LogsTableCellSelected( int row, int col, int prevrow, int prevcol) +{ + Q_UNUSED(prevrow) + Q_UNUSED(prevcol) + + + if(row < 0 || col < 0) + return; + + LogsTableCellClicked(row,col); +} + +void CZTLogsListPage::LogsTableCellClicked(int row, int column) +{ + Q_UNUSED(column); + + int rowcount = mZTLogsTable->rowCount(); + if(rowcount == 0) + return; + + + QList *ZTLogsList = mZTLogFilesManager->GetZTLogsList(); + + if(mZTLogsTable->item(row,0) == 0) + return; + + int ItemIndex = mZTLogsTable->item(row,0)->data(Qt::UserRole).toInt(); + + + QFile *ZTLogFile = new QFile(ZTLogsList->at(ItemIndex).mZTLogFilePath); + if(ZTLogFile) + { + ZTLogFile->open(QIODevice::ReadOnly | QIODevice::Text); + QString str = ZTLogFile->readAll(); + + ZTLogFile->close(); + + delete ZTLogFile; + + mProgramHandle->ShowZTLogFile(str); + } +} + +void CZTLogsListPage::StationFilterSelected(int Index) +{ + Q_UNUSED(Index); + RefreshList(); +} + +//Grab the mouse if the user clicks outside buttons +void CZTLogsListPage::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ +// qDebug("CLogsListPage"); + Q_UNUSED(event) +} +void CZTLogsListPage::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + Q_UNUSED(event) +} +void CZTLogsListPage::CheckBoxClicked(int state) +{ + Q_UNUSED(state) + RefreshList(); +} + +void CZTLogsListPage::TableDoubleClicked(int row, int col) +{ + Q_UNUSED(col) + Q_UNUSED(row) + //ButtonClicked(mViewLogDataButton); +} diff --git a/sources/GuiElements/ZTLogsListPage.h b/sources/GuiElements/ZTLogsListPage.h new file mode 100644 index 0000000..a58d594 --- /dev/null +++ b/sources/GuiElements/ZTLogsListPage.h @@ -0,0 +1,91 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Description du fichier si nécessaire. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20131024 JFM + Verision d'origine. + +### YYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + + +#ifndef ZTLOGSLISTPAGE_H +#define ZTLOGSLISTPAGE_H + +#include "GlobalDefine.h" +#include +#include "Guipage.h" +#include +#include "PushButton.h" +#include "TextButtonWidget.h" +#include +#include +#include +#include "ZTData.h" +#include "ZTLogFilesMgr.h" + +class COutilZT; + +class CZTLogsListPage : public CGuiPage +{ +Q_OBJECT +public: + virtual ~CZTLogsListPage(); + CZTLogsListPage(QGraphicsWidget *Parent = 0); + + + COutilZT *mProgramHandle; + CZTLogFilesMgr *mZTLogFilesManager; + + unsigned int RefreshList(); + + virtual void resizeEvent(QGraphicsSceneResizeEvent *event); + virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); + virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); + +private: + + QTableWidget *mZTLogsTable; + QGraphicsTextItem *mSummaryText; + QTimer *mListParsingTimer; + QComboBox *mStationsFilterComboBox; + + QString mStationFilter; + + QList *mZTLogFilesList; + + + void ClearTable(); + + + +public slots: + void ButtonClicked(CTextButtonWidget *); + void LogsTableCellClicked(int, int); + void LogsTableCellSelected(int,int,int,int); + void CheckBoxClicked(int); + void TableDoubleClicked(int,int); + void StationFilterSelected(int); + +// void ParsingTimerExipred(); + +}; + +#endif // LOGSLISTPAGE_H diff --git a/sources/LogMgr.cpp b/sources/LogMgr.cpp new file mode 100644 index 0000000..e63b28a --- /dev/null +++ b/sources/LogMgr.cpp @@ -0,0 +1,643 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 - 2013 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Cette classe est responsable de la création d'une liste d'objets CLogElement + à partir des données de passage des trains contenues dans les fichiers log. + Cette classe est principalement utilisée par l'interface graphique pour la + visualisation des passages. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20121024 JFM + + +### YYYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + +#include "LogMgr.h" + +#include "TrainLogFileMgr.h" +#include "OutilZT.h" +//#include "ZTLog.h" +#include +#include +#include + +CLogMgr::CLogMgr() +{ + mProgramHandle = 0; + + mDirParserThread = new QThread(); + mDirParserWorkerThread = new CDirParserThread(); + mDirParserWorkerThread->moveToThread(mDirParserThread); + connect(mDirParserThread,SIGNAL(started()),mDirParserWorkerThread,SLOT(ParseDirectories())); + connect(mDirParserThread,SIGNAL(finished()),this,SLOT(ThreadQuit())); + connect(mDirParserThread,SIGNAL(terminated()),this,SLOT(ThreadTerminated())); + // connect(mDirParserWorkerThread,SIGNAL(NewLogParsed(QString,bool)),this,SLOT(NewLogParsed(QString,bool))); + connect(mDirParserWorkerThread,SIGNAL(NewLogParsed(CLogElement*)),this,SLOT(NewLogParsed(CLogElement*))); + connect(mDirParserWorkerThread,SIGNAL(ParsingFinished(int)),this,SLOT(DirParsingFinished(int))); + connect(mDirParserWorkerThread,SIGNAL(EmptyDirParsed()),this,SLOT(EmptyDirParsed())); + + mDatabaseParsingTimer = new QTimer(); + mDatabaseParsingTimer->setInterval(60000); + connect(mDatabaseParsingTimer,SIGNAL(timeout()),this,SLOT(ParsingTimerExpired())); + +} + +CLogMgr::~CLogMgr() +{ + DestroyLogList(); + delete mDirParserThread; + delete mDirParserWorkerThread; + delete mDatabaseParsingTimer; +} + +unsigned int CLogMgr::DestroyLogList() +{ + for(int i = 0; i < mPassagesList.size(); i++) + { + delete mPassagesList.at(i); + } + + mPassagesList.clear(); + + return RET_OK; +} + +unsigned int CLogMgr::ProtectLogElementFile(bool IsProtected, CLogElement *Element) +{ + if(Element->mZTLogType == ZT1_LOG_TYPE) + { + CZT1LogElement *ZT1Element = (CZT1LogElement*)Element; + if(CTrainLogFileMgr::instance()->SetTrainLogProtected(IsProtected,ZT1Element->mLogFileName) == RET_OK) + { + ZT1Element->mFileProtected = IsProtected; + SaveDatabaseFile(); + return RET_OK; + } + } + else if(Element->mZTLogType == ZT2_LOG_TYPE) + { + CZT2LogElement *ZT2Element = (CZT2LogElement*)Element; + if(CTrainLogFileMgr::instance()->SetTrainLogProtected(IsProtected,ZT2Element->mLogFileName) == RET_OK) + { + ZT2Element->mFileProtected = IsProtected; + SaveDatabaseFile(); + return RET_OK; + } + } + + return RET_ERROR; +} +unsigned int CLogMgr::ParseLogs(bool RebuildDatabase, bool KeepData) +{ + DestroyLogList(); + qDebug("Parsing Logs now..."); + + mSaveDBFile = false; + mParsingFinished = false; + mProgramHandle->DatabaseFetchingBegin(this); + mDatabaseFileCounter = 0; + if(RebuildDatabase == true) + { + qDebug("Rebuilding database now..."); + mDirParserWorkerThread->SetParsingInfo(QDir(mLogDataDir),"*.bin",KeepData); + qDebug("Starting parser thread now..."); + mDirParserThread->start(); + mSaveDBFile = true; + } + else + { + //Load database file. + QDir BaseDir(mLogDataDir); + QString DatabaseFilePath = BaseDir.filePath("Trains.zdb"); + // DatabaseFilePath += "Trains.zdb"; + QFile* DatabaseFile = new QFile(BaseDir.filePath("Trains.zdb")/*DatabaseFilePath*/); + if(DatabaseFile) + { + if(DatabaseFile->open(QIODevice::ReadOnly | QIODevice::Unbuffered) == false) + { + //rebuild database... + qDebug("Failed to open Trains.zdb, rebuilding database now..."); + mDirParserWorkerThread->SetParsingInfo(QDir(mLogDataDir),"*.bin",KeepData); + qDebug("Starting parser thread now..."); + mDirParserThread->start(); + mSaveDBFile = true; + delete DatabaseFile; + return RET_OK; + } + } + else + { + DirParsingFinished(0); + return RET_ERROR; + } + + + QByteArray DBData = DatabaseFile->readAll(); + QDataStream *DBStrm = new QDataStream(DBData); + + qint32 NBRecords; + *DBStrm >> NBRecords; + + for(qint32 i = 0; i < NBRecords; i++) + { + unsigned int LogType; + *DBStrm >> LogType; + + if(LogType == ZT1_LOG_TYPE) + { + CZT1LogElement *NewElement = new CZT1LogElement; + + + *DBStrm >> NewElement->mPassageDateTime + >> NewElement->mTrainType + >> NewElement->mNbElements + >> NewElement->mThreadDataStartTime + >> NewElement->mThreadDataEndTime + >> NewElement->mLogFileName + >> NewElement->mMeanSpeed + >> NewElement->mFlags + >> NewElement->mStationName + >> NewElement->mFileProtected; + + int NBDetect; + *DBStrm >> NBDetect; + + for(int i = 0; i < NBDetect; i++) + { + CZTDetectionData *NewDetection = new CZTDetectionData; + *DBStrm >> NewDetection->mDetectionID + >> NewDetection->mRank + >> NewDetection->mTimeStamp; + + NewElement->mZTDetections.append(NewDetection); + } + NewLogParsed(NewElement); + + } + else if(LogType == ZT2_LOG_TYPE) + { + CZT2LogElement *NewElement = new CZT2LogElement; + + + *DBStrm >> NewElement->mPassageDateTime + >> NewElement->mLogFileName + >> NewElement->mNbElements + >> NewElement-> mStationName + >> NewElement->mFlags + >> NewElement->mFileProtected; + + int NBDetect; + *DBStrm >> NBDetect; + + for(int i = 0; i < NBDetect; i++) + { + CZTDetectionData *NewDetection = new CZTDetectionData; + *DBStrm >> NewDetection->mDetectionID + >> NewDetection->mRank + >> NewDetection->mTimeStamp; + + NewElement->mZTDetections.append(NewDetection); + } + + NewLogParsed(NewElement); + } + else + { + qDebug("Invalid logtype in DB file..."); + } + + + } + + DatabaseFile->close(); + delete DatabaseFile; + delete DBStrm; + + DirParsingFinished(1); + + } + return RET_OK; +} + +unsigned int CLogMgr::SaveDatabaseFile() +{ + + QDir BaseDir(mLogDataDir); + QString DatabaseFilePath = BaseDir.filePath("Trains.zdb"); + // DatabaseFilePath += "Trains.zdb"; + QFile* DatabaseFile = new QFile(BaseDir.filePath("Trains.zdb")/*DatabaseFilePath*/); + + + if(DatabaseFile) + { + if(DatabaseFile->open(QIODevice::WriteOnly | QIODevice::Unbuffered) == false) + { + QMessageBox::information(0,"Erreur","Impossible de créer le fichier DB"); + delete DatabaseFile; + return RET_ERROR; + } + } + else + { + QMessageBox::information(0,"Erreur","Impossible de créer le fichier DB"); + return RET_ERROR; + } + + + QByteArray byteArray; + QBuffer FileBuffer(&byteArray); + FileBuffer.open(QIODevice::WriteOnly); + QDataStream *DBStrm = new QDataStream(&FileBuffer); + + qint32 NBRecords = mPassagesList.size(); + *DBStrm << NBRecords; + + for(qint32 i = 0; i < NBRecords; i++) + { + unsigned int LogType = mPassagesList.at(i)->mZTLogType; + *DBStrm << LogType; + + if(LogType == ZT1_LOG_TYPE) + { + CZT1LogElement *NewElement = (CZT1LogElement*)mPassagesList.at(i); + + + *DBStrm << NewElement->mPassageDateTime + << NewElement->mTrainType + << NewElement->mNbElements + << NewElement->mThreadDataStartTime + << NewElement->mThreadDataEndTime + << NewElement->mLogFileName + << NewElement->mMeanSpeed + << NewElement->mFlags + << NewElement->mStationName + << NewElement->mFileProtected; + + int NBDetect = NewElement->mZTDetections.size(); + *DBStrm << NBDetect; + + for(int i = 0; i < NBDetect; i++) + { + *DBStrm << NewElement->mZTDetections.at(i)->mDetectionID + << NewElement->mZTDetections.at(i)->mRank + << NewElement->mZTDetections.at(i)->mTimeStamp; + } + } + else if(LogType == ZT2_LOG_TYPE) + { + CZT2LogElement *NewElement = (CZT2LogElement*)mPassagesList.at(i); + + + *DBStrm << NewElement->mPassageDateTime + << NewElement->mLogFileName + << NewElement->mNbElements + << NewElement->mStationName + << NewElement->mFlags + << NewElement->mFileProtected; + + int NBDetect = NewElement->mZTDetections.size(); + *DBStrm << NBDetect; + + for(int i = 0; i < NBDetect; i++) + { + *DBStrm << NewElement->mZTDetections.at(i)->mDetectionID + << NewElement->mZTDetections.at(i)->mRank + << NewElement->mZTDetections.at(i)->mTimeStamp; + } + } + else + { + qDebug("Invalid log type in array!!!"); + } + + + } + + + FileBuffer.seek(0); + DatabaseFile->write(FileBuffer.buffer()); + DatabaseFile->flush(); + + FileBuffer.close(); + DatabaseFile->close(); + delete DatabaseFile; + delete DBStrm; + mSaveDBFile = false; + return RET_OK; +} + +unsigned int CLogMgr::RebuildDatabaseFile() +{ + ParseLogs(true,false); + mSaveDBFile = true; + return RET_OK; +} + + + +int CLogMgr::ParseDir(QDir dir, bool KeepData) +{ + + QStringList LogFilters; + QFileInfoList list; + // QString LogDataDir = mProgramHandle->GetLogDataPath(); + LogFilters << "*.bin"; + + //Load files in base directory + QDir LogDir(dir); + LogDir.setFilter(QDir::Files | QDir::NoDotAndDotDot); + LogDir.setNameFilters(LogFilters); + LogDir.setSorting(QDir::Name); + list = LogDir.entryInfoList(); + if(list.size() != 0) + { + //Extract data for each passage + for(int i = 0; i < list.size(); i++) + { + ParseNewLog(list.at(i).filePath(),KeepData); + } + } + + + //Check for subdirectories + QDir SubDirectories(dir); + + SubDirectories.setFilter(QDir::Dirs | QDir::NoDotAndDotDot); + + QFileInfoList SubDirList = SubDirectories.entryInfoList(); + for(int i = 0; i < SubDirList.size(); i++) + { + ParseDir(QDir(SubDirList.at(i).absoluteFilePath()), KeepData); + } + + return 1; +} + +CLogElement* CLogMgr::LoadLogData(CLogElement *Element) +{ + if(Element->mZTLogType == ZT1_LOG_TYPE) + { + CZT1LogElement *TargetElement = (CZT1LogElement*)Element; + QString FilePath = TargetElement->mLogFileName; + unsigned int ret; + + //Make shure that the lists are empty in the target element + for(int i = 0; i < TargetElement->mZTLogData.size(); i++) + { + delete TargetElement->mZTLogData.at(i); + } + for(int i = 0; i < TargetElement->mZTDetections.size(); i++) + { + delete TargetElement->mZTDetections.at(i); + } + + TargetElement->mZTLogData.clear(); + TargetElement->mZTDetections.clear(); + + //Passing the TargetElement to the OpenTrainLog function will fill it with data + CTrainLogFileMgr::instance()->OpenTrainLog(FilePath,ret,TargetElement,true); + + return (CLogElement*)TargetElement; + } + else if(Element->mZTLogType == ZT2_LOG_TYPE) + { + CZT2LogElement *TargetElement = (CZT2LogElement*)Element; + QString FilePath = TargetElement->mLogFileName; + unsigned int ret; + + //Make shure that the lists are empty in the target element + for(int i = 0; i < TargetElement->mZTLogData.size(); i++) + { + delete TargetElement->mZTLogData.at(i); + } + for(int i = 0; i < TargetElement->mZTDetections.size(); i++) + { + delete TargetElement->mZTDetections.at(i); + } + + TargetElement->mZTLogData.clear(); + TargetElement->mZTDetections.clear(); + + //Passing the TargetElement to the OpenTrainLog function will fill it with data + CTrainLogFileMgr::instance()->OpenTrainLog(FilePath,ret,TargetElement,true); + + return (CLogElement*)TargetElement; + } + + return 0; + +} + +unsigned int CLogMgr::FreeLogData(CLogElement *Element) +{ + if(Element->mZTLogType == ZT1_LOG_TYPE) + { + CZT1LogElement *temp = (CZT1LogElement*)Element; + for(int i = 0; i < temp->mZTLogData.size(); i++) + delete temp->mZTLogData.at(i); + temp->mZTLogData.clear(); + } + if(Element->mZTLogType == ZT2_LOG_TYPE) + { + CZT2LogElement *temp = (CZT2LogElement*)Element; + for(int i = 0; i < temp->mZTLogData.size(); i++) + delete temp->mZTLogData.at(i); + temp->mZTLogData.clear(); + } + + return RET_OK; + +} + +unsigned int CLogMgr::DeleteLog(int LogIndex) +{ + if(LogIndex >= mPassagesList.size()) + return RET_ERROR; + + QString Filename; + + CLogElement *Element = mPassagesList.takeAt(LogIndex); + FreeLogData(Element); //make shure no data will be leaked + { + if(Element->mZTLogType == ZT1_LOG_TYPE) + { + CZT1LogElement *temp = (CZT1LogElement*)Element; + Filename = temp->mLogFileName; + + } + if(Element->mZTLogType == ZT2_LOG_TYPE) + { + CZT2LogElement *temp = (CZT2LogElement*)Element; + Filename = temp->mLogFileName; + } + } + QDir DirObject; + DirObject.remove(Filename); + delete Element; + + SaveDatabaseFile(); + + return RET_OK; +} + +bool CLogMgr::ParseNextLog() +{ + if((int)mLogsFileIndex >= mLogsFilelist.size()) + return false; + + //Extract data + + if(ParseNewLog(mLogsFilelist.at(mLogsFileIndex).filePath()) == RET_ERROR) + return false; + + mLogsFileIndex++; + + return true; +} + +void CLogMgr::NewLogParsed(QString Filename,bool KeepData) +{ + ParseNewLog(Filename,KeepData); + mDatabaseParsingTimer->start(); +} + +void CLogMgr::NewLogParsed(CLogElement * NewLog) +{ + mPassagesList.append(NewLog); + mDatabaseParsingTimer->start(); + mProgramHandle->DatabaseFetchingTick(this,mDatabaseFileCounter++); + +} + +void CLogMgr::DirParsingFinished(int Res) +{ + + mDatabaseParsingTimer->stop(); + mParsingFinished = true; + mDirParserThread->quit(); + mProgramHandle->LogsDatabaseLoaded(this,Res); + + if(mSaveDBFile == true) + { + SaveDatabaseFile(); + } + +} + +void CLogMgr::ParsingTimerExpired() +{ + qDebug("Parsing timer timeout"); + mDirParserWorkerThread->KillThread(); + mDirParserThread->terminate(); + DirParsingFinished(2); + +} +void CLogMgr::EmptyDirParsed() +{ + //The thread is not stuck. Kick the timer... + mDatabaseParsingTimer->start(); +} + +void CLogMgr::ThreadQuit() +{ + qDebug("Thread quit slot"); +} + +void CLogMgr::ThreadTerminated() +{ + qDebug("Thread terminated slot"); +} + + +unsigned int CLogMgr::ParseNewLog(QString FileName, bool KeepData) +{ + Q_UNUSED(KeepData) + + unsigned int ret; + CLogElement *NewLog = CTrainLogFileMgr::instance()->OpenTrainLog(FileName,ret); + + if(ret == RET_ERROR) + { + return RET_ERROR; + } + + //the date and time of the log entry is assigned the date and time of the first record... + if(NewLog->mZTLogType == ZT1_LOG_TYPE) + { + mPassagesList.append(NewLog); + } + else if(NewLog->mZTLogType == ZT2_LOG_TYPE) + { + mPassagesList.append(NewLog); + } + return RET_OK; +} + +unsigned int CLogMgr::ParseImportedLogs(QStringList *NewLogFiles) +{ + if(NewLogFiles == 0) + { + return RET_ERROR; + } + + for(int i = 0; i < NewLogFiles->size(); i++) + { + ParseNewLog(NewLogFiles->at(i)); + } + + SaveDatabaseFile(); + mProgramHandle->LogsDatabaseLoaded(this,1); + + return RET_OK; +} + +unsigned int CLogMgr::GetLogsCount() +{ + return mPassagesList.size(); +} + +QList * CLogMgr::GetLogsList() +{ + return &mPassagesList; +} + +CLogElement::~CLogElement() +{ +} + +CZT1LogElement::~CZT1LogElement() +{ + qDeleteAll(mZTLogData); + mZTLogData.clear(); + + qDeleteAll(mZTDetections); + mZTDetections.clear(); +} + +CZT2LogElement::~CZT2LogElement() +{ + for(int i = 0; i < mZTLogData.size(); i++) + delete mZTLogData.at(i); + mZTLogData.clear(); + + for(int i = 0; i < mZTDetections.size(); i++) + delete mZTDetections.at(i); + mZTDetections.clear(); + +} diff --git a/sources/LogMgr.h b/sources/LogMgr.h new file mode 100644 index 0000000..f6754a5 --- /dev/null +++ b/sources/LogMgr.h @@ -0,0 +1,143 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 - 2013 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Description du fichier si nécessaire. + +*/ + +/* ************************************************************************** */ +/* Revision: +### YYYMMDD JFM + Verision d'origine. + +### YYYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + +#ifndef LOGMGR_H +#define LOGMGR_H + +#include "ZTData.h" +#include "GlobalDefine.h" +#include +#include +#include +#include +#include "DirParserThread.h" + +class CLogElement +{ +public: + unsigned int mZTLogType; + virtual ~CLogElement(); +}; +//QDataStream &operator<<(QDataStream &out, const CLogElement &source); +//QDataStream &operator>>(QDataStream &in, CLogElement &dest); + +class CZT1LogElement : public CLogElement +{ +public: + CZT1LogElement(){mZTLogType=ZT1_LOG_TYPE;} + ~CZT1LogElement(); + QDateTime mPassageDateTime; + QVector mZTLogData; + QVector mZTDetections; + quint32 mTrainType; + quint32 mNbElements; + quint64 mThreadDataStartTime, mThreadDataEndTime; + QString mLogFileName; + qreal mMeanSpeed; + CZT1FlagsData mFlags; + QString mStationName; + bool mFileProtected; +}; +//QDataStream &operator<<(QDataStream &out, const CZT1LogElement &source); +//QDataStream &operator>>(QDataStream &in, CZT1LogElement &dest); + +class CZT2LogElement : public CLogElement +{ +public: + CZT2LogElement(){mZTLogType = ZT2_LOG_TYPE;} + ~CZT2LogElement(); + QDateTime mPassageDateTime; + QVector mZTLogData; + QVector mZTDetections; + QString mLogFileName; + quint32 mNbElements; + QString mStationName; + CZT2FlagsData mFlags; + bool mFileProtected; +}; + +class COutilZT; + +class CLogMgr : public QObject +{ + Q_OBJECT +public: + CLogMgr(); + ~CLogMgr(); + + COutilZT *mProgramHandle; + + unsigned int GetLogsCount(); + QList *GetLogsList(); + unsigned int ParseLogs(bool RebuildDatabase = false, bool KeepData = false); + unsigned int ParseNewLog(QString FileName, bool KeepData = false); + unsigned int ParseImportedLogs(QStringList *NewLogFiles); + CLogElement* LoadLogData(CLogElement * Element); + unsigned int FreeLogData(CLogElement * Element); + unsigned int DeleteLog(int LogIndex); + void SetLogDataDir(QString Dir){mLogDataDir = Dir;} + bool ParseNextLog(); + unsigned int SaveDatabaseFile(); + unsigned int RebuildDatabaseFile(); + unsigned int ProtectLogElementFile(bool IsProtected, CLogElement *Element); + QTimer *mDatabaseParsingTimer; + + +private: + CDirParserThread *mDirParserWorkerThread; + QThread *mDirParserThread; + QList mPassagesList; + unsigned int DestroyLogList(); + int ParseDir(QDir dir, bool KeepData = false); + + + QFileInfoList mLogsFilelist; + unsigned int mLogsFileIndex; + QString mLogDataDir; + + bool mParsingFinished; + unsigned int mDatabaseFileCounter; + bool mSaveDBFile; + +public slots: + void NewLogParsed(QString,bool); + void NewLogParsed(CLogElement*); + void DirParsingFinished(int); + void ParsingTimerExpired(); + void EmptyDirParsed(); + + + void ThreadQuit(); + void ThreadTerminated(); + +}; + + + + +#endif // LOGMGR_H + diff --git a/sources/MainPanel.cpp b/sources/MainPanel.cpp new file mode 100644 index 0000000..304c5a3 --- /dev/null +++ b/sources/MainPanel.cpp @@ -0,0 +1,226 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Classe qui crée la scène ainsi que les instances des différents objets + nécessaires à l'affichage. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20121210 JFM + Verision d'origine. + +### YYYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ +#include "MainPanel.h" +#include +#include +#include + +#include +#include +#include + +//#include +//#ifndef Q_OS_WIN32 +//Q_IMPORT_PLUGIN(qjpeg) +//#endif + +Panel::~Panel() +{ + //if(scene) + //delete scene; +// delete mWelcomePage; +// delete mZTMainPage; + +} + +Panel::Panel() +{ + + scene = 0; +// setWindowFlags(Qt::Tool | Qt::FramelessWindowHint); +// // setParent(0); // Create TopLevel-Widget +// setAttribute(Qt::WA_NoSystemBackground, true); +// setAttribute(Qt::WA_TranslucentBackground, true); +// setAttribute(Qt::WA_PaintOnScreen); // not needed in Qt 5.2 and up + + //No Scrollbar + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + + + //Speed-up display + setCacheMode(CacheBackground); + setRenderHints(/*QPainter::Antialiasing | */QPainter::SmoothPixmapTransform/* | QPainter::TextAntialiasing*/); + setViewportUpdateMode(QGraphicsView::SmartViewportUpdate/*QGraphicsView::FullViewportUpdate*/); + +// QPixmap background; +// background.load("./Images/GuiBackground.jpg"); +// background = background.scaled(SCREEN_RES_WIDTH,SCREEN_RES_HEIGHT); + + + QLinearGradient BackgroundGradient(QPointF(rect().width()/2,0),QPointF(rect().width()/2,rect().height())); + BackgroundGradient.setColorAt(0.5,QColor(128,158,222)); + BackgroundGradient.setColorAt(1,Qt::white); + QBrush BkBrush(BackgroundGradient); + setBackgroundBrush(BkBrush); + + // QRectF bounds(0,0, QApplication::desktop()->geometry().width(),QApplication::desktop()->geometry().height()); + QRectF bounds(0,0, SCREEN_RES_WIDTH,SCREEN_RES_HEIGHT); + scene = new QGraphicsScene(bounds, this); + setScene(scene); + + //resize(QApplication::desktop()->geometry().width(),QApplication::desktop()->geometry().height()); + + resize(SCREEN_RES_WIDTH,SCREEN_RES_HEIGHT); + //////////////////////// + + setMouseTracking(true); + + + mMainPage = new CMainPage(); + mDatabaseModeLogViewPage = new CLogViewPage(); + mDatabaseModeLogListPage = new CLogsListPage(); + mOptionsPage = new COptionsPage(); + mNetworkZTListPage = new CNetworkZTListPage(); + mNetworkCtrlPage = new CNetworkCtrlPage(); + mRemoteZTPage = new CRemoteZTPage(); + mZTLogViewerPage = new CZTLogViewerPage(0,false); + mNetworkModeLogListPage = new CLogsListPage(); + mNetworkModeLogViewPage = new CLogViewPage(); + mProgressBarPage = new CProgressBarPage(); + mRemoteZTCtrlPage = new CRemoteZTCtrlPage(); + mDatabaseMgrPage = new CDatabaseMgrPage(); + mZTLogsListPage = new CZTLogsListPage(); + mZTLogFileViewerPage = new CZTLogViewerPage(0,true); + + + scene->addItem(mMainPage); + scene->addItem(mDatabaseModeLogViewPage); + scene->addItem(mDatabaseModeLogListPage); + scene->addItem(mOptionsPage); + scene->addItem(mNetworkZTListPage); + scene->addItem(mNetworkCtrlPage); + scene->addItem(mRemoteZTPage); + scene->addItem(mZTLogViewerPage); + scene->addItem(mNetworkModeLogListPage); + scene->addItem(mNetworkModeLogViewPage); + scene->addItem(mProgressBarPage); + scene->addItem(mRemoteZTCtrlPage); + scene->addItem(mDatabaseMgrPage); + scene->addItem(mZTLogsListPage); + scene->addItem(mZTLogFileViewerPage); + + + mMainPage->setPos(0,0); + mMainPage->show(); + mMainPage->setZValue(0); + mMainPage->resize(10,SCREEN_RES_HEIGHT); + + mDatabaseModeLogViewPage->setPos(SCREEN_RES_WIDTH-980,0); + mDatabaseModeLogViewPage->resize(980,SCREEN_RES_HEIGHT); + mDatabaseModeLogViewPage->setZValue(0); + mDatabaseModeLogViewPage->DisableCloseButton(); + mDatabaseModeLogViewPage->show(); + + mDatabaseModeLogListPage->setPos(100,0); + mDatabaseModeLogListPage->resize(400,SCREEN_RES_HEIGHT-100); + mDatabaseModeLogListPage->setZValue(1); + mDatabaseModeLogListPage->show(); + + mZTLogsListPage->setPos(100,0); + mZTLogsListPage->resize(SCREEN_RES_WIDTH,SCREEN_RES_HEIGHT); + mZTLogsListPage->setZValue(0); + mZTLogsListPage->hide(); + + mZTLogFileViewerPage->resize(980,700); + mZTLogFileViewerPage->setPos(600,10); + mZTLogFileViewerPage->hide(); + mZTLogFileViewerPage->setZValue(0); + + mOptionsPage->setPos(412,100); + mOptionsPage->hide(); + mOptionsPage->resize(600,600); + mOptionsPage->setZValue(1); + + mDatabaseMgrPage->setPos(412,100); + mDatabaseMgrPage->hide(); + mDatabaseMgrPage->resize(644,400); + mDatabaseMgrPage->setZValue(1); + + mNetworkZTListPage->setPos(100,0); + mNetworkZTListPage->setZValue(0); + mNetworkZTListPage->hide(); + + mNetworkCtrlPage->setPos(100,325); + mNetworkCtrlPage->resize(150,150); + mNetworkCtrlPage->setZValue(0); + mNetworkCtrlPage->hide(); + + mRemoteZTPage->setPos(450,0); + mRemoteZTPage->resize(SCREEN_RES_WIDTH-450,SCREEN_RES_HEIGHT); + mRemoteZTPage->setZValue(0); + mRemoteZTPage->hide(); + + mZTLogViewerPage->setPos(400,84); + mZTLogViewerPage->hide(); + mZTLogViewerPage->resize(800,600); + mZTLogViewerPage->setZValue(1); + + mNetworkModeLogListPage->setPos(1000,0); + mNetworkModeLogListPage->resize(400,SCREEN_RES_HEIGHT-100); + mNetworkModeLogListPage->setZValue(1); + mNetworkModeLogListPage->show(); + + mNetworkModeLogViewPage->setPos(SCREEN_RES_WIDTH-980,0); + mNetworkModeLogViewPage->resize(980,SCREEN_RES_HEIGHT); + mNetworkModeLogViewPage->setZValue(1); + mNetworkModeLogViewPage->EnableCloseButton(); + mNetworkModeLogViewPage->hide(); + + mRemoteZTCtrlPage->setPos(1000,0); + mRemoteZTCtrlPage->resize(400,SCREEN_RES_HEIGHT-100); + mRemoteZTCtrlPage->hide(); + mRemoteZTCtrlPage->setZValue(0); + + + + + + mProgressBarPage->setPos(500,300); +// mProgressBarPage->resize(400,300); + mProgressBarPage->setZValue(2); + mProgressBarPage->hide(); + + installEventFilter(mDatabaseModeLogViewPage); +} + +void Panel::ShowMainPage() +{ + mMainPage->show(); +} + +void Panel::HideMainPAge() +{ + mMainPage->hide(); +} + +//void Panel::mousePressEvent(QGraphicsSceneMouseEvent *event) +//{ +//} + + diff --git a/sources/MainPanel.h b/sources/MainPanel.h new file mode 100644 index 0000000..d09a2a8 --- /dev/null +++ b/sources/MainPanel.h @@ -0,0 +1,101 @@ +#ifndef PANEL_H +#define PANEL_H + +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Description du fichier si nécessaire. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20121210 JFM + Verision d'origine. + +### YYYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + +#include "GlobalDefine.h" +#include +#include +#include + +#include "Guipage.h" +#include "MainPage.h" +#include "LogViewPage.h" +#include "LogsListPage.h" +#include "OptionsPage.h" +#include "NetworkZTListPage.h" +#include "NetworkCtrlPage.h" +#include "RemoteZTPage.h" +#include "ZTLogViewerPage.h" +#include "ProgressBarPage.h" +#include "RemoteZTCtrlPage.h" +#include "DatabaseMgrPage.h" +#include "ZTLogsListPage.h" + + + +class Panel : public QGraphicsView +{ + Q_OBJECT + //QFile Ledfd; + +public: + Panel(); + ~Panel(); + // virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); + + void HideWelcomePage(void); + + void ShowMainPage(void); + void HideMainPAge(void); + + +public slots: +// void AudioPageButtonClicked(); +// void mMailMsgButtonPressed(); +// void BusScheduleButtonPressed(); +// void DayScheduleButtonPressed(); + +public: + + QGraphicsScene *scene; + CMainPage *mMainPage; + + //Database mode display + CLogViewPage *mDatabaseModeLogViewPage; + CLogsListPage *mDatabaseModeLogListPage; + COptionsPage *mOptionsPage; + CDatabaseMgrPage *mDatabaseMgrPage; + + //Network mode display + CNetworkZTListPage *mNetworkZTListPage; + CNetworkCtrlPage *mNetworkCtrlPage; + CRemoteZTPage *mRemoteZTPage; + CZTLogViewerPage *mZTLogViewerPage; + CLogViewPage *mNetworkModeLogViewPage; + CLogsListPage *mNetworkModeLogListPage; + CRemoteZTCtrlPage *mRemoteZTCtrlPage; + CZTLogViewerPage *mZTLogFileViewerPage; + + //ZTLogs mode display + CZTLogsListPage *mZTLogsListPage; + + CProgressBarPage *mProgressBarPage; +}; + +#endif // PANEL_H diff --git a/sources/NetworkManager.cpp b/sources/NetworkManager.cpp new file mode 100644 index 0000000..64ee951 --- /dev/null +++ b/sources/NetworkManager.cpp @@ -0,0 +1,500 @@ +#include "NetworkManager.h" +#include +#include "OutilZT.h" + +CNetworkManager CNetworkManager::mSingleton; + +CNetworkManager::CNetworkManager(QObject *parent) : + QObject(parent) +{ + mConfig = 0; + mCurZTID = 0; + mProgramHandle = 0; + mZTUDPSocket = 0; + mUDPServerAdress = QHostAddress::Null; + + mNetworkSMState = NETWORK_SM_STANDBY_STATE; + mOnlineCheckNetworkSMState = NETWORK_ONLINE_CHK_SM_STANDBY_STATE; + + // mZTTcpSocket.setSocketOption(QAbstractSocket::LowDelayOption,1); + connect(&mZTTcpSocket,SIGNAL(connected()),this,SLOT(SocketConnected())); + connect(&mZTTcpSocket,SIGNAL(disconnected()),this,SLOT(SocketDisconnected())); + connect(&mZTTcpSocket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(SocketError(QAbstractSocket::SocketError))); + connect(&mZTTcpSocket,SIGNAL(readyRead()),this,SLOT(SocketDataReady())); + + mZTOnlineCheckingSocket.setSocketOption(QAbstractSocket::LowDelayOption,1); + connect(&mZTOnlineCheckingSocket,SIGNAL(connected()),this,SLOT(OnlineCheckSocketConnected())); + connect(&mZTOnlineCheckingSocket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(OnlineCheckSocketError(QAbstractSocket::SocketError))); + +} +CNetworkManager::~CNetworkManager() +{ + mZTTcpSocket.disconnectFromHost(); + mZTOnlineCheckingSocket.disconnectFromHost(); +} + +void CNetworkManager::BindPointers(COutilZT *ProgramHandle) +{ + mProgramHandle = ProgramHandle; +} + +void CNetworkManager::OnlineCheckStateMachine(eNetworkSMEvent event) +{ + switch(mOnlineCheckNetworkSMState) + { + case NETWORK_ONLINE_CHK_SM_INIT_STATE: + { + break; + } + case NETWORK_ONLINE_CHK_SM_STANDBY_STATE: + { + break; + } + case NETWORK_ONLINE_CHK_SM_CHECK_CONNECTIONS_STATE: + { + switch(event) + { + case NETWORK_SM_SOCKET_CONNECTED_EVENT: + { +// qDebug("%s Connected",mConfig->mNetworkCfgList.at(mCurZTID).mIPAdress.toAscii().data()); + emit NetworkZTConnectionStatus(mOnlineCheckZTID,ZT_NETWORK_ONLINE_STATUS); + break; + } + case NETWORK_SM_SOCKET_ERROR_EVENT: + { +// qDebug("%s Not connected",mConfig->mNetworkCfgList.at(mCurZTID).mIPAdress.toAscii().data()); + emit NetworkZTConnectionStatus(mOnlineCheckZTID,ZT_NETWORK_OFFLINE_STATUS); + break; + } + case NETWORK_SM_SOCKET_DISCONNECTED_EVENT: + { + //Nothing to do here but we need to manage it because it will be received each time we disconnect. + return; + break; + } + default: + { +// qDebug("Unmanaged event in NETWORK_ONLINE_CHK_SM_CHECK_CONNECTIONS_STATE : %d",event); + return; + break; + } + } + + mOnlineCheckZTID++; + if(mNetworkSMState != NETWORK_SM_STANDBY_STATE) + { + //Skip the connected ZT if there is one. + if(mOnlineCheckZTID == mCurZTID) + { + mOnlineCheckZTID++; + } + } + if(mOnlineCheckZTID >= NB_ZT_ID) + { + mOnlineCheckNetworkSMState = NETWORK_ONLINE_CHK_SM_STANDBY_STATE; + mZTOnlineCheckingSocket.disconnectFromHost(); + } + else + { + mZTOnlineCheckingSocket.disconnectFromHost(); +// qDebug("Attempting to connect to %s",mConfig->mNetworkCfgList.at(mOnlineCheckZTID).mIPAdress.toAscii().data()); + emit NetworkZTConnectionStatus(mOnlineCheckZTID,ZT_NETWORK_SEARCHING_STATUS); + mZTOnlineCheckingSocket.connectToHost(mConfig->mNetworkCfgList.at(mOnlineCheckZTID).mIPAdress,ZT_TCP_PORT); + } + break; + } + } +} + +void CNetworkManager::NetworkStateMachine(eNetworkSMEvent event) +{ + switch(mNetworkSMState) + { + case NETWORK_SM_INIT_STATE: + { + break; + } + case NETWORK_SM_STANDBY_STATE: + { + break; + } + case NETWORK_SM_INITIATE_CLIENT_CONNECTION_STATE: + { + switch(event) + { + case NETWORK_SM_SOCKET_CONNECTED_EVENT: + { + qDebug("%s Connected",mConfig->mNetworkCfgList.at(mCurZTID).mIPAdress.toAscii().data()); + emit NetworkZTConnected(mCurZTID); + emit NetworkZTConnectionStatus(mCurZTID,ZT_NETWORK_CONNECTED_STATUS); + + //RequestHeartbeat(); + //mZTTcpSocket.write(GetStationNameReqPacket()); + TCPTxRequest(GetStationNameReqPacket()); + mNetworkSMState = NETWORK_SM_CLIENT_CONNECTED_STATE; + break; + } + case NETWORK_SM_SOCKET_ERROR_EVENT: + { + qDebug("%s Socket error",mConfig->mNetworkCfgList.at(mCurZTID).mIPAdress.toAscii().data()); + emit NetworkZTConnectionError(mCurZTID); + mNetworkSMState = NETWORK_SM_STANDBY_STATE; + break; + } + case NETWORK_SM_SOCKET_DISCONNECTED_EVENT: + { + mNetworkSMState = NETWORK_SM_STANDBY_STATE; + emit NetworkZTConnectionStatus(mOnlineCheckZTID,ZT_NETWORK_UNKNOWN_STATUS); + emit NetworkZTConnectionError(mCurZTID); + break; + } + default: + { + mNetworkSMState = NETWORK_SM_STANDBY_STATE; + qDebug("Invalid event in NETWORK_SM_INITIATE_CLIENT_CONNECTION_STATE : %d",event); + break; + } + } + break; + } + case NETWORK_SM_CLIENT_CONNECTED_STATE: + { + switch(event) + { + case NETWORK_SM_SOCKET_ERROR_EVENT: + { + qDebug("%s Socket error",mConfig->mNetworkCfgList.at(mCurZTID).mIPAdress.toAscii().data()); + break; + } + case NETWORK_SM_SOCKET_DISCONNECTED_EVENT: + { + emit NetworkZTDisconnected(mCurZTID); + emit NetworkZTConnectionStatus(mCurZTID,ZT_NETWORK_UNKNOWN_STATUS); + mNetworkSMState = NETWORK_SM_STANDBY_STATE; + //qDebug("%s Disconnected",mConfig->mNetworkCfgList.at(mCurZTID).mIPAdress.toAscii().data()); + qDebug("TCP Socket disconnected"); + break; + } + default: + { + qDebug("Unmanaged event in NETWORK_SM_CLIENT_CONNECTED_STATE : %d",event); + break; + } + } + break; + } + default: + { + break; + } + } +} + +unsigned int CNetworkManager::InitUDPConnection(int ZTID) +{ + mZTUDPSocket = new QUdpSocket(this); + if(mZTUDPSocket->bind(QHostAddress::Any,ZT_UDP_PORT) == false) + return RET_ERROR; + + mUDPServerAdress = QHostAddress(mConfig->mNetworkCfgList.at(ZTID).mIPAdress); + + connect(mZTUDPSocket,SIGNAL(readyRead()),this,SLOT(UDPSocketDataReady())); + + QByteArray packet = GetInitUDPConnectionPacket(); + mZTUDPSocket->writeDatagram(packet,mUDPServerAdress,ZT_UDP_PORT); + + return RET_OK; +} + +unsigned int CNetworkManager::StopUDPStream() +{ + if(mZTUDPSocket == 0) + return RET_ERROR; + + + QByteArray packet = GetCloseUDPConnectionPacket(); + mZTUDPSocket->writeDatagram(packet,mUDPServerAdress,ZT_UDP_PORT); + mZTUDPSocket->waitForBytesWritten(); + + return RET_OK; +} + +unsigned int CNetworkManager::CloseUDPConnection() +{ + if(mZTUDPSocket == 0) + return RET_ERROR; + + +// QByteArray packet = GetCloseUDPConnectionPacket(); +// mZTUDPSocket->writeDatagram(packet,mUDPServerAdress,ZT_UDP_PORT); +// mZTUDPSocket->flush(); + + delete mZTUDPSocket; + mZTUDPSocket = 0; + mUDPServerAdress = QHostAddress::Null; + + return RET_OK; +} + +int CNetworkManager::CheckZTConnectionsStatus() +{ + if(mOnlineCheckNetworkSMState != NETWORK_ONLINE_CHK_SM_STANDBY_STATE) + return RET_ERROR; + + mOnlineCheckZTID = 0; + mOnlineCheckNetworkSMState = NETWORK_ONLINE_CHK_SM_CHECK_CONNECTIONS_STATE; + + emit NetworkZTConnectionStatus(mOnlineCheckZTID,ZT_NETWORK_SEARCHING_STATUS); +// qDebug("Attempting to connect to %s",mConfig->mNetworkCfgList.at(mOnlineCheckZTID).mIPAdress.toAscii().data()); + mZTOnlineCheckingSocket.connectToHost(mConfig->mNetworkCfgList.at(mOnlineCheckZTID).mIPAdress,ZT_TCP_PORT); + + return RET_OK; +} + + +unsigned int CNetworkManager::SetConfig(CSettingsData *Config) +{ + mConfig = Config; + return RET_OK; +} + +unsigned int CNetworkManager::ConnectToZT(int ZTID) +{ + if(ZTID >= NB_ZT_ID) + { + qDebug("Cannot connect: Invalid ZT ID"); + return RET_ERROR; + } + + if(mNetworkSMState != NETWORK_SM_STANDBY_STATE) + { + qDebug("Cannot connect: Invalid State machine state : %d",mNetworkSMState); + return RET_ERROR; + } + + + mCurZTID = ZTID; + mNetworkSMState = NETWORK_SM_INITIATE_CLIENT_CONNECTION_STATE; + mZTTcpSocket.connectToHost(mConfig->mNetworkCfgList.at(mCurZTID).mIPAdress,ZT_TCP_PORT); + qDebug("Connecting to %s", mConfig->mNetworkCfgList.at(mCurZTID).mIPAdress.toAscii().data()); + + return RET_OK; +} + +unsigned int CNetworkManager::DisconnectZT() +{ +// if(mNetworkSMState == NETWORK_SM_STANDBY_STATE) +// return RET_ERROR; + + if(mNetworkSMState != NETWORK_SM_CLIENT_CONNECTED_STATE) + { + qDebug("Aborting connection from ZT. Socket state : %d",mZTTcpSocket.state()); + mZTTcpSocket.abort(); + NetworkStateMachine(NETWORK_SM_SOCKET_DISCONNECTED_EVENT); + } + else + { + qDebug("Disconnecting from ZT. Socket state : %d",mZTTcpSocket.state()); + mZTTcpSocket.disconnectFromHost(); + } + + return RET_OK; +} + +void CNetworkManager::TCPTxRequest(const QByteArray &request) +{ + qDebug() << "Tx request in Network Manager : " << request.size() << " bytes : " << request.toHex(); + emit NetworkTCPTx(); + mZTTcpSocket.write(request); +} + +unsigned int CNetworkManager::RefreshRemoteZTStatus() +{ + if(mNetworkSMState != NETWORK_SM_CLIENT_CONNECTED_STATE) + return RET_ERROR; + + TCPTxRequest(GetZTStatusReqPacket()); + return RET_OK; +} + +unsigned int CNetworkManager::DownloadZTLog() +{ + if(mNetworkSMState != NETWORK_SM_CLIENT_CONNECTED_STATE) + return RET_ERROR; + + TCPTxRequest(GetZTLogDownloadReqPacket()); + + return RET_OK; +} + +unsigned int CNetworkManager::DownloadTrainLogs() +{ + if(mNetworkSMState != NETWORK_SM_CLIENT_CONNECTED_STATE) + return RET_ERROR; + + TCPTxRequest(GetTrainLogsDownloadReqPacket()); + + return RET_OK; +} + +unsigned int CNetworkManager::DeleteRemoteZTLog() +{ + if(mNetworkSMState != NETWORK_SM_CLIENT_CONNECTED_STATE) + return RET_ERROR; + TCPTxRequest(GetDeleteZTLogReqPacket()); + + return RET_OK; +} + +unsigned int CNetworkManager::SetZTFunctions(const CTCPZTFunctionsStatus &ZTFunctions) +{ + if(mNetworkSMState != NETWORK_SM_CLIENT_CONNECTED_STATE) + return RET_ERROR; + + QByteArray data; + QDataStream strm(&data,QIODevice::WriteOnly); + strm.device()->seek(0); + + strm << ZTFunctions; + + TCPTxRequest(GetSetZTFunctionsPacket(data)); + + return RET_OK; +} + + +//slots +void CNetworkManager::SocketConnected() +{ + qDebug("Socket connected slot"); + NetworkStateMachine(NETWORK_SM_SOCKET_CONNECTED_EVENT); +} +void CNetworkManager::SocketDisconnected() +{ + qDebug("Socket disconnected slot"); + NetworkStateMachine(NETWORK_SM_SOCKET_DISCONNECTED_EVENT); +} +void CNetworkManager::SocketError(QAbstractSocket::SocketError socketError) +{ + qDebug("Socket error slot. Error:[%d]",socketError); + NetworkStateMachine(NETWORK_SM_SOCKET_ERROR_EVENT); +} +void CNetworkManager::SocketDataReady() +{ +// qDebug() << "Socket data ready:" << mZTTcpSocket.bytesAvailable(); + emit NetworkTCPRx(); + AnalyzeNewData(mZTTcpSocket.readAll()); +} +void CNetworkManager::OnlineCheckSocketConnected() +{ + OnlineCheckStateMachine(NETWORK_SM_SOCKET_CONNECTED_EVENT); +} +void CNetworkManager::OnlineCheckSocketError(QAbstractSocket::SocketError socketError) +{ + OnlineCheckStateMachine(NETWORK_SM_SOCKET_ERROR_EVENT); +} + +void CNetworkManager::TCPRxHeartbeat() +{ + qDebug() << "TCP: Received Heartbeat"; +} + +void CNetworkManager::TCPRxStationName(QString Name) +{ + qDebug() << "TCP: Received station name:" << Name; + mProgramHandle->RxStationName(Name); + + mZTTcpSocket.write(GetZTStatusReqPacket()); +} + +void CNetworkManager::TCPRxZTStatus(const QByteArray &data) +{ + + CTCPZTStatus status; + + QDataStream stream(data); + stream.device()->seek(0); + + stream >> status; + + qDebug() << "TCP: Received ZT Status"; + + mProgramHandle->RxZTStatus(status); +} + +void CNetworkManager::TCPRxZTLog(QString ZTLog) +{ + mProgramHandle->RxZTLog(ZTLog); +} + +void CNetworkManager::TCPRxTrainLogsDownladAck(qint32 NbFiles) +{ + qDebug("TCP: Received downoad train files ack : %d",NbFiles); + mProgramHandle->DownloadTrainLogsBegin(NbFiles); + + + mZTTcpSocket.write(GetTrainLogsFileDataAckPacket((qint32)TCP_PROTOCOL_ACK)); +} + +void CNetworkManager::TCPRxTrainLogFileData(const QByteArray &TrainFileData) +{ + QDataStream strm(TrainFileData); + strm.device()->seek(0); + + QString LogFilePathName; + strm >> LogFilePathName; + + LogFilePathName.prepend(mProgramHandle->GetTrainLogsTempPath()); + + QFile* BinaryLogFile = new QFile(LogFilePathName); + if(BinaryLogFile) + { + if(BinaryLogFile->open(QIODevice::WriteOnly) == false) + { + qDebug("Could not create log file : %s",LogFilePathName.toLatin1().data()); + delete BinaryLogFile; + return; + } + } + + BinaryLogFile->write(strm.device()->readAll()); + + BinaryLogFile->close(); + delete BinaryLogFile; + + mProgramHandle->RxTrainLogData(LogFilePathName); + + mZTTcpSocket.write(GetTrainLogsFileDataAckPacket((qint32)TCP_PROTOCOL_ACK)); +} + +void CNetworkManager::TCPRxTrainLogsDownloadFinished() +{ + mProgramHandle->RxTrainLogsDownloadFinished(); +} + +void CNetworkManager::TCPRxDeleteZTLogAck(bool success) +{ + mProgramHandle->RemoteZTLogDeleted(success); +} + +void CNetworkManager::TCPRxSetZTFunctionsAck(bool ack) +{ + mProgramHandle->SetZTFunctionsSatusDone(ack); +} + +void CNetworkManager::UDPSocketDataReady() +{ + +} + + + + + + + + + + + + diff --git a/sources/NetworkManager.h b/sources/NetworkManager.h new file mode 100644 index 0000000..d431412 --- /dev/null +++ b/sources/NetworkManager.h @@ -0,0 +1,127 @@ +#ifndef NETWORKMANAGER_H +#define NETWORKMANAGER_H + +#include +#include "GlobalDefine.h" +#include "ZTData.h" +#include +#include +#include "TCPProtocol.h" +#include "UDPProtocol.h" + +class COutilZT; + +class CNetworkManager : public QObject, public CTCPProtocol, public CUDPProtocol +{ + Q_OBJECT +public: + + enum eZTNetworkStatus + { + ZT_NETWORK_OFFLINE_STATUS, + ZT_NETWORK_ONLINE_STATUS, + ZT_NETWORK_SEARCHING_STATUS, + ZT_NETWORK_UNKNOWN_STATUS, + ZT_NETWORK_CONNECTED_STATUS + }; + + static CNetworkManager* instance(){return &mSingleton;} + static CNetworkManager mSingleton; + + explicit CNetworkManager(QObject *parent = 0); + ~CNetworkManager(); + + void BindPointers(COutilZT *ProgramHandle); + unsigned int SetConfig(CSettingsData *Config); + unsigned int ConnectToZT(int ZTID); + unsigned int DisconnectZT(); + unsigned int RefreshRemoteZTStatus(); + unsigned int DownloadZTLog(); + unsigned int DownloadTrainLogs(); + unsigned int DeleteRemoteZTLog(); + unsigned int SetZTFunctions(const CTCPZTFunctionsStatus &ZTFunctions); + + unsigned int InitUDPConnection(int ZTID); + unsigned int StopUDPStream(); + unsigned int CloseUDPConnection(); + + int CheckZTConnectionsStatus(); + + virtual void TCPTxRequest(const QByteArray &request); + virtual void TCPRxHeartbeat(); + virtual void TCPRxStationName(QString Name); + virtual void TCPRxZTStatus(const QByteArray &data); + virtual void TCPRxZTLog(QString ZTLog); + virtual void TCPRxTrainLogsDownladAck(qint32 NbFiles); + virtual void TCPRxTrainLogFileData(const QByteArray &TrainFileData); + virtual void TCPRxTrainLogsDownloadFinished(); + virtual void TCPRxDeleteZTLogAck(bool success); + virtual void TCPRxSetZTFunctionsAck(bool ack); + +private: + typedef enum + { + NETWORK_SM_INIT_STATE, + NETWORK_SM_STANDBY_STATE, + NETWORK_SM_INITIATE_CLIENT_CONNECTION_STATE, + NETWORK_SM_CLIENT_CONNECTED_STATE + + }eNetworkSMState; + + typedef enum + { + NETWORK_ONLINE_CHK_SM_INIT_STATE, + NETWORK_ONLINE_CHK_SM_STANDBY_STATE, + NETWORK_ONLINE_CHK_SM_CHECK_CONNECTIONS_STATE + }eNetworkOnlineCheckSMState; + + typedef enum + { + NETWORK_SM_TIMER_EVENT, + NETWORK_SM_SOCKET_CONNECTED_EVENT, + NETWORK_SM_SOCKET_DISCONNECTED_EVENT, + NETWORK_SM_DATA_RX_EVENT, + NETWORK_SM_DATA_SEND_EVENT, + NETWORK_SM_SOCKET_ERROR_EVENT + }eNetworkSMEvent; + + void NetworkStateMachine(eNetworkSMEvent event); + void OnlineCheckStateMachine(eNetworkSMEvent event); + + QTcpSocket mZTTcpSocket; + QTcpSocket mZTOnlineCheckingSocket; + QUdpSocket *mZTUDPSocket; + QHostAddress mUDPServerAdress; + CSettingsData *mConfig; + eNetworkSMState mNetworkSMState; + eNetworkOnlineCheckSMState mOnlineCheckNetworkSMState; + + + int mCurZTID; + int mOnlineCheckZTID; + COutilZT *mProgramHandle; + + + +signals: + void NetworkZTConnectionStatus(int,int); + void NetworkZTConnected(int); + void NetworkZTDisconnected(int); + void NetworkZTConnectionError(int); + void NetworkTCPTx(); + void NetworkTCPRx(); + +public slots: + + void SocketConnected(); + void SocketDisconnected(); + void SocketError(QAbstractSocket::SocketError socketError); + void SocketDataReady(); + void OnlineCheckSocketError(QAbstractSocket::SocketError socketError); + void OnlineCheckSocketConnected(); + + void UDPSocketDataReady(); + +}; + +#endif // NETWORKMANAGER_H diff --git a/sources/OutilZT.cpp b/sources/OutilZT.cpp new file mode 100644 index 0000000..81db163 --- /dev/null +++ b/sources/OutilZT.cpp @@ -0,0 +1,736 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Cette classe est considérée comme l'instance du programme qui + initialise et démarre tous les objets nécessaires. + Elle assure aussi la synchronisation de ces derniers à l'aide de sa + machine à états. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20121214 JFM + Verision d'origine. + +### YYYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + +#include "OutilZT.h" +#include +#include +#include "NetworkManager.h" + +#include +#include +#include + + +COutilZT::COutilZT() +{ + panel.installEventFilter(this); //Install an event filter for CZoneTest to manage some events from GUI + +} +COutilZT::~COutilZT() +{ +} + + + +unsigned int COutilZT::Start() +{ + QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); + + + + panel.mDatabaseModeLogListPage->mLogMgrHandle = &mDatabaseModeLogManager; + panel.mDatabaseModeLogListPage->mProgramHandle = this; + panel.mMainPage->mProgramHandle = this; + panel.mOptionsPage->mProgramHandle = this; + if(mIsEngMode == true) + { + panel.mOptionsPage->EnableEngineeringMode(); + } + panel.mNetworkCtrlPage->mProgramHandle = this; + panel.mDatabaseMgrPage->mProgramHandle = this; + panel.mDatabaseMgrPage->mLogMgrHandle = &mDatabaseModeLogManager; + panel.mDatabaseMgrPage->mZTLogFilesManager = &mZTLogFilesManager; + if(mIsEngMode == true) + { + panel.mDatabaseMgrPage->EnableEngineeringMode(); + } + if(mCanImport == true) + { + panel.mDatabaseMgrPage->EnableLogImport(); + } + + mDatabaseModeLogManager.mProgramHandle = this; + panel.mNetworkModeLogListPage->mProgramHandle = this; + panel.mNetworkModeLogListPage->mLogMgrHandle = &mNetworkModeLogManager; + panel.mNetworkModeLogViewPage->mProgramHandle = this; + mNetworkModeLogManager.mProgramHandle = this; + panel.mRemoteZTCtrlPage->mProgramHandle = this; + panel.mZTLogsListPage->mProgramHandle = this; + panel.mZTLogsListPage->mZTLogFilesManager = &mZTLogFilesManager; + if(mIsEngMode == true) + { + panel.mDatabaseModeLogListPage->EnableEngineeringMode(); + panel.mNetworkModeLogListPage->EnableEngineeringMode(); + } + + + + + mSettingsFileMgr.LoadSettings(&mSettingsData); + + + + CNetworkManager::instance()->BindPointers(this); + CNetworkManager::instance()->SetConfig(&mSettingsData); + panel.mNetworkZTListPage->SetConfig(&mSettingsData); + panel.mOptionsPage->SetSettings(&mSettingsData); + connect(CNetworkManager::instance(),SIGNAL(NetworkZTConnectionStatus(int,int)),panel.mNetworkZTListPage,SLOT(ZTNetworkStatusChanged(int,int))); + connect(CNetworkManager::instance(),SIGNAL(NetworkZTConnected(int)),panel.mNetworkCtrlPage,SLOT(NetworkZTConnected(int))); + connect(CNetworkManager::instance(),SIGNAL(NetworkZTConnectionError(int)),panel.mNetworkCtrlPage,SLOT(NetworkZTConnectionFailed(int))); + connect(CNetworkManager::instance(),SIGNAL(NetworkZTDisconnected(int)),panel.mNetworkCtrlPage,SLOT(NetworkZTConnectionFailed(int))); + connect(CNetworkManager::instance(),SIGNAL(NetworkTCPRx()),panel.mNetworkCtrlPage,SLOT(NetworkRx())); + connect(CNetworkManager::instance(),SIGNAL(NetworkTCPTx()),panel.mNetworkCtrlPage,SLOT(NetworkTx())); + + connect(CNetworkManager::instance(),SIGNAL(NetworkZTConnected(int)),panel.mRemoteZTPage,SLOT(NetworkZTConnected(int))); + connect(CNetworkManager::instance(),SIGNAL(NetworkZTDisconnected(int)),panel.mRemoteZTPage,SLOT(NetworkZTDisconnected(int))); + +// panel.mDatabaseModeLogListPage->RefreshList(); +// panel.mZTLogsListPage->RefreshList(); + + //Show Graphic User Interface. + panel.setWindowTitle("Outil Zone Test"); + panel.show(); + + + mDatabaseModeLogManager.mProgramHandle = this; + mDatabaseModeLogManager.SetLogDataDir(GetLogDataPath()); + mDatabaseModeLogManager.ParseLogs(); + mNetworkModeLogManager.mProgramHandle = this; + mNetworkModeLogManager.SetLogDataDir(GetTrainLogsTempPath()); + // mNetworkModeLogManager.ParseLogs(); + mZTLogFilesManager.mProgramHandle = this; + mZTLogFilesManager.SetLogDataDir(GetLogDataPath()); + mZTLogFilesManager.ParseZTLogFiles(false); + + mOutilZTMode = MODE_INVALID; + // EnterNetworkModeRequest(); + EnterDatabaseModeRequest(); + + mRebuildingDB = false; + + // CNetworkManager::instance()->CheckZTConnectionsStatus(); + + + + + return RET_OK; +} + + +unsigned int COutilZT::InitZT() +{ + return RET_OK; +} + +void COutilZT::LogViewRequest(CLogElement *element, CLogsListPage *caller) +{ + if(caller == panel.mDatabaseModeLogListPage) + { + panel.mDatabaseModeLogViewPage->SetLogData(element); + } + else if(caller == panel.mNetworkModeLogListPage) + { + panel.mNetworkModeLogViewPage->SetLogData(element); + ShowNetworkModeLogViewRequest(); + } +} + +unsigned int COutilZT::SetLogProtection(bool Protection, CLogElement* Element, CLogsListPage *Caller) +{ + if(Caller == panel.mDatabaseModeLogListPage) + { + if(mDatabaseModeLogManager.ProtectLogElementFile(Protection,Element) == RET_OK) + { + return RET_OK; + } + } + + return RET_ERROR; +} + + +void COutilZT::LogViewCloseRequest(CLogViewPage *caller) +{ + if(caller == panel.mNetworkModeLogViewPage) + { + HideNetworkModeLogViewRequest(); + } +} + +void COutilZT::ShowOptionsRequest() +{ + panel.mOptionsPage->show(); +} + +void COutilZT::HideOptionsRequest() +{ + panel.mOptionsPage->hide(); +} + +void COutilZT::ShowDatabaseMgrRequest() +{ + panel.mDatabaseMgrPage->show(); +} + +void COutilZT::HideDatabaseMgrRequest() +{ + panel.mDatabaseMgrPage->hide(); +} + +void COutilZT::EnterDatabaseModeRequest() +{ + if(mOutilZTMode == MODE_DATABASE) + return; + + panel.mNetworkZTListPage->hide(); + panel.mNetworkCtrlPage->hide(); + panel.mRemoteZTPage->hide(); + panel.mNetworkModeLogListPage->hide(); + panel.mNetworkModeLogViewPage->hide(); + panel.mRemoteZTCtrlPage->hide(); + + panel.mZTLogsListPage->hide(); + panel.mZTLogFileViewerPage->hide(); + + panel.mDatabaseModeLogListPage->show(); + panel.mDatabaseModeLogViewPage->show(); + + + + + + + + mOutilZTMode = MODE_DATABASE; +} + +void COutilZT::EnterNetworkModeRequest() +{ + if(mOutilZTMode == MODE_NETWORK) + return; + + panel.mDatabaseModeLogListPage->hide(); + panel.mDatabaseModeLogViewPage->hide(); + + panel.mNetworkZTListPage->show(); + panel.mNetworkCtrlPage->show(); + panel.mRemoteZTPage->show(); + panel.mNetworkModeLogListPage->show(); + panel.mNetworkModeLogViewPage->hide(); + panel.mRemoteZTCtrlPage->hide(); + + panel.mZTLogsListPage->hide(); + panel.mZTLogFileViewerPage->hide(); + + mOutilZTMode = MODE_NETWORK; +} + +void COutilZT::EnterZTLogModeRequest() +{ + if(mOutilZTMode == MODE_ZTLOG) + return; + + panel.mDatabaseModeLogListPage->hide(); + panel.mDatabaseModeLogViewPage->hide(); + + panel.mNetworkZTListPage->hide(); + panel.mNetworkCtrlPage->hide(); + panel.mRemoteZTPage->hide(); + panel.mNetworkModeLogListPage->hide(); + panel.mNetworkModeLogViewPage->hide(); + panel.mRemoteZTCtrlPage->hide(); + + panel.mZTLogsListPage->show(); + panel.mZTLogFileViewerPage->show(); + + + mOutilZTMode = MODE_ZTLOG; + + +} + +void COutilZT::ShowZTLogRequest(QString Log,QString FocusText,int line) +{ + panel.mZTLogViewerPage->SetZTLogText(Log,FocusText); + if(line != -1) + panel.mZTLogViewerPage->ScrollToLine(line); + + panel.mZTLogViewerPage->show(); +} + +void COutilZT::ShowNetworkModeLogViewRequest() +{ + // panel.mRemoteZTPage->hide(); + panel.mNetworkModeLogListPage->hide(); + panel.mNetworkModeLogViewPage->show(); +} + +void COutilZT::HideNetworkModeLogViewRequest() +{ +// panel.mRemoteZTPage->show(); + panel.mNetworkModeLogListPage->show(); + panel.mNetworkModeLogViewPage->hide(); +} + +void COutilZT::ShowRemoteControlPage() +{ + panel.mRemoteZTPage->show(); + panel.mNetworkModeLogListPage->hide(); + panel.mNetworkModeLogViewPage->hide(); + panel.mRemoteZTCtrlPage->show(); +} + +void COutilZT::ShowRemoteTrainLogsViewPages() +{ + panel.mRemoteZTPage->show(); + panel.mNetworkModeLogListPage->show(); + panel.mNetworkModeLogViewPage->hide(); + panel.mRemoteZTCtrlPage->hide(); +} +void COutilZT::ShowRemoteLiveZTPage() +{ + panel.mRemoteZTPage->hide(); + panel.mNetworkModeLogListPage->hide(); + panel.mNetworkModeLogViewPage->hide(); + panel.mRemoteZTCtrlPage->hide(); +} + +QString COutilZT::GetLogDataPath() +{ + return mSettingsData.mDataSourceDirectoryPath; +} + +QString COutilZT::GetTrainLogsTempPath() +{ + return QString("./Temp/"); +} + +void COutilZT::CleanTrainLogsTempPath() +{ + QDir TrainLogsTempDir(GetTrainLogsTempPath()); + + TrainLogsTempDir.setFilter(QDir::Files | QDir::NoDotAndDotDot); + QFileInfoList fileslist = TrainLogsTempDir.entryInfoList(); + for(int i = 0; i < fileslist.size(); i++) + { + QDir().remove(fileslist.at(i).filePath()); + } +} + +unsigned int COutilZT::DataSourceDirChanged(QString NewPath) +{ + mSettingsData.mDataSourceDirectoryPath = NewPath; + mSettingsFileMgr.SaveSettings(&mSettingsData); + mDatabaseModeLogManager.SetLogDataDir(NewPath); + mZTLogFilesManager.SetLogDataDir(NewPath); + LogsDatabaseChanged(0); + + return RET_OK; +} + +unsigned int COutilZT::NetworkDataChanged() +{ + mSettingsFileMgr.SaveSettings(&mSettingsData); + + //todo: Notify network manager... + return RET_OK; +} + +unsigned int COutilZT::LogsDatabaseChanged(QStringList *NewLogs) +{ + if(NewLogs == 0) + { + mDatabaseModeLogManager.ParseLogs(true,false); + } + else + { + mDatabaseModeLogManager.ParseImportedLogs(NewLogs); + } + + +// ZTLogFilesChanged(); + mZTLogFilesManager.ParseZTLogFiles(true); + return RET_OK; +} + +unsigned int COutilZT::RebuildDatabaseFile() +{ + mDatabaseModeLogManager.ParseLogs(true,false); + // mRebuildingDB = true; + mZTLogFilesManager.ParseZTLogFiles(true); + return RET_OK; +} + +unsigned int COutilZT::LogsDatabaseLoaded(CLogMgr *Caller, int Status) +{ + if(Caller == &mDatabaseModeLogManager) + { + // QMessageBox::information(0,"Parsing Finished","Parsing finished"); + if(Status == 1) + { + panel.mDatabaseModeLogListPage->RefreshList(); + panel.mDatabaseMgrPage->UpdateDBStats(); +// if(mRebuildingDB) +// { +// mZTLogFilesManager.ParseZTLogFiles(true); +// mRebuildingDB = false; +// } + } + else + { + QMessageBox::information(0,"Erreur","Impossible de charger la base de données"); + } + panel.mProgressBarPage->hide(); + } + if(Caller == &mNetworkModeLogManager) + { + panel.mNetworkModeLogListPage->RefreshList(); + } + + return RET_OK; +} + +unsigned int COutilZT::UpdateLogsList(CLogMgr *Caller) +{ + if(Caller == &mDatabaseModeLogManager) + { + panel.mDatabaseModeLogListPage->RefreshList(); + } + if(Caller == &mNetworkModeLogManager) + { + panel.mNetworkModeLogListPage->RefreshList(); + } + return RET_OK; +} + +unsigned int COutilZT::DatabaseFetchingBegin(CLogMgr *Caller) +{ + if(Caller == &mDatabaseModeLogManager) + { + panel.mProgressBarPage->SetProgressBarRange(0); + panel.mProgressBarPage->SetTitle("Chargement de la base de données"); + panel.mProgressBarPage->SetMiscLabel(""); + panel.mProgressBarPage->show(); + } + return RET_OK; +} + +unsigned int COutilZT::DatabaseFetchingTick(CLogMgr *Caller,int Index) +{ +// qDebug() << "Rx new Train Log: " << FileName; + + if(Caller == &mDatabaseModeLogManager) + { + panel.mProgressBarPage->Tick(); + panel.mProgressBarPage->SetMiscLabel(QString("%1 passages chargés").arg(Index)); + } + + return RET_OK; +} + + +unsigned int COutilZT::ZTLogFilesChanged() +{ + mZTLogFilesManager.SaveDatabaseFile(); + mZTLogFilesManager.ParseZTLogFiles(false); + + + return RET_OK; +} + + + +unsigned int COutilZT::ShowZTLogFile(QString FilePath) +{ + panel.mZTLogFileViewerPage->SetZTLogText(FilePath); + return RET_OK; +} + +unsigned int COutilZT::ZTLogFilesDatabaseLoaded(CZTLogFilesMgr *Caller, int Status) +{ + if(Caller == &mZTLogFilesManager) + { + if(Status == 1) + { + panel.mZTLogsListPage->RefreshList(); + panel.mDatabaseMgrPage->UpdateDBStats(); +// panel.mProgressBarPage->hide(); + } + else + { + // QMessageBox::information(0,"Parsing failed","Parsing failed"); + } + } + + return RET_OK; +} + +unsigned int COutilZT::ZTLogFilesFetchingBegin(CZTLogFilesMgr *Caller) +{ + if(Caller == &mZTLogFilesManager) + { +// panel.mProgressBarPage->SetProgressBarRange(0); +// panel.mProgressBarPage->SetTitle("Chargement des fichiers LOG"); +// panel.mProgressBarPage->SetMiscLabel(""); +// panel.mProgressBarPage->show(); + } + return RET_OK; + +} + +unsigned int COutilZT::ZTLogFilesFetchingTick(CZTLogFilesMgr *Caller, int Index, QString File) +{ + if(Caller == &mZTLogFilesManager) + { +// panel.mProgressBarPage->Tick(); +// panel.mProgressBarPage->SetMiscLabel(QString("%1 passages chargés : %2").arg(Index).arg(File)); + } + + return RET_OK; +} + +unsigned int COutilZT::ConnectToZTRequest() +{ + int ID = panel.mNetworkZTListPage->GetSelectedZT(); + CNetworkManager::instance()->ConnectToZT(ID); + return RET_OK; +} + +unsigned int COutilZT::RxStationName(QString StationName) +{ + panel.mRemoteZTPage->SetRemoteZTName(StationName); + return RET_OK; +} + +unsigned int COutilZT::DisconnectZTRequest() +{ + return CNetworkManager::instance()->DisconnectZT(); +} + +unsigned int COutilZT::RefreshRemoteZTStatusRequest() +{ + + if(CNetworkManager::instance()->RefreshRemoteZTStatus() == RET_OK) + { + panel.mNetworkCtrlPage->DisableNetworkButtons(); + return RET_OK; + } + + return RET_ERROR; +} + +unsigned int COutilZT::RxZTStatus(const CTCPZTStatus &status) +{ + panel.mNetworkCtrlPage->EnableNetworkButtons(); + panel.mRemoteZTPage->SetRemoteZTStatus(&status); + panel.mRemoteZTCtrlPage->UpdateDisplay(&status); + return RET_OK; +} + +unsigned int COutilZT::DownloadZTLogRequest() +{ + if(CNetworkManager::instance()->DownloadZTLog() == RET_OK) + { + panel.mNetworkCtrlPage->DisableNetworkButtons(); + return RET_OK; + } + return RET_ERROR; +} + +unsigned int COutilZT::RxZTLog(QString ZTLog) +{ + panel.mNetworkCtrlPage->EnableNetworkButtons(); + panel.mZTLogViewerPage->SetZTLogText(ZTLog); + panel.mZTLogViewerPage->show(); + return RET_OK; +} + +unsigned int COutilZT::DownloadTrainLogsRequest() +{ + if(CNetworkManager::instance()->DownloadTrainLogs() == RET_OK) + { + panel.mNetworkCtrlPage->DisableNetworkButtons(); + return RET_OK; + } + + return RET_ERROR; +} + +unsigned int COutilZT::DownloadTrainLogsBegin(int NbLogs) +{ + CleanTrainLogsTempPath(); + panel.mProgressBarPage->SetProgressBarRange(NbLogs); + panel.mProgressBarPage->SetTitle(QString("Réception de %1 fichiers").arg(NbLogs)); + panel.mProgressBarPage->SetMiscLabel(""); + panel.mProgressBarPage->show(); + + return RET_OK; +} + +unsigned int COutilZT::RxTrainLogData(QString FileName) +{ + + qDebug() << "Rx new Train Log: " << FileName; + panel.mProgressBarPage->Tick(); + panel.mProgressBarPage->SetMiscLabel(QString("Réception: %1").arg(FileName)); + return RET_OK; + + +} + +unsigned int COutilZT::RxTrainLogsDownloadFinished() +{ + panel.mNetworkCtrlPage->EnableNetworkButtons(); + qDebug("TrainLogs download finished"); + mNetworkModeLogManager.ParseLogs(); + panel.mNetworkModeLogListPage->RefreshList(); + panel.mProgressBarPage->hide(); + + return RET_OK; +} + +unsigned int COutilZT::DeleteRemoteZTLogRequest() +{ + if(CNetworkManager::instance()->DeleteRemoteZTLog() == RET_OK) + { + panel.mNetworkCtrlPage->DisableNetworkButtons(); + return RET_OK; + } + return RET_ERROR; +} + +unsigned int COutilZT::RemoteZTLogDeleted(bool Success) +{ + panel.mNetworkCtrlPage->EnableNetworkButtons(); + return RET_OK; +} + +unsigned int COutilZT::SetZTFunctionsStatus(CTCPZTFunctionsStatus status) +{ + if(CNetworkManager::instance()->SetZTFunctions(status) == RET_OK) + { + panel.mNetworkCtrlPage->DisableNetworkButtons(); + return RET_OK; + } + return RET_ERROR; +} + +unsigned int COutilZT::SetZTFunctionsSatusDone(bool succes) +{ + panel.mNetworkCtrlPage->EnableNetworkButtons(); + return RET_OK; +} + +//Catch and manage some events from the graphics user interface +//like the keyboard Exit sequence (Ctrl-F10) +bool COutilZT::eventFilter(QObject *obj, QEvent *event) +{ + if(obj == &panel) //Check if event is coming from the GUI + { + if(event->type() == QEvent::KeyPress) + { + QKeyEvent *KeyEvent = static_cast(event); + + //Check if we received CTRL-F10 + if(KeyEvent->key() == Qt::Key_F10 && + KeyEvent->modifiers() == Qt::ControlModifier) + { + QApplication::exit(78); //Quit the application + return true; //keep the keystroke + } + } + } + + return QObject::eventFilter(obj,event); + +} + +QString COutilZT::GetStationName(int StationID) +{ + switch(StationID) + { + case ANGRIGNON_ZT_ID: + { + return QString("Angrignon"); + break; + } + case HONORE_BEAUGRAND_ZT_ID: + { + return QString("Honoré-Beaugrand"); + break; + } + case LONGUEUIL_ZT_ID: + { + return QString("Longueuil"); + break; + } + case BERRI_UQAM_ZT_ID: + { + return QString("Berri-UQAM"); + break; + } + case SNOWDON_ZT_ID: + { + return QString("Snowdon"); + break; + } + case SAINT_MICHEL_ZT_ID: + { + return QString("Saint-Michel"); + break; + } + case COTE_VERTU_ZT_ID: + { + return QString("Côte-Vertu"); + break; + } + case HENRI_BOURASSA_ZT_ID: + { + return QString("Henri-Bourassa"); + break; + } + case MONTMORENCY_ZT_ID: + { + return QString("Montmorency"); + break; + } + case MONTMORENCY_10_12_ZT_ID: + { + return QString("Montmorency 10/12"); + break; + } + case MONTMORENCY_10_22_ZT_ID: + { + return QString("Montmorency 10/22"); + break; + } + } + return QString("Unknown !!!"); +} diff --git a/sources/OutilZT.h b/sources/OutilZT.h new file mode 100644 index 0000000..c58dea6 --- /dev/null +++ b/sources/OutilZT.h @@ -0,0 +1,158 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Description du fichier si nécessaire. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20121210 JFM + Verision d'origine. + +### YYYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + +#ifndef OUTILZT_H +#define OUTILZT_H +#include "MainPanel.h" +#include "LogMgr.h" +#include "ZTData.h" +#include "Settings.h" +#include "TCPProtocol.h" +#include "ZTLogFilesMgr.h" + + + +class COutilZT : public QObject +{ + Q_OBJECT +public: + + typedef enum + { + MODE_DATABASE, + MODE_NETWORK, + MODE_ZTLOG, + MODE_INVALID + }OutilZTMode; + + + COutilZT(); + ~COutilZT(); + + unsigned int Start(); + + QString GetLogDataPath(); + QString GetTrainLogsTempPath(); + void CleanTrainLogsTempPath(); + + static QString GetStationName(int StationID); + + bool IsEngMode(){return mIsEngMode;} + + //CLogList requests + void LogViewRequest(CLogElement* Element, CLogsListPage* caller); + unsigned int SetLogProtection(bool protection, CLogElement* Element, CLogsListPage *caller); + + //CLogView requests + void LogViewCloseRequest(CLogViewPage *caller); + + //CMainPage requests + void ShowOptionsRequest(); + void HideOptionsRequest(); + void ShowDatabaseMgrRequest(); + void HideDatabaseMgrRequest(); + + void EnterDatabaseModeRequest(); + void EnterNetworkModeRequest(); + void EnterZTLogModeRequest(); + void ShowZTLogRequest(QString Log, QString FocusText, int line = -1); + + //Networkmode page requests + void ShowNetworkModeLogViewRequest(); + void HideNetworkModeLogViewRequest(); + void ShowRemoteTrainLogsViewPages(); + void ShowRemoteControlPage(); + void ShowRemoteLiveZTPage(); + + //Settings page requests + unsigned int DataSourceDirChanged(QString NewPath); + unsigned int NetworkDataChanged(); + + //DatabaseManager page requests + unsigned int LogsDatabaseChanged(QStringList *NewLogs); + unsigned int ZTLogFilesChanged(); + unsigned int RebuildDatabaseFile(); + + //LogManager requests + unsigned int LogsDatabaseLoaded(CLogMgr *Caller, int Status); + unsigned int UpdateLogsList(CLogMgr *Caller); + unsigned int DatabaseFetchingBegin(CLogMgr *Caller); + unsigned int DatabaseFetchingTick(CLogMgr *Caller,int Index); + + + + //ZTLogFilesPage requests + unsigned int ShowZTLogFile(QString FilePath); + + //ZTLogFilesMgr requests + unsigned int ZTLogFilesDatabaseLoaded(CZTLogFilesMgr *Caller, int Status); + unsigned int ZTLogFilesFetchingBegin(CZTLogFilesMgr *Caller); + unsigned int ZTLogFilesFetchingTick(CZTLogFilesMgr *Caller, int Index, QString File = ""); + + + //Network requests + unsigned int ConnectToZTRequest(); + unsigned int DisconnectZTRequest(); + unsigned int RxStationName(QString StationName); + unsigned int RefreshRemoteZTStatusRequest(); + unsigned int RxZTStatus(const CTCPZTStatus &status); + unsigned int DownloadZTLogRequest(); + unsigned int RxZTLog(QString ZTLog); + unsigned int DownloadTrainLogsRequest(); + unsigned int DownloadTrainLogsBegin(int NbLogs); + unsigned int RxTrainLogData(QString FileName); + unsigned int RxTrainLogsDownloadFinished(); + unsigned int DeleteRemoteZTLogRequest(); + unsigned int RemoteZTLogDeleted(bool Success); + unsigned int SetZTFunctionsStatus(CTCPZTFunctionsStatus status); + unsigned int SetZTFunctionsSatusDone(bool succes); + + + bool mIsEngMode; + bool mCanImport; + bool mRebuildingDB; + + +private: + unsigned int InitZT(); + + Panel panel; + CLogMgr mDatabaseModeLogManager; + CLogMgr mNetworkModeLogManager; + CSettingsFileMgr mSettingsFileMgr; + CSettingsData mSettingsData; + CZTLogFilesMgr mZTLogFilesManager; + + OutilZTMode mOutilZTMode; + + +protected: + bool eventFilter(QObject *obj, QEvent *event); + +}; + +#endif // OUTILZT_H diff --git a/sources/OutilZTVersion.h b/sources/OutilZTVersion.h new file mode 100644 index 0000000..9abd501 --- /dev/null +++ b/sources/OutilZTVersion.h @@ -0,0 +1,6 @@ +#ifndef OUTILZTVERSION_H +#define OUTILZTVERSION_H + +#define SOFTWARE_VERSION "1.14" + +#endif // OUTILZTVERSION_H diff --git a/sources/Settings.cpp b/sources/Settings.cpp new file mode 100644 index 0000000..eda35b3 --- /dev/null +++ b/sources/Settings.cpp @@ -0,0 +1,140 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Utilisée pour la configuration non volatile de certains paramètres comme + les fonction de détection hors service (TK HS). Les paramètres sont sauvegardés + dans un fichier binaire qui est ouvert au démarrage du programme. +*/ + +/* ************************************************************************** */ +/* Revision: +### 20121219 JFM + Verision d'origine. + +### YYYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + +#include "Settings.h" +#include +#include + +CSettingsFileMgr::CSettingsFileMgr() +{ +} + +unsigned int CSettingsFileMgr::LoadSettings(CSettingsData *SettingsData) +{ + QFile* SettingsFile = new QFile("./Configuration/Settings.ozs"); + if(SettingsFile) + { + if(SettingsFile->open(QIODevice::ReadOnly | QIODevice::Unbuffered) == false) + { + LoadDefaultSettings(SettingsData); + SaveSettings(SettingsData); + return RET_ERROR; + } + } + else + { + LoadDefaultSettings(SettingsData); + return RET_ERROR; + } + + QDataStream * InputStream = new QDataStream(SettingsFile); + + quint32 MagicNbr;// = 0xBAADCAFE; + + *InputStream >> MagicNbr; + + if(MagicNbr != 0xBAADCAFE) + { + LoadDefaultSettings(SettingsData); + return RET_ERROR; + } + + int NbNetworkEntries = 0; + + *InputStream >> SettingsData->mDataSourceDirectoryPath; + + *InputStream >> NbNetworkEntries; + + for(int i = 0; i < NbNetworkEntries; i++) + { + CZTNetworkConfig NewCfg; + *InputStream >> NewCfg; + SettingsData->mNetworkCfgList.append(NewCfg); + } + + SettingsFile->close(); + delete SettingsFile; + delete InputStream; + + return RET_OK; +} + +unsigned int CSettingsFileMgr::SaveSettings(CSettingsData *SettingsData) +{ + QFile* SettingsFile = new QFile("./Configuration/Settings.ozs"); + if(SettingsFile) + { + if(SettingsFile->open(QIODevice::WriteOnly | QIODevice::Unbuffered) == false) + { + return RET_ERROR; + } + } + else + { + return RET_ERROR; + } + + QDataStream * OutputStream = new QDataStream(SettingsFile); + + quint32 MagicNbr = 0xBAADCAFE; + + *OutputStream << MagicNbr; + + + *OutputStream << SettingsData->mDataSourceDirectoryPath; + *OutputStream << SettingsData->mNetworkCfgList.size(); + + for(int i = 0; i < SettingsData->mNetworkCfgList.size(); i++) + { + *OutputStream << SettingsData->mNetworkCfgList.at(i); + } + + + SettingsFile->flush(); + SettingsFile->close(); + + delete SettingsFile; + delete OutputStream; + + return RET_OK; +} + +void CSettingsFileMgr::LoadDefaultSettings(CSettingsData *SettingsData) +{ + SettingsData->mDataSourceDirectoryPath = "./Trains/"; + + SettingsData->mNetworkCfgList.clear(); + QString BaseIP = "192.168.0.11"; + for(int i = 0; i < NB_ZT_ID; i++) + { + CZTNetworkConfig ZTNetCfg; + ZTNetCfg.mZTID = i; + ZTNetCfg.mIPAdress = BaseIP + QString::number(i); + SettingsData->mNetworkCfgList.append(ZTNetCfg); + } +} diff --git a/sources/Settings.h b/sources/Settings.h new file mode 100644 index 0000000..1fa3412 --- /dev/null +++ b/sources/Settings.h @@ -0,0 +1,22 @@ +#ifndef SETTINGS_H +#define SETTINGS_H + +#include "GlobalDefine.h" +#include "ZTData.h" + +class CSettingsFileMgr +{ +public: + CSettingsFileMgr(); + + unsigned int LoadSettings(CSettingsData *SettingsData); + unsigned int SaveSettings(CSettingsData *SettingsData); + void LoadDefaultSettings(CSettingsData *SettingsData); + +private: + + + +}; + +#endif // SETTINGS_H diff --git a/sources/TCPProtocol.cpp b/sources/TCPProtocol.cpp new file mode 100644 index 0000000..b873b1a --- /dev/null +++ b/sources/TCPProtocol.cpp @@ -0,0 +1,330 @@ +#include "TCPProtocol.h" +#include +#include +#include + +CTCPProtocol::CTCPProtocol() +{ + ResetRxStateMachine(); +} + +unsigned int CTCPProtocol::AnalyzeNewData(QByteArray data) +{ + QDataStream stream(data); + stream.device()->seek(0); + + switch(mProtocolRxState) + { + case TCP_PROTOCOL_GET_HEADER_STATE: + { + quint32 header; + qint32 msg; + + stream >> header; + + if(header != TCP_PROTOCOL_HEADER) + { + return RET_ERROR; + } + + stream >> msg; + stream >> mCurTransactionDataSize; + + mCurTransactionMsg = (eTCPMessage)msg; + + if(mCurTransactionDataSize != 0) + { + mCurTransactionData = stream.device()->readAll(); + if(mCurTransactionData.size() < mCurTransactionDataSize) + { + mProtocolRxState = TCP_PROTOCOL_GET_DATA_STATE; +// qDebug() << "Datasize is: " << mCurTransactionDataSize << ". Going in GET_DATA_STATE"; + } + else if(mCurTransactionData.size() > mCurTransactionDataSize) + { + //error +// qDebug("Rx data [%d] > Transaction data [%d]. Aborting transaction",mCurTransactionData.size(),(int)mCurTransactionDataSize); + ResetRxStateMachine(); + } + else + { + DecodeTCPMessage(); + ResetRxStateMachine(); + } + } + else + { + DecodeTCPMessage(); + ResetRxStateMachine(); + } + + break; + } + case TCP_PROTOCOL_GET_MSG_STATE: + { + break; + } + case TCP_PROTOCOL_GET_DATASIZE_STATE: + { + break; + } + case TCP_PROTOCOL_GET_DATA_STATE: + { + mCurTransactionData.append(data); + if(mCurTransactionData.size() == mCurTransactionDataSize) + { + //All data received +// qDebug() << "Data Rx complete... New data size = " << mCurTransactionData.size(); + DecodeTCPMessage(); + ResetRxStateMachine(); + } + else if(mCurTransactionData.size() > mCurTransactionDataSize) + { + //error + qDebug("Rx data > Transaction data. Aborting transaction"); + ResetRxStateMachine(); + } + else + { +// qDebug() << "Chunk received. New data size = " << mCurTransactionData.size(); + } + break; + } + } + + return RET_OK; +} + +QByteArray CTCPProtocol::GetHeartbeatReqPacket() +{ + return BuildSimpleRequestPacket((qint32)TCP_MSG_HEARTBEAT_REQUEST); +} +QByteArray CTCPProtocol::GetStationNameReqPacket() +{ + return BuildSimpleRequestPacket((qint32)TCP_MSG_STATION_NAME_REQUEST); +} +QByteArray CTCPProtocol::GetZTStatusReqPacket() +{ + return BuildSimpleRequestPacket((qint32)TCP_MSG_ZT_STATUS_REQUEST); +} +QByteArray CTCPProtocol::GetZTLogDownloadReqPacket() +{ + return BuildSimpleRequestPacket((qint32)TCP_MSG_ZTLOG_DOWNLOAD_REQUEST); +} + +QByteArray CTCPProtocol::BuildSimpleRequestPacket(qint32 RequestID) +{ + QByteArray packet; + packet.clear(); + QDataStream stream(&packet,QIODevice::WriteOnly); + stream.device()->seek(0); + + stream << TCP_PROTOCOL_HEADER << RequestID << (qint64)0; + + return packet; +} + +QByteArray CTCPProtocol::GetTrainLogsDownloadReqPacket() +{ + return BuildSimpleRequestPacket((qint32)TCP_MSG_TRAINLOGS_DOWNLOAD_REQUEST); +} + +QByteArray CTCPProtocol::GetTrainLogsFileDataAckPacket(qint32 Acknowledge) +{ + QByteArray packet; + packet.clear(); + QDataStream stream(&packet,QIODevice::WriteOnly); + stream.device()->seek(0); + qint64 size = 4; + + stream << TCP_PROTOCOL_HEADER << (qint32)TCP_MSG_TRAINLOG_FILE_DATA_ACK << size << Acknowledge; + + return packet; +} + +QByteArray CTCPProtocol::GetDeleteZTLogReqPacket() +{ + return BuildSimpleRequestPacket((qint32)TCP_MSG_DELETE_ZTLOG_REQUEST); +} + +QByteArray CTCPProtocol::GetSetZTFunctionsPacket(QByteArray &Data) +{ + QByteArray packet; + packet.clear(); + QDataStream stream(&packet,QIODevice::WriteOnly); + stream.device()->seek(0); + qint64 size = Data.size(); + + stream << TCP_PROTOCOL_HEADER << (qint32)TCP_MSG_SET_ZT_FUNCTIONS << size; + packet.append(Data); + + return packet; +} + + + + +void CTCPProtocol::TCPTxRequest(const QByteArray &request) +{ + qDebug("No reimplementation of TXRequest in TCPProtocol.c. Request not sent..."); +} + +void CTCPProtocol::ResetRxStateMachine() +{ + mCurTransactionData.clear(); + mCurTransactionDataSize = 0; + mCurTransactionMsg = TCP_MSG_UNKNOWN; + mProtocolRxState = TCP_PROTOCOL_GET_HEADER_STATE; + +} + +int CTCPProtocol::DecodeTCPMessage() +{ + switch(mCurTransactionMsg) + { + case TCP_MSG_HEARTBEAT_RESPONSE: + { + TCPRxHeartbeat(); + break; + } + case TCP_MSG_STATION_NAME_RESPONSE: + { + TCPRxStationName(QString(mCurTransactionData)); + break; + } + case TCP_MSG_ZT_STATUS_RESPONSE: + { + TCPRxZTStatus(mCurTransactionData); + break; + } + case TCP_MSG_ZTLOG_DOWNLOAD_RESPONSE: + { + TCPRxZTLog(QString(mCurTransactionData)); + break; + } + case TCP_MSG_TRAINSLOGS_DOWNLOAD_ACK: + { + qint32 NbFiles = 0; + QDataStream strm(mCurTransactionData); + strm.device()->seek(0); + + strm >> NbFiles; + TCPRxTrainLogsDownladAck(NbFiles); + break; + } + case TCP_MSG_TRAINLOG_FILE_DATA: + { + TCPRxTrainLogFileData(mCurTransactionData); + break; + } + case TCP_MSG_TRAINLOGS_DOWNLOAD_FINISHED: + { + TCPRxTrainLogsDownloadFinished(); + break; + } + case TCP_MSG_DELETE_ZTLOG_ACK: + { + qint32 ack; + QDataStream strm(mCurTransactionData); + strm.device()->seek(0); + strm >> ack; + + TCPRxDeleteZTLogAck((bool)ack); + break; + } + case TCP_MSG_SET_ZT_FUNCTIONS_ACK: + { + qint32 ack; + QDataStream strm(mCurTransactionData); + strm.device()->seek(0); + strm >> ack; + + TCPRxSetZTFunctionsAck(ack); + break; + } + + case TCP_MSG_SET_ZT_FUNCTIONS: + case TCP_MSG_DELETE_ZTLOG_REQUEST: + case TCP_MSG_HEARTBEAT_REQUEST: + case TCP_MSG_STATION_NAME_REQUEST: + case TCP_MSG_ZT_STATUS_REQUEST: + case TCP_MSG_ZTLOG_DOWNLOAD_REQUEST: + case TCP_MSG_TRAINLOGS_DOWNLOAD_REQUEST: + case TCP_MSG_TRAINLOG_FILE_DATA_ACK: + case TCP_MSG_UNKNOWN: + { + qDebug() << "Received invalid msg:" << mCurTransactionMsg; + break; + } + } + + return RET_OK; +} + + + + +QDataStream &operator>>(QDataStream &in, CTCPZTStatus &dest) +{ + + in >> dest.mZT1Status + >> dest.mZT2Status + >> dest.mNbPass + >> dest.mNbTrigs + >> dest.mZTStartDateTime + >> dest.mActualDateTime + >> dest.mPGTreshold + >> dest.mModeMaintenanceON + >> dest.mCalibModeON + >> dest.mFNTKActive + >> dest.mFNAnalysisActive + >> dest.mPGTKActive + >> dest.mPGAnalysisActive + >> dest.mPP1TKActive + >> dest.mPP1AnalysisActive + >> dest.mPP2TKActive + >> dest.mPP2AnalysisActive + >> dest.mZT1TKActive + >> dest.mZT1AnalysisActive + >> dest.mZT2TKActive + >> dest.mZT2AnalysisActive + >> dest.mUSBKeyConnected; + + return in; +} + +QDataStream &operator>>(QDataStream &in, CTCPZTFunctionsStatus &dest) +{ + in >> dest.mFNTKActive + >> dest.mFNAnalysisActive + >> dest.mPGTKActive + >> dest.mPGAnalysisActive + >> dest.mPP1TKActive + >> dest.mPP1AnalysisActive + >> dest.mPP2TKActive + >> dest.mPP2AnalysisActive + >> dest.mZT1TKActive + >> dest.mZT1AnalysisActive + >> dest.mZT2TKActive + >> dest.mZT2AnalysisActive; + + return in; +} + +QDataStream &operator<<(QDataStream &out, const CTCPZTFunctionsStatus &source) +{ + out << source.mFNTKActive + << source.mFNAnalysisActive + << source.mPGTKActive + << source.mPGAnalysisActive + << source.mPP1TKActive + << source.mPP1AnalysisActive + << source.mPP2TKActive + << source.mPP2AnalysisActive + << source.mZT1TKActive + << source.mZT1AnalysisActive + << source.mZT2TKActive + << source.mZT2AnalysisActive; + + return out; +} diff --git a/sources/TCPProtocol.h b/sources/TCPProtocol.h new file mode 100644 index 0000000..0b58b05 --- /dev/null +++ b/sources/TCPProtocol.h @@ -0,0 +1,146 @@ +#ifndef TCPPROTOCOL_H +#define TCPPROTOCOL_H + +#include "GlobalDefine.h" +#include +#include + +#define TCP_PROTOCOL_HEADER (quint32)0xDEADCAFE + +class CTCPProtocol +{ + public: + + typedef enum + { + TCP_MSG_HEARTBEAT_REQUEST, + TCP_MSG_HEARTBEAT_RESPONSE, + TCP_MSG_STATION_NAME_REQUEST, + TCP_MSG_STATION_NAME_RESPONSE, + TCP_MSG_ZT_STATUS_REQUEST, + TCP_MSG_ZT_STATUS_RESPONSE, + TCP_MSG_ZTLOG_DOWNLOAD_REQUEST, + TCP_MSG_ZTLOG_DOWNLOAD_RESPONSE, + + TCP_MSG_TRAINLOGS_DOWNLOAD_REQUEST, + TCP_MSG_TRAINSLOGS_DOWNLOAD_ACK, + TCP_MSG_TRAINLOG_FILE_DATA, + TCP_MSG_TRAINLOG_FILE_DATA_ACK, + TCP_MSG_TRAINLOGS_DOWNLOAD_FINISHED, + TCP_MSG_DELETE_ZTLOG_REQUEST, + TCP_MSG_DELETE_ZTLOG_ACK, + TCP_MSG_SET_ZT_FUNCTIONS, + TCP_MSG_SET_ZT_FUNCTIONS_ACK, + + TCP_MSG_UNKNOWN + }eTCPMessage; + + typedef enum + { + TCP_PROTOCOL_GET_HEADER_STATE, + TCP_PROTOCOL_GET_MSG_STATE, + TCP_PROTOCOL_GET_DATASIZE_STATE, + TCP_PROTOCOL_GET_DATA_STATE + }eTCPProtocolState; + + typedef enum + { + TCP_PROTOCOL_NACK, + TCP_PROTOCOL_ACK, + TCP_PROTOCOL_NACK_ABORT, + TCP_PROTOCOL_INVALID_ACK + }eTCPProtocolAcknowledge; + + CTCPProtocol(); + + virtual void TCPTxRequest(const QByteArray &request) = 0; + virtual void TCPRxHeartbeat() = 0; + virtual void TCPRxStationName(QString Name) = 0; + virtual void TCPRxZTStatus(const QByteArray &data) = 0; + virtual void TCPRxZTLog(QString ZTLog) = 0; + virtual void TCPRxTrainLogsDownladAck(qint32 NbFiles) = 0; + virtual void TCPRxTrainLogFileData(const QByteArray &TrainFileData) = 0; + virtual void TCPRxTrainLogsDownloadFinished() = 0; + virtual void TCPRxDeleteZTLogAck(bool ack) = 0; + virtual void TCPRxSetZTFunctionsAck(bool ack) = 0; + + unsigned int AnalyzeNewData(QByteArray data); + + QByteArray GetHeartbeatReqPacket(); + QByteArray GetStationNameReqPacket(); + QByteArray GetZTStatusReqPacket(); + QByteArray GetZTLogDownloadReqPacket(); + QByteArray GetTrainLogsDownloadReqPacket(); + QByteArray GetTrainLogsFileDataAckPacket(qint32 Acknowledge); + QByteArray GetDeleteZTLogReqPacket(); + QByteArray GetSetZTFunctionsPacket(QByteArray &Data); + + + + +private: + eTCPProtocolState mProtocolRxState; + eTCPMessage mCurTransactionMsg; + qint64 mCurTransactionDataSize; + QByteArray mCurTransactionData; + + void ResetRxStateMachine(); + int DecodeTCPMessage(); + QByteArray BuildSimpleRequestPacket(qint32 RequestID); + +}; + +class CTCPZTStatus +{ +public: + quint32 mZT1Status; // + quint32 mZT2Status; + quint32 mNbPass; + quint32 mNbTrigs; + + QDateTime mZTStartDateTime; + QDateTime mActualDateTime; + + qint32 mPGTreshold; + + bool mModeMaintenanceON; + bool mCalibModeON; + + bool mFNTKActive; + bool mFNAnalysisActive; + bool mPGTKActive; + bool mPGAnalysisActive; + bool mPP1TKActive; + bool mPP1AnalysisActive; + bool mPP2TKActive; + bool mPP2AnalysisActive; + bool mZT1TKActive; + bool mZT1AnalysisActive; + bool mZT2TKActive; + bool mZT2AnalysisActive; + + bool mUSBKeyConnected; +}; +QDataStream &operator>>(QDataStream &in, CTCPZTStatus &dest); + +class CTCPZTFunctionsStatus +{ +public: + bool mFNTKActive; + bool mFNAnalysisActive; + bool mPGTKActive; + bool mPGAnalysisActive; + bool mPP1TKActive; + bool mPP1AnalysisActive; + bool mPP2TKActive; + bool mPP2AnalysisActive; + bool mZT1TKActive; + bool mZT1AnalysisActive; + bool mZT2TKActive; + bool mZT2AnalysisActive; +}; +QDataStream &operator>>(QDataStream &in, CTCPZTFunctionsStatus &dest); +QDataStream &operator<<(QDataStream &out, const CTCPZTFunctionsStatus &source); + + +#endif // TCPPROTOCOL_H diff --git a/sources/TrainLogFileMgr.cpp b/sources/TrainLogFileMgr.cpp new file mode 100644 index 0000000..2ded831 --- /dev/null +++ b/sources/TrainLogFileMgr.cpp @@ -0,0 +1,952 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 - 2013 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Cette classe est responsable de la sauvegarde et de l'ouverture des fichiers + log de passage des trains. + +*/ + +/* ************************************************************************** */ +/* Revision: +### YYYMMDD JFM + Verision d'origine. + +### YYYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + +#include "TrainLogFileMgr.h" +#include +#include +#include "LogMgr.h" + +CTrainLogFileMgr CTrainLogFileMgr::mSingleton; + +CTrainLogFileMgr::CTrainLogFileMgr() +{ +} + +//unsigned int CTrainLogFileMgr::SaveTrainLog(QString LogFilePathName, CZT1Log *ZT1Log, QList *ZT1DetectionsLog,QString StationName) +unsigned int CTrainLogFileMgr::SaveTrainLog(QString LogFilePathName, CZT1Log *ZT1Log, QVector *ZT1DetectionsLog,QString StationName) +{ + QFile* BinaryLogFile = new QFile(LogFilePathName); + if(BinaryLogFile) + { + if(BinaryLogFile->open(QIODevice::WriteOnly | QIODevice::Unbuffered) == false) + { + qDebug("Could not create log file : %s",LogFilePathName.toLatin1().data()); + delete BinaryLogFile; + return RET_ERROR; + } + + + } + else + return RET_ERROR; + + QDataStream * OutputStream = new QDataStream(BinaryLogFile); + + quint32 MagicNbr = 0xDEADBEEF; + + quint32 NbLogEntry = 0,NbDetections = 0; + quint32 LogType = ZT1_LOG_TYPE; + NbLogEntry = ZT1Log->mZT1LogData.size(); + NbDetections = ZT1DetectionsLog->size(); + quint32 TrainType = 0; + quint32 NbElements = 0; + quint64 ThreadDataStartTime = 0, ThreadDataEndTime = 0; + qreal MeanSpeed = 0; + QDateTime DateTime; + + + //Compute some stats + int SpeedSampleCount = 0; + bool TrainTypeFound = false; + unsigned int NbBogie = 0; + bool ThreadStartTimeFound = false, ThreadEndTimeFound = false; + + for(unsigned int i = 0; i < NbLogEntry; i++) + { + if(ZT1Log->mZT1LogData.at(i)->mZT1ThreadData != 0) + { + //get the train type + if(!TrainTypeFound) + { + if(ZT1Log->mZT1LogData.at(i)->mZT1ThreadData->mTrainType != TRAIN_TYPE_UNKNOWN) + { + TrainType = ZT1Log->mZT1LogData.at(i)->mZT1ThreadData->mTrainType; + TrainTypeFound = true; + } + } + + //Get the rank count for the train + if(ZT1Log->mZT1LogData.at(i)->mZT1ThreadData->mRank > NbBogie) + NbBogie = ZT1Log->mZT1LogData.at(i)->mZT1ThreadData->mBogie; + + //Find the time limits + if(ThreadStartTimeFound == false) + { + ThreadStartTimeFound = true; + ThreadDataStartTime = ZT1Log->mZT1LogData.at(i)->mTimestamp; + } + + //Compute the mean speed + if(ZT1Log->mZT1LogData.at(i)->mZT1ThreadData->mTrainSpeed != 0) + { + MeanSpeed += ZT1Log->mZT1LogData.at(i)->mZT1ThreadData->mTrainSpeed; + SpeedSampleCount++; + } + } + else + { + //Find the time limits + if(ThreadStartTimeFound == true && ThreadEndTimeFound == false) + { + ThreadEndTimeFound = true; + ThreadDataEndTime = ZT1Log->mZT1LogData.at(i-1)->mTimestamp; + } + } + } + MeanSpeed /= SpeedSampleCount; + NbElements = NbBogie/6; + + DateTime = ZT1Log->mZT1LogData.first()->mDateTime; + + + + *OutputStream << MagicNbr << LogType << NbLogEntry << NbDetections; + *OutputStream << StationName; + + *OutputStream << ZT1Log->mZT1Flags; + + *OutputStream << TrainType << NbElements << ThreadDataStartTime << ThreadDataEndTime << MeanSpeed << DateTime; + + + //write detections + for(unsigned int i =0; i < NbDetections; i++) + { + *OutputStream << *ZT1DetectionsLog->at(i); + } + + //write train passage log + for(unsigned int i = 0; i < NbLogEntry; i++) + { + *OutputStream << *ZT1Log->mZT1LogData.at(i); + } + +#ifdef USE_ANALOG_ACQUISITION + //write analog data if present. + if(ZT1Log->mZT1Flags.mAnalogTracePresent == 1) + { + for(unsigned int i = 0; i < NbLogEntry; i++) + { + *OutputStream << ZT1Log->mZT1LogData.at(i)->mAnalogData; + } + } +#endif + + + BinaryLogFile->close(); + delete BinaryLogFile; + delete OutputStream; + + + return RET_OK; + +} + +unsigned int CTrainLogFileMgr::SaveTrainLog(QString LogFilePathName, QVector *ZT2Log, QVector *ZT2DetectionsLog, QString StationName) +{ + QFile* BinaryLogFile = new QFile(LogFilePathName); + if(BinaryLogFile) + { + if(BinaryLogFile->open(QIODevice::WriteOnly | QIODevice::Unbuffered) == false) + { + qDebug("Could not create log file : %s",LogFilePathName.toLatin1().data()); + delete BinaryLogFile; + return RET_ERROR; + } + + + } + else + return RET_ERROR; + + QDataStream * OutputStream = new QDataStream(BinaryLogFile); + + quint32 MagicNbr = 0xDEADBEEF; + + quint32 NbLogEntry,NbDetections; + quint32 LogType = ZT2_LOG_TYPE; + NbLogEntry = ZT2Log->size(); + NbDetections = ZT2DetectionsLog->size(); + quint32 NbElements = 0; + QDateTime DateTime = ZT2Log->at(0)->mDateTime; + + + //Get some stats + for(int j = 0; j < ZT2Log->size(); j++) + { + if(ZT2Log->at(j)->mZT2ThreadData != 0) + { + //Get the rank count for the train + if(ZT2Log->at(j)->mZT2ThreadData->mRank > NbElements) + NbElements = ZT2Log->at(j)->mZT2ThreadData->mBogie; + } + } + + NbElements /= 6; //6 bogies per element + + + + *OutputStream << MagicNbr << LogType << NbLogEntry << NbDetections; + *OutputStream << StationName; + + *OutputStream << NbElements << DateTime; + + //write detections + for(unsigned int i =0; i < NbDetections; i++) + { + *OutputStream << *ZT2DetectionsLog->at(i); + } + + + //write train passage log + for(unsigned int i = 0; i < NbLogEntry; i++) + { + *OutputStream << *ZT2Log->at(i); + } + + BinaryLogFile->close(); + delete BinaryLogFile; + delete OutputStream; + + return RET_OK; +} + +//It is the responsibility of the caller to make shure TargetElement is empty +CLogElement* CTrainLogFileMgr::OpenTrainLog(QString LogFilePathName,unsigned int &Retvalue,CLogElement* TargetElement,bool LoadData) +{ +// if(!ZT1Log->isEmpty() || !ZT1DetectionsLog->isEmpty()) +// return RET_ERROR; + + int LogFileVersion; + bool FileProtected = false; + + if(QFileInfo(LogFilePathName).suffix() != "bin") + { + Retvalue = RET_ERROR; + return 0; + } + + QFile* BinaryLogFile = new QFile(LogFilePathName); + if(BinaryLogFile) + { + if(BinaryLogFile->open(QIODevice::ReadOnly | QIODevice::Unbuffered) == false) + { + Retvalue = RET_ERROR; + delete BinaryLogFile; + return 0; + } + + } + else + { + Retvalue = RET_ERROR; + return 0; + } + + QDataStream * InputStream = new QDataStream(BinaryLogFile); + + quint32 MagicNbr,NbLogEntry,NbDetections,LogType; + + *InputStream >> MagicNbr; + if(MagicNbr == 0xDEADBEEF) + { + LogFileVersion = 1; + FileProtected = false; + } + else if(MagicNbr == 0xDEADBEEF+1) + { + LogFileVersion = 2; + FileProtected = false; + } + else if(MagicNbr == 0xDEADBEEF+2) + { + LogFileVersion = 1; + FileProtected = true; + } + else if(MagicNbr == 0xDEADBEEF+3) + { + LogFileVersion = 2; + FileProtected = true; + } + else + { + + qDebug(QString().sprintf("Fichier de passage invalide (Magic number) %s",LogFilePathName.toAscii().data()).toAscii().data()); + BinaryLogFile->close(); + delete BinaryLogFile; + delete InputStream; + + Retvalue = RET_ERROR; + return 0; + } + + *InputStream >> LogType; + + if(LogType == ZT1_LOG_TYPE) + { + CZT1LogElement *PassageLog; + if(TargetElement == 0) + { + PassageLog = new CZT1LogElement(); + } + else + { + PassageLog = (CZT1LogElement*)TargetElement; //It is the responsibility of the caller to make shure TargetElement is empty + } + + PassageLog->mLogFileName = LogFilePathName; + PassageLog->mFileProtected = FileProtected; + + *InputStream >> NbLogEntry; + *InputStream >> NbDetections; + *InputStream >> PassageLog->mStationName; + if(LogFileVersion == 1) + { + *InputStream >> PassageLog->mFlags.mExtPGOffset + >> PassageLog->mFlags.mIntPGOffset + >> PassageLog->mFlags.mPGCalibrationON + >> PassageLog->mFlags.mPGTresholdValue + >> PassageLog->mFlags.mAnalogTracePresent; + } + else if(LogFileVersion == 2) + { + *InputStream >> PassageLog->mFlags; + } + + *InputStream >> PassageLog->mTrainType; + *InputStream >> PassageLog->mNbElements; + *InputStream >> PassageLog->mThreadDataStartTime; + *InputStream >> PassageLog->mThreadDataEndTime; + *InputStream >> PassageLog->mMeanSpeed; + *InputStream >> PassageLog->mPassageDateTime; + + for(unsigned int i = 0; i < NbDetections; i++) + { + CZTDetectionData *NewDetection = new CZTDetectionData(); + *InputStream >> *NewDetection; + PassageLog->mZTDetections.append(NewDetection); + } + + if(LoadData == true) + { + for(unsigned int i = 0; i < NbLogEntry; i++) + { + CZT1LogData *NewLogChunk = new CZT1LogData(); + *InputStream >> *NewLogChunk; + PassageLog->mZTLogData.append(NewLogChunk); + } + +#ifdef USE_ANALOG_ACQUISITION + if(PassageLog->mFlags.mAnalogTracePresent == 1) + { + for(int i = 0; i < PassageLog->mZTLogData.size(); i++) + { + *InputStream >> PassageLog->mZTLogData.at(i)->mAnalogData; + } + } +#endif + } + + + + + BinaryLogFile->close(); + delete BinaryLogFile; + delete InputStream; + + Retvalue = RET_OK; + return (CZT1LogElement*) PassageLog; + } + else if(LogType == ZT2_LOG_TYPE) + { + quint32 NbElements; + QDateTime DateTime; + + CZT2LogElement *PassageLog; + if(TargetElement == 0) + { + PassageLog = new CZT2LogElement(); + } + else + { + PassageLog = (CZT2LogElement*) TargetElement; //It is the responsibility of the caller to make shure TargetElement is empty + } + + *InputStream >> NbLogEntry; + *InputStream >> NbDetections; + *InputStream >> PassageLog->mStationName; + if(LogFileVersion == 2) + { + *InputStream >> PassageLog->mFlags; + } + else + { + PassageLog->mFlags.mIsProblematicPassage = 2; + } + *InputStream >> NbElements; + *InputStream >> DateTime; + + PassageLog->mNbElements = NbElements; + PassageLog->mLogFileName = LogFilePathName; + PassageLog->mPassageDateTime = DateTime; + PassageLog->mFileProtected = FileProtected; + + for(unsigned int i = 0; i < NbDetections; i++) + { + CZTDetectionData *NewDetection = new CZTDetectionData(); + *InputStream >> *NewDetection; + PassageLog->mZTDetections.append(NewDetection); + } + + if(LoadData == true) + { + for(unsigned int i = 0; i < NbLogEntry; i++) + { + CZT2LogData *NewLogChunk = new CZT2LogData(); + *InputStream >> *NewLogChunk; + PassageLog->mZTLogData.append(NewLogChunk); + } + } + + + + + BinaryLogFile->close(); + delete BinaryLogFile; + delete InputStream; + + Retvalue = RET_OK; + return PassageLog; + } + else + { + qDebug("Invalid log type in file %s",LogFilePathName.toLatin1().data()); + Retvalue = RET_ERROR; + return 0; + + + } +} + +unsigned int CTrainLogFileMgr::SetTrainLogProtected(bool IsProtected, QString LogFilePathName) +{ + QFile* BinaryLogFile = new QFile(LogFilePathName); + if(BinaryLogFile) + { + if(BinaryLogFile->open(QIODevice::ReadWrite | QIODevice::Unbuffered) == false) + { + qDebug("Could not Open log file to set protection : %s",LogFilePathName.toLatin1().data()); + delete BinaryLogFile; + return RET_ERROR; + } + + + } + else + return RET_ERROR; + + QDataStream * Stream = new QDataStream(BinaryLogFile); + + quint32 MagicNbr; + + *Stream >> MagicNbr; + + BinaryLogFile->seek(0); + + if(IsProtected == true) + { + if(MagicNbr == 0xDEADBEEF + 2 || MagicNbr == 0xDEADBEEF + 3) + { + //file is already protected + + } + else if(MagicNbr == 0xDEADBEEF || MagicNbr == 0xDEADBEEF + 1) + { + MagicNbr += 2; + *Stream << MagicNbr; + } + else + { + //Log File Error + BinaryLogFile->close(); + qDebug("Invalid log file magic number to set protection : %s",LogFilePathName.toLatin1().data()); + delete BinaryLogFile; + } + + } + else + { + if(MagicNbr == 0xDEADBEEF + 2 || MagicNbr == 0xDEADBEEF + 3) + { + //file is already protected + MagicNbr -= 2; + *Stream << MagicNbr; + + } + else if(MagicNbr == 0xDEADBEEF || MagicNbr == 0xDEADBEEF + 1) + { + //file is already unprotected + } + else + { + //Log File Error + BinaryLogFile->close(); + qDebug("Invalid log file magic number to set protection : %s",LogFilePathName.toLatin1().data()); + delete BinaryLogFile; + } + } + + BinaryLogFile->close(); + qDebug("Invalid log file magic number to set protection : %s",LogFilePathName.toLatin1().data()); + delete BinaryLogFile; + + return RET_OK; +} + +//unsigned int CTrainLogFileMgr::SaveCSVFile(QString CSVFilePathName, CZT1Log *ZT1Log, QList *ZT1DetectionsLog, QString StationName) +unsigned int CTrainLogFileMgr::SaveCSVFile(QString CSVFilePathName, CZT1Log *ZT1Log, QVector *ZT1DetectionsLog, QString StationName) +{ + return SaveCSVFile(CSVFilePathName, &ZT1Log->mZT1LogData, &ZT1Log->mZT1Flags, ZT1DetectionsLog,StationName); +} + +//unsigned int CTrainLogFileMgr::SaveCSVFile(QString CSVFilePathName, QList *ZT1Log, CZT1FlagsData *ZT1Flags, QList *ZT1DetectionsLog, QString StationName) +unsigned int CTrainLogFileMgr::SaveCSVFile(QString CSVFilePathName, QVector *ZT1Log, CZT1FlagsData *ZT1Flags, QVector *ZT1DetectionsLog, QString StationName) +{ + QFile CSVFile(CSVFilePathName); + if(!CSVFile.open(QIODevice::QIODevice::WriteOnly|QIODevice::Text|QIODevice::Truncate)) + return RET_ERROR; + + QTextStream CSVStream(&CSVFile); + + CSVStream << "Log de passage du train dans la ZT1\n"; + + CSVStream << QString::fromUtf8("Station : ") << StationName << "\n"; + CSVStream << QString::fromUtf8("Valeur seuil Pneu de guidage : ") << ZT1Flags->mPGTresholdValue << "\n"; + CSVStream << QString::fromUtf8("Valeur zérotage PG Extérieur : ") << ZT1Flags->mExtPGOffset << "\n"; + CSVStream << QString::fromUtf8("Valeur zérotage PG Intérieur : ") << ZT1Flags->mIntPGOffset << "\n"; + if(ZT1Flags->mPGCalibrationON == 1) + { + CSVStream << "Calibration PG en cours lors du passage: OUI\n"; + } + else + CSVStream << "Calibration PG en cours lors du passage: NON\n"; + + CSVStream << QString::fromUtf8("Nombre de déclenchements : ") << ZT1DetectionsLog->size() << "\n"; + + + + if(ZT1DetectionsLog->size() > 0) + { + for(int i = 0; i < ZT1DetectionsLog->size(); i++) + { + CSVStream << QString::fromUtf8("Déclenchement ") << i+1 << ": " << ZT1DetectionsLog->at(i)->mTimeStamp << " - " << QString::fromUtf8(CZTData::GetErrorString(ZT1DetectionsLog->at(i)->mDetectionID)) << " au rang " << ZT1DetectionsLog->at(i)->mRank << "\n"; + } + + + } + CSVStream << "\n"; + + CSVStream << "Date,Heure,Timestamp,CI,CDV Approche,CDV ZT1,S1,S2,FN,PPI,PPE,PG,Vitesse,Bogie,Rang,Laser Ext,Laser Int,Train"; + + if(ZT1Flags->mAnalogTracePresent == 1) + { + CSVStream << ",4-20mA SDF"; + } + + CSVStream << "\n"; + + for(int i = 0; i < ZT1Log->size(); i++) + { + CSVStream << ZT1Log->at(i)->mDateTime.toString("yyyy-MM-dd, hh:mm:ss:zzz") << ","; + CSVStream << ZT1Log->at(i)->mTimestamp << ","; + CSVStream << ZT1Log->at(i)->mCIZT1 << ","; + CSVStream << ZT1Log->at(i)->mCDVApproach_ZT1 << ","; + CSVStream << ZT1Log->at(i)->mCDVARM_ZT1 << ","; + + if(ZT1Log->at(i)->mZT1ThreadData != 0) + { + CSVStream << ZT1Log->at(i)->mZT1ThreadData->mS1 << ","; + CSVStream << ZT1Log->at(i)->mZT1ThreadData->mS2 << ","; + CSVStream << ZT1Log->at(i)->mZT1ThreadData->mFN << ","; + CSVStream << ZT1Log->at(i)->mZT1ThreadData->mPInt << ","; + CSVStream << ZT1Log->at(i)->mZT1ThreadData->mPExt << ","; + CSVStream << ZT1Log->at(i)->mZT1ThreadData->mPG << ","; + CSVStream << ZT1Log->at(i)->mZT1ThreadData->mTrainSpeed << ","; + CSVStream << ZT1Log->at(i)->mZT1ThreadData->mBogie << ","; + CSVStream << ZT1Log->at(i)->mZT1ThreadData->mRank << ","; + CSVStream << ZT1Log->at(i)->mZT1ThreadData->mPGExtValue << ","; + CSVStream << ZT1Log->at(i)->mZT1ThreadData->mPGIntValue << ","; + CSVStream << CZTData::GetTrainTypeString(ZT1Log->at(i)->mZT1ThreadData->mTrainType); + } + else + { + CSVStream << "0,0,0,0,0,0,0,0,0,0,0,0"; + //CSVStream <<"\n"; + } + + if(ZT1Flags->mAnalogTracePresent == 1) + { + CSVStream << "," << ZT1Log->at(i)->mAnalogData ; + } + + CSVStream << "\n"; + } + + CSVFile.flush(); + CSVFile.close(); + + return RET_OK; +} + + + +unsigned int CTrainLogFileMgr::SaveCSVFile(QString CSVFilePathName, QVector *ZT2Log, QVector *ZT2DetectionsLog, QString StationName) +//unsigned int CTrainLogFileMgr::SaveCSVFile(QString CSVFilePathName, QVector *ZT2Log, QVector *ZT2DetectionsLog, QString StationName) +{ + QFile CSVFile(CSVFilePathName); + if(!CSVFile.open(QIODevice::QIODevice::WriteOnly|QIODevice::Text|QIODevice::Truncate)) + return RET_ERROR; + + QTextStream CSVStream(&CSVFile); + + CSVStream << "Log de passage du train dans la ZT2\n"; + CSVStream << QString::fromUtf8("Station : ") << StationName << "\n"; + + CSVStream << QString::fromUtf8("Nombre de déclenchements : ") << ZT2DetectionsLog->size() << "\n"; + + + if(ZT2DetectionsLog->size() > 0) + { + for(int i = 0; i < ZT2DetectionsLog->size(); i++) + { + CSVStream << QString::fromUtf8("Déclenchement ") << i+1 << ": " << ZT2DetectionsLog->at(i)->mTimeStamp << " - " << QString::fromUtf8(CZTData::GetErrorString(ZT2DetectionsLog->at(i)->mDetectionID)) << " au rang " << ZT2DetectionsLog->at(i)->mRank << "\n"; + } + + CSVStream << "\n"; + } + + CSVStream << "Date,Heure,Timestamp,CI,CDV ZT2,S1,PPI,PPE,Bogie,Rang\n"; + + for(int i = 0; i < ZT2Log->size(); i++) + { + CSVStream << ZT2Log->at(i)->mDateTime.toString("yyyy-MM-dd, hh:mm:ss:zzz") << ","; + CSVStream << ZT2Log->at(i)->mTimestamp << ","; + CSVStream << ZT2Log->at(i)->mCIZT2 << ","; + CSVStream << ZT2Log->at(i)->mCDVARM_ZT2 << ","; + if(ZT2Log->at(i)->mZT2ThreadData != 0) + { + CSVStream << ZT2Log->at(i)->mZT2ThreadData->mS1 << ","; + CSVStream << ZT2Log->at(i)->mZT2ThreadData->mPPInt << ","; + CSVStream << ZT2Log->at(i)->mZT2ThreadData->mPPExt << ","; + CSVStream << ZT2Log->at(i)->mZT2ThreadData->mBogie << ","; + CSVStream << ZT2Log->at(i)->mZT2ThreadData->mRank << ","; + } + else + { + CSVStream << "0,0,0,0,0"; + CSVStream <<"\n"; + } + } + + CSVFile.flush(); + CSVFile.close(); + + return RET_OK; +} + + + +//Cette fonction a été écrite pour des fins de tests et n'est PAS du tout robuste. +//utiliser avec précaution. +unsigned int CTrainLogFileMgr::SaveBINFromCSV(QString CSVFilePathName) +{ + QFile CSVFile(CSVFilePathName); + if(!CSVFile.open(QIODevice::ReadOnly|QIODevice::Text)) + return RET_ERROR; + + QTextStream CSVStream(&CSVFile); + + bool IsZT1 = true; + QString Line; + QStringList LineElements; + QString StationName; + Line.clear(); + LineElements.clear(); + + Line = CSVStream.readLine(); //Log de passage du train dans la ZT1 + if(Line.contains("ZT1") == true) + { + IsZT1 = true; + } + else if(Line.contains("ZT2") == true) + { + IsZT1 = false; + } + else + { + //invalid file + CSVFile.close(); + return RET_ERROR; + } + + Line = CSVStream.readLine(); //Station : Snowdon + LineElements = Line.split(":"); + if(LineElements.isEmpty()) + { + CSVFile.close(); + return RET_ERROR; + } + StationName = LineElements.at(1); + Line.clear(); + + if(IsZT1 == true) + { + CZT1Log *ZT1LOG = new CZT1Log(); + + Line = CSVStream.readLine(); //Valeur seuil Pneu de guidage : 15625 + LineElements = Line.split(":"); + if(LineElements.isEmpty()) + { + CSVFile.close(); + return RET_ERROR; + } + ZT1LOG->mZT1Flags.mPGTresholdValue = LineElements.at(1).toInt(); + Line.clear(); + + Line = CSVStream.readLine(); //Valeur zérotage PG Extérieur : 128457 + LineElements = Line.split(":"); + if(LineElements.isEmpty()) + { + CSVFile.close(); + return RET_ERROR; + } + ZT1LOG->mZT1Flags.mExtPGOffset = LineElements.at(1).toInt(); + Line.clear(); + + Line = CSVStream.readLine(); //Valeur zérotage PG Intérieur : 1300637 + LineElements = Line.split(":"); + if(LineElements.isEmpty()) + { + CSVFile.close(); + return RET_ERROR; + } + ZT1LOG->mZT1Flags.mIntPGOffset = LineElements.at(1).toInt(); + Line.clear(); + + Line = CSVStream.readLine(); //Calibration PG en cours lors du passage: NON + if(Line.contains("OUI") == true) + { + ZT1LOG->mZT1Flags.mPGCalibrationON = true; + } + else if(Line.contains("NON") == true) + { + ZT1LOG->mZT1Flags.mPGCalibrationON = false; + } + else + { + CSVFile.close(); + return RET_ERROR; + } + Line.clear(); + + int NbDetections; + Line = CSVStream.readLine(); //Nombre de déclenchements : 12 + LineElements = Line.split(":"); + if(LineElements.isEmpty()) + { + CSVFile.close(); + return RET_ERROR; + } + NbDetections = LineElements.at(1).toInt(); + Line.clear(); + + //Ignore detections... + for(int i = 0; i < NbDetections; i++) + { + Line = CSVStream.readLine(); + Line.clear(); + } + + //Skip the empty line after the detections. + Line = CSVStream.readLine(); + Line.clear(); + + //Skip the table header + Line = CSVStream.readLine(); + Line.clear(); + + quint32 LastS1 = 0, LastS2 = 0, LastFN = 0; + quint32 S1Count = 0; + quint32 S2Count = 0; + quint32 FNCount = 0; + while(CSVStream.atEnd() == false) + { + + Line.clear(); + LineElements.clear(); + + Line = CSVStream.readLine(); //Date Heure Timestamp CI CDV Approche CDV ZT1 S1 S2 FN PPI PPE PG Vitesse Bogie Rang Sonde Ext Sonde Int Train + LineElements = Line.split(","); + if(LineElements.count() != 18) + { + CSVFile.close(); + return RET_ERROR; + } + + QDate date = QDate::fromString(LineElements.at(0),"yyyy-MM-dd"); + if(date.isValid() == false) + { + CSVFile.close(); + return RET_ERROR; + } + + QTime time = QTime::fromString(LineElements.at(1).trimmed(),"hh:mm:ss:zzz"); + if(time.isValid() == false) + { + CSVFile.close(); + return RET_ERROR; + } + + qint64 timestamp = LineElements.at(2).toLongLong(); + + quint32 CIZT1 = LineElements.at(3).toUInt(); + + quint32 CDVApproach_ZT1 = LineElements.at(4).toUInt(); + + quint32 CDVARM_ZT1 = LineElements.at(5).toUInt(); + + CZT1LogData *LogData; + CZT1ThreadData *ThreadData; + if(LineElements.at(17) == "0") //Check if ThreadData is valid + { + //Thread data not valid... + LogData = new CZT1LogData(); + } + else + { + ThreadData = new CZT1ThreadData(); + LogData = new CZT1LogData(ThreadData); + + + quint32 S1 = LineElements.at(6).toUInt(); + quint32 S2 = LineElements.at(7).toUInt(); + quint32 FN = LineElements.at(8).toUInt(); + quint32 PInt = LineElements.at(9).toUInt(); + quint32 PExt = LineElements.at(10).toUInt(); + quint32 PG = LineElements.at(11).toUInt(); + qreal TrainSpeed = LineElements.at(12).toFloat(); + quint32 Bogie = LineElements.at(13).toUInt(); + quint32 Rank = LineElements.at(14).toUInt(); + qint32 PGIntValue = LineElements.at(15).toInt(); + qint32 PGExtValue = LineElements.at(16).toInt(); + + quint32 TrainType; + if(LineElements.at(17) == "Inconnu") + { + TrainType = TRAIN_TYPE_UNKNOWN; + } + else if(LineElements.at(17) == "MR63/73") + { + TrainType = TRAIN_TYPE_MR63_MR73; + } + else if(LineElements.at(17) == "MPM10") + { + TrainType = TRAIN_TYPE_MPM10; + } + else + { + CSVFile.close(); + return RET_ERROR; + } + + if(S1 == 1 && LastS1 == 0) + S1Count++; + + if(S2 == 1 && LastS2 == 0) + S2Count++; + + if(FN == 1 && LastFN == 0) + FNCount++; + + LastS1 = S1; + LastS2 = S2; + LastFN = FN; + + ThreadData->mTimeStamp = timestamp; //nanosecs + ThreadData->mDateTime.setDate(date); + ThreadData->mDateTime.setTime(time); + ThreadData->mS1 = S1; + ThreadData->mS2 = S2; + ThreadData->mFN = FN; + ThreadData->mPInt = PInt; + ThreadData->mPExt = PExt; + ThreadData->mPG = PG; + ThreadData->mTrainSpeed = TrainSpeed; + ThreadData->mBogie = Bogie; + ThreadData->mRank = Rank; + ThreadData->mPGIntValue = PGIntValue; + ThreadData->mPGExtValue = PGExtValue; + ThreadData->mS1Count = S1Count; + ThreadData->mS2Count = S2Count; + ThreadData->mFNCount = FNCount; + ThreadData->mTrainType = TrainType; + } + + LogData->mTimestamp = timestamp; + LogData->mCIZT1 = CIZT1; + LogData->mCDVApproach_ZT1 = CDVApproach_ZT1; + LogData->mCDVARM_ZT1 = CDVARM_ZT1; + LogData->mDateTime.setDate(date); + LogData->mDateTime.setTime(time); + + ZT1LOG->mZT1LogData.append(LogData); + } + + // QList Dummy; //JFM + QVector Dummy; + Dummy.clear(); + + SaveTrainLog(CSVFilePathName.replace("csv","bin"),ZT1LOG,&Dummy,StationName); + + for(int i = 0; i < ZT1LOG->mZT1LogData.size(); i++) + { + delete ZT1LOG->mZT1LogData.at(i); + } + ZT1LOG->mZT1LogData.clear(); + delete ZT1LOG; + + + + + } + else //ZT1 + { + } + + + return RET_OK; +} diff --git a/sources/TrainLogFileMgr.h b/sources/TrainLogFileMgr.h new file mode 100644 index 0000000..c367aed --- /dev/null +++ b/sources/TrainLogFileMgr.h @@ -0,0 +1,61 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 - 2013 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Description du fichier si nécessaire. + +*/ + +/* ************************************************************************** */ +/* Revision: +### YYYMMDD JFM + Verision d'origine. + +### YYYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + +#ifndef TRAINLOGFILEMGR_H +#define TRAINLOGFILEMGR_H + +#include "GlobalDefine.h" +#include "ZTData.h" + + + +class CLogElement; + +class CTrainLogFileMgr +{ +public: + + //CTrainLogFileMgr is a singleton class + static CTrainLogFileMgr* instance(){return &mSingleton;} + static CTrainLogFileMgr mSingleton; + + + CTrainLogFileMgr(); + unsigned int SaveTrainLog(QString LogFilePathName,CZT1Log *ZT1Log,QVector *ZT1DetectionsLog,QString StationName); + unsigned int SaveTrainLog(QString LogFilePathName,QVector *ZT2Log,QVector *ZT2DetectionsLog,QString StationName); + CLogElement *OpenTrainLog(QString LogFilePathName,unsigned int &RetValue,CLogElement *TargetElement = 0,bool LoadData = false); + unsigned int SaveCSVFile(QString CSVFilePathName,QVector *ZT1Log,CZT1FlagsData *ZT1Flags,QVector *ZT1DetectionsLog, QString StationName); + unsigned int SaveCSVFile(QString CSVFilePathName,CZT1Log *ZT1Log,QVector *ZT1DetectionsLog, QString StationName); + unsigned int SaveCSVFile(QString CSVFilePathName,QVector *ZT2Log,QVector *ZT2DetectionsLog, QString StationName); + + unsigned int SetTrainLogProtected(bool IsProtected,QString LogFilePathName); + + unsigned int SaveBINFromCSV(QString CSVFilePathName); +}; + +#endif // TRAINLOGFILEMGR_H + diff --git a/sources/UDPProtocol.cpp b/sources/UDPProtocol.cpp new file mode 100644 index 0000000..da453f7 --- /dev/null +++ b/sources/UDPProtocol.cpp @@ -0,0 +1,41 @@ +#include "UDPProtocol.h" +#include + +CUDPProtocol::CUDPProtocol() +{ +} + + +unsigned int CUDPProtocol::AnalyseNewData(QByteArray Data) +{ + + return RET_OK; +} + +QByteArray CUDPProtocol::GetInitUDPConnectionPacket() +{ + QByteArray packet; + packet.clear(); + QDataStream stream(&packet,QIODevice::WriteOnly); + stream.device()->seek(0); + + quint32 Request = (quint32)UDP_INIT_CONNECTION_REQUEST; + + stream << UDP_PROTOCOL_HEADER << Request; + + return packet; +} + +QByteArray CUDPProtocol::GetCloseUDPConnectionPacket() +{ + QByteArray packet; + packet.clear(); + QDataStream stream(&packet,QIODevice::WriteOnly); + stream.device()->seek(0); + + quint32 Request = (quint32)UDP_CLOSE_CONNECTION_REQUEST; + + stream << UDP_PROTOCOL_HEADER << Request; + + return packet; +} diff --git a/sources/UDPProtocol.h b/sources/UDPProtocol.h new file mode 100644 index 0000000..43e7351 --- /dev/null +++ b/sources/UDPProtocol.h @@ -0,0 +1,33 @@ +#ifndef UDPPROTOCOL_H +#define UDPPROTOCOL_H + +#include "GlobalDefine.h" +#include + +#define UDP_PROTOCOL_HEADER (quint32)0xDEAD5AD5 + + +class CUDPProtocol +{ +public: + + typedef enum + { + UDP_INIT_CONNECTION_REQUEST, + UDP_CLOSE_CONNECTION_REQUEST, + TCP_MSG_UNKNOWN + }eUDPMessage; + + + CUDPProtocol(); + +public: + unsigned int AnalyseNewData(QByteArray Data); + + QByteArray GetInitUDPConnectionPacket(); + QByteArray GetStopUDPStreamPacket(); + QByteArray GetCloseUDPConnectionPacket(); + +}; + +#endif // UDPPROTOCOL_H diff --git a/sources/ZTData.cpp b/sources/ZTData.cpp new file mode 100644 index 0000000..2a52884 --- /dev/null +++ b/sources/ZTData.cpp @@ -0,0 +1,373 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Classe fourre-tout qui contient les différentes structures données utilisées + un peu partout dans le programme. + +*/ + +/* ************************************************************************** */ +/* Revision: +### YYYMMDD JFM + Verision d'origine. + +### YYYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + +#include "ZTData.h" + +const char * CZTData::TrainTypeString[] = {"Inconnu","MR63/73", "MPM10"}; +CZTData::CZTData() +{ +} + +const char * CZTData::ErrorString[] = {"Erreur de comptage S1-S2", + "Déclenchement frotteur négatif", + "Déclenchement pneu de guidage", + "Déclenchement pneu porteur intérieur", + "Déclenchement pneu porteur extérieur", + + "Erreur de comptage ZT2", + "Déclenchement pneu porteur intérieur ZT2", + "Déclenchement pneu porteur extérieur ZT2", + + "Panne équipement ZT1", + "Panne équipement ZT2", + + }; + +const char * CZTData::ShortErrorString[] = {"V00", + "DFN", + "DPG", + "DPPI", + "DPPE", + + "V002", + "DPPI2", + "DPPE2", + + "PEQ1", + "PEQ2"}; + +const char* CZTData::GetErrorString(unsigned int ErrorID) +{ + if(ErrorID >= DETECTION_MAX_DETECTION_ID) + ErrorID = 0; + return ErrorString[ErrorID]; +} + +const char* CZTData::GetShortErrorString(unsigned int ErrorID) +{ + if(ErrorID >= DETECTION_MAX_DETECTION_ID) + ErrorID = 0; + return ShortErrorString[ErrorID]; +} + +const char* CZTData::GetTrainTypeString(unsigned int TrainType) +{ + if(TrainType >= TRAIN_TYPE_MAX_ID) + TrainType = TRAIN_TYPE_UNKNOWN; + return TrainTypeString[TrainType]; +} + + +CZT1LogData::CZT1LogData(CZT1ThreadData *ThreadData): + mZT1ThreadData(ThreadData) +{ +} +CZT1LogData::~CZT1LogData() +{ + if(mZT1ThreadData != 0) + delete mZT1ThreadData; +} + +CZT1ThreadData::~CZT1ThreadData() +{ + +} + +void CZT1ThreadData::operator =(CZT1ThreadData& TD) +{ + mTimeStamp = TD.mTimeStamp; + mDateTime = TD.mDateTime; + mS1 = TD.mS1; + mS2 = TD.mS2; + mPInt = TD.mPInt; + mPExt = TD.mPExt; + mFN = TD.mFN; + mPG = TD.mPG; + + mBogie = TD.mBogie; + mRank = TD.mRank; + mS1Count = TD.mS1Count; + mS2Count = TD.mS2Count; + mFNCount = TD.mFNCount; + mPGExtValue = TD.mPGExtValue; + mPGIntValue = TD.mPGIntValue; + mTrainSpeed = TD.mTrainSpeed; + mTrainType = TD.mTrainType; +} + + + +QDataStream &operator<<(QDataStream &out, const CZT1FlagsData &source) +{ + out << source.mExtPGOffset + << source.mIntPGOffset + << source.mPGCalibrationON + << source.mPGTresholdValue + << source.mAnalogTracePresent + << source.mIsProblematicPassage + ; + + return out; +} + +QDataStream &operator>>(QDataStream &in, CZT1FlagsData &dest) +{ + in >> dest.mExtPGOffset + >> dest.mIntPGOffset + >> dest.mPGCalibrationON + >> dest.mPGTresholdValue + >> dest.mAnalogTracePresent + >> dest.mIsProblematicPassage + ; + + return in; +} + +QDataStream& operator<<(QDataStream &out, const CZT1LogData &source) +{ + quint32 ThreadDataValid = 0; + if(source.mZT1ThreadData != 0) + ThreadDataValid = 1; + + + out << source.mDateTime + << source.mTimestamp + << source.mCIZT1 + << source.mCDVApproach_ZT1 + << source.mCDVARM_ZT1 + << ThreadDataValid; + + if(ThreadDataValid == 1) + { + out << source.mZT1ThreadData->mS1 + << source.mZT1ThreadData->mS2 + << source.mZT1ThreadData->mFN + << source.mZT1ThreadData->mPInt + << source.mZT1ThreadData->mPExt + << source.mZT1ThreadData->mPG + << source.mZT1ThreadData->mTrainSpeed + << source.mZT1ThreadData->mBogie + << source.mZT1ThreadData->mRank + << source.mZT1ThreadData->mPGExtValue + << source.mZT1ThreadData->mPGIntValue + << source.mZT1ThreadData->mTrainType + << source.mZT1ThreadData->mS1Count + << source.mZT1ThreadData->mS2Count; + } + + return out; +} + +QDataStream &operator>>(QDataStream &in, CZT1LogData &dest) +{ + quint32 ThreadValid; + in >> dest.mDateTime + >> dest.mTimestamp + >> dest.mCIZT1 + >> dest.mCDVApproach_ZT1 + >> dest.mCDVARM_ZT1 + >> ThreadValid; + if(ThreadValid == 1) + { + dest.mZT1ThreadData = new CZT1ThreadData(); + in >> dest.mZT1ThreadData->mS1 + >> dest.mZT1ThreadData->mS2 + >> dest.mZT1ThreadData->mFN + >> dest.mZT1ThreadData->mPInt + >> dest.mZT1ThreadData->mPExt + >> dest.mZT1ThreadData->mPG + >> dest.mZT1ThreadData->mTrainSpeed + >> dest.mZT1ThreadData->mBogie + >> dest.mZT1ThreadData->mRank + >> dest.mZT1ThreadData->mPGExtValue + >> dest.mZT1ThreadData->mPGIntValue + >> dest.mZT1ThreadData->mTrainType + >>dest.mZT1ThreadData->mS1Count + >>dest.mZT1ThreadData->mS2Count; + } + + return in; +} + + +QDataStream &operator<<(QDataStream &out, const CZTDetectionData &source) +{ + out << source.mTimeStamp + << source.mRank + << source.mDetectionID; + + return out; +} + +QDataStream &operator>>(QDataStream &in, CZTDetectionData &dest) +{ + in >> dest.mTimeStamp + >> dest.mRank + >> dest.mDetectionID; + + return in; +} + +CZT2LogData::CZT2LogData(CZT2ThreadData *ThreadData): + mZT2ThreadData(ThreadData) +{ +} +CZT2LogData::~CZT2LogData() +{ + if(mZT2ThreadData != 0) + delete mZT2ThreadData; +} +QDataStream &operator<<(QDataStream &out, const CZT2FlagsData &source) +{ + out << source.mIsProblematicPassage + ; + + return out; +} + +QDataStream &operator>>(QDataStream &in, CZT2FlagsData &dest) +{ + in >> dest.mIsProblematicPassage + ; + + return in; +} + + +QDataStream& operator<<(QDataStream &out, const CZT2LogData &source) +{ + quint32 ThreadDataValid = 0; + if(source.mZT2ThreadData != 0) + ThreadDataValid = 1; + + out << source.mDateTime + << source.mTimestamp + << source.mCIZT2 + << source.mCDVARM_ZT2 + << source.mCDVApproach_ZT2 + << ThreadDataValid; + + if(ThreadDataValid == 1) + { + out << source.mZT2ThreadData->mS1 + << source.mZT2ThreadData->mPPInt + << source.mZT2ThreadData->mPPExt + << source.mZT2ThreadData->mBogie + << source.mZT2ThreadData->mRank + << source.mZT2ThreadData->mS1Count; + } + + return out; +} + +QDataStream &operator>>(QDataStream &in, CZT2LogData &dest) +{ + quint32 ThreadValid; + in >> dest.mDateTime + >> dest.mTimestamp + >> dest.mCIZT2 + >> dest.mCDVARM_ZT2 + >> dest.mCDVApproach_ZT2 + >> ThreadValid; + if(ThreadValid == 1) + { + dest.mZT2ThreadData = new CZT2ThreadData(); + in >> dest.mZT2ThreadData->mS1 + >> dest.mZT2ThreadData->mPPInt + >> dest.mZT2ThreadData->mPPExt + >> dest.mZT2ThreadData->mBogie + >> dest.mZT2ThreadData->mRank + >> dest.mZT2ThreadData->mS1Count; + } + + return in; +} + +CZTDetectionFunctionConfig::CZTDetectionFunctionConfig() +{ + for(int i = 0; i < DETECTION_FCT_MAX_FCT; i++) + { + mZTDetectionConfig[i].AnalysisActive = false; + mZTDetectionConfig[i].TKActive = false; + } +} + +void CZTDetectionFunctionConfig::operator =(CZTDetectionFunctionConfig& DF) +{ + for(int i = 0; i < DETECTION_FCT_MAX_FCT; i++) + { + mZTDetectionConfig[i].AnalysisActive = DF.mZTDetectionConfig[i].AnalysisActive; + mZTDetectionConfig[i].TKActive = DF.mZTDetectionConfig[i].TKActive; + } +} + +QDataStream &operator<<(QDataStream &out, const CZTDetectionFunctionConfig &source) +{ + for(int i = 0; i < DETECTION_FCT_MAX_FCT; i++) + { + out << source.mZTDetectionConfig[i].AnalysisActive + << source.mZTDetectionConfig[i].TKActive; + } + return out; +} + +QDataStream &operator>>(QDataStream &in, CZTDetectionFunctionConfig &dest) +{ + for(int i = 0; i < DETECTION_FCT_MAX_FCT; i++) + { + in >> dest.mZTDetectionConfig[i].AnalysisActive + >> dest.mZTDetectionConfig[i].TKActive; + } + return in; +} +CSettingsData::CSettingsData() +{ + +} +CZTSettingsData::CZTSettingsData() +{ + mDetectionFunctionSettings = new CZTDetectionFunctionConfig(); + mAutoExportZT1CSV = false; + mAutoExportZT2CSV = false; +} + +QDataStream &operator<<(QDataStream &out, const CZTNetworkConfig &source) +{ + out << source.mZTID + << source.mIPAdress; + + return out; +} + +QDataStream &operator>>(QDataStream &in, CZTNetworkConfig &dest) +{ + in >> dest.mZTID + >> dest.mIPAdress; + + return in; +} diff --git a/sources/ZTData.h b/sources/ZTData.h new file mode 100644 index 0000000..b388fd9 --- /dev/null +++ b/sources/ZTData.h @@ -0,0 +1,348 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Ces classes contiennent l'état de la Zone Tests et les informations nécessaires + au fonctionnement des machines à états. +*/ + +/* ************************************************************************** */ +/* Revision: +### 20130501 JFM + Verision d'origine. + +### YYYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + +#ifndef ZTDATA_H +#define ZTDATA_H + +#include "GlobalDefine.h" +#include +#include +#include +#include + +enum eZTLOGType +{ + ZT1_LOG_TYPE, + ZT2_LOG_TYPE, + UNKNOWN_LOG_TYPE +}; + +enum eCDVState +{ + CDV_STATE_OCCUPIED, + CDV_STATE_FREE, + CDV_STATE_ITI_CMD, + CDV_STATE_UNKNOWN +}; + +enum eSwitchCVDPosition +{ + SWITCH_CDV_NORMAL_POSITION, + SWITCH_CDV_REVERSE_POSITION, + SWITCH_CDV_UNKNOWN_POSITION +}; + +enum eCDVType +{ + CDV_NORMAL_TYPE, + CDV_SWITCH_TYPE +}; + +enum eDetectionID +{ + DETECTION_MAGNETIC_SENSOR_COUNT, + DETECTION_FN_DETECTION, + DETECTION_PG_DETECTION, + DETECTION_PPI_DETECTION, + DETECTION_PPE_DETECTION, + + DETECTION_ZT2_MAGNETIC_SENCOR_COUNT, + DETECTION_ZT2_PPI_DETECTION, + DETECTION_ZT2_PPE_DETECTION, + + DETECTION_PEQ1_DETECTION, + DETECTION_PEQ2_DETECTION, + + DETECTION_MAX_DETECTION_ID +}; + +enum eDetectionFunctionID +{ + DETECTION_FCT_FN, + DETECTION_FCT_PG, + DETECTION_FCT_PP, + DETECTION_FCT_PP2, + DETECTION_FCT_ZT1, + DETECTION_FCT_ZT2, + + DETECTION_FCT_MAX_FCT +}; + +enum eTrainTypeID +{ + TRAIN_TYPE_UNKNOWN, + TRAIN_TYPE_MR63_MR73, + TRAIN_TYPE_MPM10, + + + TRAIN_TYPE_MAX_ID +}; + +enum eZT1FlagsID +{ + ZT1_INT_PG_OFFSET_FLAG_ID, + ZT1_EXT_PG_OFFSET_FLAG_ID, + ZT1_PG_TRESHOLD_VALUE_FLAG_ID, + ZT1_PG_CALIB_ON_FLAG_ID, + + + ZT1_MAX_FLAG_ID +}; + +enum eZTStatus +{ + SB_ZT_ACTIVE_STATUS, + SB_ZT_INACTIVE_STATUS, + SB_ZT_NOT_PRESENT_STATUS, + SB_ZT_DISABLED_STATUS, + SB_ZT_MAX_STATUS +}; + +class CZTData +{ +public: + CZTData(); + + + + unsigned int mCIZT2; + + static const char *ErrorString[]; + static const char *ShortErrorString[]; + static const char* GetErrorString(unsigned int ErrorID); + static const char* GetShortErrorString(unsigned int ErrorID); + + static const char *TrainTypeString[]; + static const char *GetTrainTypeString(unsigned int TrainType); + +}; + +//This class contains data from the ZT1 analysis thread +//that is periodically communicated to the main thread +class CZT1ThreadData +{ + +public: + ~CZT1ThreadData(); + qint64 mTimeStamp; //nanosecs + QDateTime mDateTime; + quint32 mS1; + quint32 mS2; + quint32 mPInt; + quint32 mPExt; + quint32 mFN; + quint32 mPG; + + quint32 mBogie; + quint32 mRank; + quint32 mS1Count; + quint32 mS2Count; + quint32 mFNCount; + qint32 mPGExtValue; + qint32 mPGIntValue; + qreal mTrainSpeed; + quint32 mTrainType; + + void operator=(CZT1ThreadData& a); +}; + + +class CZT1FlagsData +{ +public: + qint32 mIntPGOffset; + qint32 mExtPGOffset; + qint32 mPGTresholdValue; + qint32 mPGCalibrationON; + qint32 mAnalogTracePresent; + qint32 mIsProblematicPassage; //This flag will be set if problems have been detected but not sent to PCC due to PURE comitee rules. +}; + +QDataStream &operator<<(QDataStream &out, const CZT1FlagsData &source); +QDataStream &operator>>(QDataStream &in, CZT1FlagsData &dest); + +class CZT1LogData +{ +public: + CZT1LogData(CZT1ThreadData *ThreadData = 0); + ~CZT1LogData(); + + QDateTime mDateTime; + qint64 mTimestamp; + quint32 mCIZT1; + quint32 mCDVApproach_ZT1; + quint32 mCDVARM_ZT1; +#ifdef USE_ANALOG_ACQUISITION + qint32 mAnalogData; //The analog data must be written or read to/from file manually (not part of the QStream << operator overloading) +#endif + + CZT1ThreadData *mZT1ThreadData; +}; + +class CZT1Log +{ +public: +// QList mZT1LogData; + QVector mZT1LogData; + CZT1FlagsData mZT1Flags; +}; + +QDataStream &operator<<(QDataStream &out, const CZT1LogData &source); +QDataStream &operator>>(QDataStream &in, CZT1LogData &dest); + +class CZT2ThreadData +{ +public: + qint64 mTimeStamp; + quint32 mS1; + quint32 mPPInt; + quint32 mPPExt; + + quint32 mBogie; + quint32 mRank; + quint32 mS1Count; +}; + +class CZTDetectionData +{ +public: + + qint64 mTimeStamp; +// QDateTime mDateTime; + quint32 mDetectionID; + quint32 mRank; +// quint32 mBogie; + +}; +QDataStream &operator<<(QDataStream &out, const CZTDetectionData &source); +QDataStream &operator>>(QDataStream &in, CZTDetectionData &dest); + +class CZT2FlagsData +{ +public: + qint32 mIsProblematicPassage; //This flag will be set if problems have been detected but not sent to PCC due to PURE comitee rules. +}; + +QDataStream &operator<<(QDataStream &out, const CZT2FlagsData &source); +QDataStream &operator>>(QDataStream &in, CZT2FlagsData &dest); + +class CZT2LogData +{ +public: + CZT2LogData(CZT2ThreadData *ThreadData = 0); + ~CZT2LogData(); + + QDateTime mDateTime; + qint64 mTimestamp; + quint32 mCIZT2; + quint32 mCDVARM_ZT2; + quint32 mCDVApproach_ZT2; + + CZT2ThreadData *mZT2ThreadData; +}; +QDataStream &operator<<(QDataStream &out, const CZT2LogData &source); +QDataStream &operator>>(QDataStream &in, CZT2LogData &dest); + +class CZT2Log +{ +public: + QVector mZT2LogData; + CZT2FlagsData mZT2Flags; +}; + + +class CZTDetectionConfig +{ +public: + bool AnalysisActive; + bool TKActive; +}; + +class CZTDetectionFunctionConfig +{ +public: + CZTDetectionFunctionConfig(); + CZTDetectionConfig mZTDetectionConfig[DETECTION_FCT_MAX_FCT]; + + void operator=(CZTDetectionFunctionConfig& a); + +}; + +QDataStream &operator<<(QDataStream &out, const CZTDetectionFunctionConfig &source); +QDataStream &operator>>(QDataStream &in, CZTDetectionFunctionConfig &dest); + +class CZTSettingsData +{ + public: + CZTSettingsData(); + + CZTDetectionFunctionConfig *mDetectionFunctionSettings; + bool mAutoExportZT1CSV; + bool mAutoExportZT2CSV; + int mPGTreshold; + +}; +class CZTNetworkConfig +{ +public: + int mZTID; + QString mIPAdress; +}; + +QDataStream &operator<<(QDataStream &out, const CZTNetworkConfig &source); +QDataStream &operator>>(QDataStream &in, CZTNetworkConfig &dest); + +class CSettingsData +{ + public: + CSettingsData(); + + QString mDataSourceDirectoryPath; + QList mNetworkCfgList; + +}; + +class CZTPGCalibrationData +{ + public: + qint64 mTimestamp; + int mTrainNbr; + qint32 mPGExtValue; + qint32 mPGIntValue; +}; + +class CZTLogFileInfo +{ +public: + QDateTime mStartDateTime; + QDateTime mEndDateTime; + QString mStationName; + int mZTStationID; + QString mZTLogFilePath; +}; + +#endif // ZTDATA_H diff --git a/sources/ZTLogFilesMgr.cpp b/sources/ZTLogFilesMgr.cpp new file mode 100644 index 0000000..b53df11 --- /dev/null +++ b/sources/ZTLogFilesMgr.cpp @@ -0,0 +1,391 @@ +#include "ZTLogFilesMgr.h" +#include +#include +#include "OutilZT.h" +#include +#include +#include + +CZTLogFilesMgr::CZTLogFilesMgr() +{ + + mProgramHandle = 0; + + mDirParserThread = new QThread(); + mDirParserWorkerThread = new CDirParserThread(); + mDirParserWorkerThread->moveToThread(mDirParserThread); + connect(mDirParserThread,SIGNAL(started()),mDirParserWorkerThread,SLOT(ParseDirectories())); + connect(mDirParserThread,SIGNAL(finished()),this,SLOT(ThreadQuit())); + connect(mDirParserThread,SIGNAL(terminated()),this,SLOT(ThreadTerminated())); + connect(mDirParserWorkerThread,SIGNAL(NewLogParsed(QString,bool)),this,SLOT(NewZTLogParsed(QString,bool))); + connect(mDirParserWorkerThread,SIGNAL(ParsingFinished(int)),this,SLOT(DirParsingFinished(int))); + connect(mDirParserWorkerThread,SIGNAL(EmptyDirParsed()),this,SLOT(EmptyDirParsed())); + + mDatabaseParsingTimer = new QTimer(); + mDatabaseParsingTimer->setInterval(60000); + connect(mDatabaseParsingTimer,SIGNAL(timeout()),this,SLOT(ParsingTimerExpired())); + + mSaveDBFile = false; +} + +CZTLogFilesMgr::~CZTLogFilesMgr() +{ + delete mDirParserThread; + delete mDirParserWorkerThread; + delete mDatabaseParsingTimer; +} + + +void CZTLogFilesMgr::DestroyZTLogFilesList() +{ + mZTLogFilesList.clear(); +} + +void CZTLogFilesMgr::ParseZTLogFiles(bool RebuildDatabase) +{ + mZTLogFilesList.clear(); + + if(RebuildDatabase == true) + { + mSaveDBFile = true; + mDirParserWorkerThread->SetParsingInfo(QDir(mLogDatabaseDir),"*.txt",false); + mDirParserThread->start(); + mProgramHandle->ZTLogFilesFetchingBegin(this); + return ; + } + else + { + QDir BaseDir(mLogDatabaseDir); + QString DatabaseFilePath = BaseDir.filePath("ZTLogs.zdb"); + // DatabaseFilePath += "Trains.zdb"; + QFile* DatabaseFile = new QFile(BaseDir.filePath("ZTLogs.zdb")/*DatabaseFilePath*/); + + + if(DatabaseFile) + { + if(DatabaseFile->open(QIODevice::ReadOnly | QIODevice::Unbuffered) == false) + { + mSaveDBFile = true; + mDirParserWorkerThread->SetParsingInfo(QDir(mLogDatabaseDir),"*.txt",false); + mDirParserThread->start(); + mProgramHandle->ZTLogFilesFetchingBegin(this); + + delete DatabaseFile; + return ; + } + } + else + { + QMessageBox::information(0,"Erreur","Impossible de créer le fichier DB ZTLog"); + return ; + } + + QByteArray DBData = DatabaseFile->readAll(); + QDataStream *DBStrm = new QDataStream(DBData); + + qint32 NBRecords; + *DBStrm >> NBRecords; + + for(qint32 i = 0; i < NBRecords; i++) + { + CZTLogFileInfo NewElement; + + *DBStrm >> NewElement.mStationName + >> NewElement.mZTStationID + >> NewElement.mStartDateTime + >> NewElement.mEndDateTime + >> NewElement.mZTLogFilePath; + + mZTLogFilesList.append(NewElement); + } + + DatabaseFile->close(); + delete DatabaseFile; + delete DBStrm; + + DirParsingFinished(1); + + + + } +} + +void CZTLogFilesMgr::NewZTLogParsed(QString FilePath, bool KeepData) +{ + Q_UNUSED(KeepData) + + mProgramHandle->ZTLogFilesFetchingTick(this,mZTLogFilesList.size(),FilePath); + ExtractLogInfo(FilePath); + mDatabaseParsingTimer->start(); +} + +void CZTLogFilesMgr::DirParsingFinished(int Res) +{ + qDebug("ZTLog Files Parsing finished with result %d",Res); + mDirParserThread->quit(); + mDatabaseParsingTimer->stop(); + mProgramHandle->ZTLogFilesDatabaseLoaded(this,Res); + qDebug("Parsed %d ZTLog files",mZTLogFilesList.size()); + + if(mSaveDBFile == true) + { + SaveDatabaseFile(); + } +} + +int CZTLogFilesMgr::GetZTLogFilesCount() +{ + return mZTLogFilesList.size(); +} + +void CZTLogFilesMgr::ParsingTimerExpired() +{ + qDebug("ZTLogs Parsing timer timeout"); + mDirParserWorkerThread->KillThread(); + mDirParserThread->terminate(); + DirParsingFinished(2); +} + +void CZTLogFilesMgr::EmptyDirParsed() +{ + //The thread is not stuck. Kick the timer... + mDatabaseParsingTimer->start(); +} + +void CZTLogFilesMgr::ThreadQuit() +{ + // qDebug("Thread quit slot"); +} + +void CZTLogFilesMgr::ThreadTerminated() +{ + // qDebug("Thread terminated slot"); +} + + +bool CZTLogFilesMgr::ExtractLogInfo(QString LogFilePath) +{ + QFileInfo LogFileInfo(LogFilePath); + + if(LogFileInfo.fileName() != "ZTLog.txt") + return false; + + CZTLogFileInfo NewLogFileInfo; + + + int line =0; + QFile *LogFile = new QFile(LogFilePath); + if(LogFile) + { + if(LogFile->open(QIODevice::ReadOnly | QIODevice::Text | QIODevice::Unbuffered) == true) + { + QString LogText(LogFile->readAll()); + + QTextStream strm(&LogText); + strm.seek(0); + + QString temp; + + //find a valid line + do + { + temp = strm.readLine(); + line++; + + if(strm.atEnd()) + break; + } + while(temp.length() < 10); + + // temp = strm.readLine(); + QStringList parts = temp.split(" : "); + QString LineText,DateString; + + + if(parts.size() != 0) + { + LineText.clear(); + + DateString = parts.at(0); + NewLogFileInfo.mStartDateTime = QDateTime::fromString(DateString,"yyyy/MM/dd - hh:mm:ss.zzz"); + } + + //go to end of file + QString LastValidLine; + do + { + temp = strm.readLine(); + if(temp.size() >=10) + LastValidLine = temp; + } + while(!strm.atEnd()); + + parts = LastValidLine.split(" : "); + + if(parts.size() != 0) + { + DateString = parts.at(0); + NewLogFileInfo.mEndDateTime = QDateTime::fromString(DateString,"yyyy/MM/dd - hh:mm:ss.zzz"); + } + LogFile->close(); + } + delete LogFile; + } + else + { + return false; + } + + NewLogFileInfo.mZTLogFilePath = LogFilePath; + + if(LogFilePath.contains("ANG")) + { + NewLogFileInfo.mZTStationID = ANGRIGNON_ZT_ID; + NewLogFileInfo.mStationName = mProgramHandle->GetStationName(ANGRIGNON_ZT_ID);// "Angrignon"; + } + else if(LogFilePath.contains("BUQ4")) + { + NewLogFileInfo.mZTStationID = BERRI_UQAM_ZT_ID; + NewLogFileInfo.mStationName = mProgramHandle->GetStationName(BERRI_UQAM_ZT_ID);//"Berri-UQAM"; + } + else if(LogFilePath.contains("HBOU")) + { + NewLogFileInfo.mZTStationID = HENRI_BOURASSA_ZT_ID; + NewLogFileInfo.mStationName = mProgramHandle->GetStationName(HENRI_BOURASSA_ZT_ID);//"Henri-Bourassa"; + } + else if(LogFilePath.contains("HBGR")) + { + NewLogFileInfo.mZTStationID = HONORE_BEAUGRAND_ZT_ID; + NewLogFileInfo.mStationName = mProgramHandle->GetStationName(HONORE_BEAUGRAND_ZT_ID);//"Honoré-Beaugrand"; + } + else if(LogFilePath.contains("LONG")) + { + NewLogFileInfo.mZTStationID = LONGUEUIL_ZT_ID; + NewLogFileInfo.mStationName = mProgramHandle->GetStationName(LONGUEUIL_ZT_ID);//"Longueuil"; + } + else if(LogFilePath.contains("MMOY")) + { + NewLogFileInfo.mZTStationID = MONTMORENCY_ZT_ID; + NewLogFileInfo.mStationName = mProgramHandle->GetStationName(MONTMORENCY_ZT_ID);//"Montmorency"; + } + else if(LogFilePath.contains("MMO")) + { + NewLogFileInfo.mZTStationID = MONTMORENCY_10_12_ZT_ID; + NewLogFileInfo.mStationName = mProgramHandle->GetStationName(MONTMORENCY_10_12_ZT_ID);//"Montmorency 10/12"; + } + else if(LogFilePath.contains("MMO2")) + { + NewLogFileInfo.mZTStationID = MONTMORENCY_10_22_ZT_ID; + NewLogFileInfo.mStationName = mProgramHandle->GetStationName(MONTMORENCY_10_22_ZT_ID);///"Montmorency 10/22"; + } + else if(LogFilePath.contains("SMIC")) + { + NewLogFileInfo.mZTStationID = SAINT_MICHEL_ZT_ID; + NewLogFileInfo.mStationName = mProgramHandle->GetStationName(SAINT_MICHEL_ZT_ID);//"Saint-Michel"; + } + else if(LogFilePath.contains("SNW5")) + { + NewLogFileInfo.mZTStationID = SNOWDON_ZT_ID; + NewLogFileInfo.mStationName = mProgramHandle->GetStationName(SNOWDON_ZT_ID);//"Snowdon"; + } + else + { + return false; + } + + mZTLogFilesList.append(NewLogFileInfo); + + return true; +} + +int CZTLogFilesMgr::ParseDir(QDir dir) +{ + + QStringList LogFilters; + QFileInfoList list; + // QString LogDataDir = mProgramHandle->GetLogDataPath(); + LogFilters << "*.txt"; + + //Load files in base directory + QDir LogDir(dir); + LogDir.setFilter(QDir::Files | QDir::NoDotAndDotDot); + LogDir.setNameFilters(LogFilters); + LogDir.setSorting(QDir::Name); + list = LogDir.entryInfoList(); + if(list.size() != 0) + { + //Extract data for each passage + for(int i = 0; i < list.size(); i++) + { + ExtractLogInfo(list.at(i).absoluteFilePath()); + } + } + + + //Check for subdirectories + QDir SubDirectories(dir); + + SubDirectories.setFilter(QDir::Dirs | QDir::NoDotAndDotDot); + + QFileInfoList SubDirList = SubDirectories.entryInfoList(); + for(int i = 0; i < SubDirList.size(); i++) + { + ParseDir(QDir(SubDirList.at(i).absoluteFilePath())); + } + + return 1; +} + +int CZTLogFilesMgr::SaveDatabaseFile() +{ + qDebug("Saving ZTLogs.zdb database"); + QDir BaseDir(mLogDatabaseDir); + QString DatabaseFilePath = BaseDir.filePath("ZTLogs.zdb"); + // DatabaseFilePath += "Trains.zdb"; + QFile* DatabaseFile = new QFile(BaseDir.filePath("ZTLogs.zdb")/*DatabaseFilePath*/); + + + if(DatabaseFile) + { + if(DatabaseFile->open(QIODevice::WriteOnly | QIODevice::Unbuffered) == false) + { + QMessageBox::information(0,"Erreur","Impossible de créer le fichier DB ZTLog"); + delete DatabaseFile; + return RET_ERROR; + } + } + else + { + QMessageBox::information(0,"Erreur","Impossible de créer le fichier DB ZTLog"); + return RET_ERROR; + } + + + QByteArray byteArray; + QBuffer FileBuffer(&byteArray); + FileBuffer.open(QIODevice::WriteOnly); + QDataStream *DBStrm = new QDataStream(&FileBuffer); + + qint32 NBRecords = mZTLogFilesList.size(); + *DBStrm << NBRecords; + + for(int i = 0; i < mZTLogFilesList.size(); i++) + { + *DBStrm << mZTLogFilesList.at(i).mStationName + << mZTLogFilesList.at(i).mZTStationID + << mZTLogFilesList.at(i).mStartDateTime + << mZTLogFilesList.at(i).mEndDateTime + << mZTLogFilesList.at(i).mZTLogFilePath; + } + + FileBuffer.seek(0); + DatabaseFile->write(FileBuffer.buffer()); + DatabaseFile->flush(); + + FileBuffer.close(); + DatabaseFile->close(); + delete DatabaseFile; + delete DBStrm; + mSaveDBFile = false; + return RET_OK; +} diff --git a/sources/ZTLogFilesMgr.h b/sources/ZTLogFilesMgr.h new file mode 100644 index 0000000..01c4e86 --- /dev/null +++ b/sources/ZTLogFilesMgr.h @@ -0,0 +1,83 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 - 2013 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Cette classe est responsable de la création d'une liste de tous lesfichiers + ZTLog présents dans la base de données. À ne pas confondre avec les fichiers + de passage. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20150227 JFM + + +### YYYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ + +#ifndef ZTLOGFILESMGR_H +#define ZTLOGFILESMGR_H + +#include "ZTData.h" +#include "GlobalDefine.h" +#include +#include +#include "DirParserThread.h" +#include +#include + +class COutilZT; + +class CZTLogFilesMgr: public QObject +{ + Q_OBJECT +public: + CZTLogFilesMgr(); + ~CZTLogFilesMgr(); + + COutilZT *mProgramHandle; + + void DestroyZTLogFilesList(); + void ParseZTLogFiles(bool RebuildDatabase); + bool ExtractLogInfo(QString LogFilePath); + void SetLogDataDir(QString Dir){mLogDatabaseDir = Dir;} + QList *GetZTLogsList(){return &mZTLogFilesList;} + int GetZTLogFilesCount(); + int SaveDatabaseFile(); + +private: + + QList mZTLogFilesList; + QString mLogDatabaseDir; + QThread *mDirParserThread; + CDirParserThread *mDirParserWorkerThread; + QTimer *mDatabaseParsingTimer; + bool mSaveDBFile; + + + int ParseDir(QDir dir); + +public slots: + void NewZTLogParsed(QString,bool); + void DirParsingFinished(int); + void ParsingTimerExpired(); + void EmptyDirParsed(); + + + void ThreadQuit(); + void ThreadTerminated(); +}; + +#endif // ZTLOGFILESMGR_H diff --git a/sources/main.cpp b/sources/main.cpp new file mode 100644 index 0000000..26f1f63 --- /dev/null +++ b/sources/main.cpp @@ -0,0 +1,73 @@ +/******************************************************************************* +* * +* Société de Transports de Montréal. * +* 2012 * +* * +* Projet Zones Tests * +* * +* * +* * +*******************************************************************************/ +/* + Description: + Le main. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20121210 JFM + Verision d'origine. + +### YYYYMMDD Description du besoin ou du bug + Description du changement. + */ + +/* ************************************************************************** */ +#include +#include "OutilZT.h" +#include "MainPanel.h" + +int main(int argc, char *argv[]) +{ + QApplication::setGraphicsSystem("raster"); + //Qt Mainframe application instance. + QApplication a(argc, argv); + + QFont serifFont("Times", 10, QFont::Bold); + QApplication::setFont(serifFont); + + + bool EngMode = false; + bool CanImport = false; + for ( int i = 1 ; i < argc ; i ++ ) + { + // qDebug("%d %s",i,argv[i]); + if ( strcmp(argv[i],"-ing") == 0 ) + { + EngMode = true; + CanImport = true; + } + if ( strcmp(argv[i],"-import") == 0 ) + { + CanImport = true; + } + } + + + //Create program instance + COutilZT OutilZT; + OutilZT.mIsEngMode = EngMode; + OutilZT.mCanImport = CanImport; + + //setup stdout for screen printing. + setvbuf(stdout, NULL, _IONBF, 0 ); + + //Run Zone Tests + OutilZT.Start(); + + + return a.exec(); + + +}