Compare commits
1018
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
23235626ba | ||
|
|
9444959efe | ||
|
|
7a10b9f4b6 | ||
|
|
d440dbcc58 | ||
|
|
ae787622d2 | ||
|
|
d248630ddc | ||
|
|
b15d0a0a08 | ||
|
|
683ca25aaf | ||
|
|
d3cc50b6e8 | ||
|
|
8c3c866eff | ||
|
|
78907de455 | ||
|
|
500adfa789 | ||
|
|
9658fc28bd | ||
|
|
42ad98ab1f | ||
|
|
bd0a876b5b | ||
|
|
806cf0d670 | ||
|
|
82a51293b9 | ||
|
|
4cd7867e04 | ||
|
|
6560278568 | ||
|
|
08a233b2c5 | ||
|
|
7aa92d4806 | ||
|
|
468bcf786e | ||
|
|
21324985db | ||
|
|
4529602d97 | ||
|
|
bce5af56e0 | ||
|
|
f8643c4de1 | ||
|
|
161b20fea7 | ||
|
|
882e894fba | ||
|
|
79c87bedfd | ||
|
|
b1324c567c | ||
|
|
d2627be55b | ||
|
|
2ba6092385 | ||
|
|
fee0651595 | ||
|
|
58fc16d70b | ||
|
|
ddf8996f01 | ||
|
|
0c2cc0dad2 | ||
|
|
1e0c65f213 | ||
|
|
c53a2d9078 | ||
|
|
6223bc925f | ||
|
|
aca1d79023 | ||
|
|
45d12dea6f | ||
|
|
2cee6cb0f2 | ||
|
|
e9cda221bb | ||
|
|
c6181a76ec | ||
|
|
cd24373c80 | ||
|
|
a464b1fc21 | ||
|
|
b8f6af7112 | ||
|
|
1c8d01562f | ||
|
|
2608ee4de6 | ||
|
|
e63f706f41 | ||
|
|
94cd07cd3c | ||
|
|
967ca817ba | ||
|
|
979637cc07 | ||
|
|
5c7ff08a78 | ||
|
|
a64d1a82ed | ||
|
|
bf1766f90a | ||
|
|
1b789ad5d5 | ||
|
|
a7404d0e24 | ||
|
|
a64327ac36 | ||
|
|
c886303458 | ||
|
|
38003592df | ||
|
|
82c2b17a1f | ||
|
|
2660c564a6 | ||
|
|
7e2b4ed908 | ||
|
|
c1960f2150 | ||
|
|
4124443f36 | ||
|
|
6bab62a062 | ||
|
|
c426df990c | ||
|
|
20614fb9e6 | ||
|
|
302431b64c | ||
|
|
db34c579d0 | ||
|
|
83afddc918 | ||
|
|
cf77faf972 | ||
|
|
684513ee59 | ||
|
|
45a6d59b5e | ||
|
|
73c8fecdf2 | ||
|
|
8c77df207a | ||
|
|
1c6f9af2bb | ||
|
|
0cfde7f06b | ||
|
|
d3c361b544 | ||
|
|
b35b7d92f9 | ||
|
|
52bd0d01ce | ||
|
|
eb4f7ad971 | ||
|
|
8677e49680 | ||
|
|
29faef86e3 | ||
|
|
6ef42fcc21 | ||
|
|
d2d41df155 | ||
|
|
6d2477be4a | ||
|
|
57152ae749 | ||
|
|
88b8bc5534 | ||
|
|
41408b30da | ||
|
|
136be96e1b | ||
|
|
0258e54b4e | ||
|
|
d3c8813012 | ||
|
|
b8e54e1fc9 | ||
|
|
054075a341 | ||
|
|
8d42232589 | ||
|
|
e4d4d75642 | ||
|
|
2b5a0ffe14 | ||
|
|
a0d53f9ec9 | ||
|
|
dfa8693be9 | ||
|
|
8157a752bd | ||
|
|
4dd805bb1c | ||
|
|
1e45f48c75 | ||
|
|
d833eca584 | ||
|
|
c966a7034c | ||
|
|
f051d51ae0 | ||
|
|
267159e0a9 | ||
|
|
26db172153 | ||
|
|
2e75f65b4a | ||
|
|
432cb91e5a | ||
|
|
b0083afa10 | ||
|
|
955b59a195 | ||
|
|
b904d0ca41 | ||
|
|
f34046df2a | ||
|
|
889782068e | ||
|
|
d12ee008db | ||
|
|
6c3c6cd0ef | ||
|
|
5803f06bdb | ||
|
|
a4acf30771 | ||
|
|
a4ef208233 | ||
|
|
be6b40b5cd | ||
|
|
8738edd0c5 | ||
|
|
c71fe75446 | ||
|
|
c619c7d3b8 | ||
|
|
f3e5527145 | ||
|
|
39941842d4 | ||
|
|
3488939995 | ||
|
|
0f2ef5a5bf | ||
|
|
55d2381e8a | ||
|
|
126322584f | ||
|
|
4d9ddef3ca | ||
|
|
7139cdbe80 | ||
|
|
93d7456ccd | ||
|
|
7a8ce7b6ab | ||
|
|
865528e344 | ||
|
|
02bb9ee9fa | ||
|
|
79de40515a | ||
|
|
e38c6c1199 | ||
|
|
dbb35a203e | ||
|
|
a88a094e86 | ||
|
|
ffaebbdf07 | ||
|
|
e7d04b55b3 | ||
|
|
8301971906 | ||
|
|
693cf7e4e2 | ||
|
|
2fa212e6ff | ||
|
|
a210a0d1f2 | ||
|
|
4cd191fcb2 | ||
|
|
e21833fb5f | ||
|
|
b746ceb34a | ||
|
|
83c1f0e817 | ||
|
|
a88a5a8db2 | ||
|
|
271200a8da | ||
|
|
b703297f5e | ||
|
|
637d1d021d | ||
|
|
dbe424b17a | ||
|
|
be0525a319 | ||
|
|
0ce130f0ef | ||
|
|
c1ee29cd06 | ||
|
|
28607e2729 | ||
|
|
f1bc71fb92 | ||
|
|
69b607f963 | ||
|
|
6ac3ea87ef | ||
|
|
38973e0030 | ||
|
|
37c89a4c9c | ||
|
|
0075362f92 | ||
|
|
38d28599ad | ||
|
|
c9a4b0f3ce | ||
|
|
b74f1fd644 | ||
|
|
26b7aa7e8b | ||
|
|
92f63e744d | ||
|
|
b0581d81ef | ||
|
|
540b9af871 | ||
|
|
d11f7107fe | ||
|
|
3c5a28f69d | ||
|
|
110b880304 | ||
|
|
7867044c0a | ||
|
|
88903f3dac | ||
|
|
4e223549ee | ||
|
|
2ea0df8faf | ||
|
|
061e85ca6b | ||
|
|
269e650b38 | ||
|
|
a3bfc7a43e | ||
|
|
c2ff40d816 | ||
|
|
eb09ae2eca | ||
|
|
d1b6247bb7 | ||
|
|
c5f52e06fa | ||
|
|
9700ba7900 | ||
|
|
bc72130d09 | ||
|
|
ad208f9633 | ||
|
|
ad2bfd3639 | ||
|
|
5e637ae02e | ||
|
|
63f8dd7467 | ||
|
|
aac3af8714 | ||
|
|
378917f59d | ||
|
|
76e7ccb4a6 | ||
|
|
953b02a6e8 | ||
|
|
71a66dca2d | ||
|
|
978c620287 | ||
|
|
8489dafdf7 | ||
|
|
cfc52f195b | ||
|
|
68a1eb9941 | ||
|
|
c1573390b5 | ||
|
|
5d60523e87 | ||
|
|
91c63e0792 | ||
|
|
0940df2f1a | ||
|
|
16a76720b8 | ||
|
|
7101fd679e | ||
|
|
86299da682 | ||
|
|
39b951b709 | ||
|
|
a475bd80f3 | ||
|
|
4e64bcd117 | ||
|
|
fbd0219a4a | ||
|
|
104a68d9dc | ||
|
|
33a5e479a9 | ||
|
|
5482d4ac96 | ||
|
|
0d984a77b3 | ||
|
|
7e95e18207 | ||
|
|
38fa86d243 | ||
|
|
4c1ce73de9 | ||
|
|
eea80d39c0 | ||
|
|
15dc325275 | ||
|
|
ca333d1772 | ||
|
|
a4ece06b05 | ||
|
|
992452052e | ||
|
|
75192bbd09 | ||
|
|
6199bd48c5 | ||
|
|
25434d70d4 | ||
|
|
de6dd45dcb | ||
|
|
74f2e99ed3 | ||
|
|
99b1f4a171 | ||
|
|
8c10aa3752 | ||
|
|
7170da4a70 | ||
|
|
842f009b42 | ||
|
|
7f30ca0cd1 | ||
|
|
93e207c211 | ||
|
|
64cafc088a | ||
|
|
8a0da27a07 | ||
|
|
5a8478e782 | ||
|
|
368cd95114 | ||
|
|
33ef914984 | ||
|
|
3eb0b87f0d | ||
|
|
c13cb725f0 | ||
|
|
c6d4a016b5 | ||
|
|
eda0644b4b | ||
|
|
711dfc03ef | ||
|
|
93459ccfab | ||
|
|
5b73835d94 | ||
|
|
009aefb7c9 | ||
|
|
d2e18d615d | ||
|
|
69b475eb77 | ||
|
|
9848b97082 | ||
|
|
0b429ffbc2 | ||
|
|
ef146efaf0 | ||
|
|
431061a685 | ||
|
|
b6edd9c0a0 | ||
|
|
2210bb8240 | ||
|
|
8d7c1adf37 | ||
|
|
3376ac41b4 | ||
|
|
f9181fee74 | ||
|
|
4c77d6c06e | ||
|
|
b7db39853b | ||
|
|
66157ba988 | ||
|
|
65ab19290f | ||
|
|
e7e6fc7920 | ||
|
|
94c7279da1 | ||
|
|
2136695b80 | ||
|
|
c0f9b0ffa0 | ||
|
|
c4ef22436f | ||
|
|
0b73871518 | ||
|
|
f7dc6fee5e | ||
|
|
ba848a167d | ||
|
|
dcb0bf9a88 | ||
|
|
f6433134c1 | ||
|
|
7e3df77b5b | ||
|
|
ff5954d85b | ||
|
|
08dff1272b | ||
|
|
c09e266b2c | ||
|
|
d5c8fd1c8f | ||
|
|
a34740e838 | ||
|
|
836ba5a41f | ||
|
|
545a747ebc | ||
|
|
23c83ab452 | ||
|
|
bc9e583c29 | ||
|
|
18cef617da | ||
|
|
4ee736cff5 | ||
|
|
4e40dc8601 | ||
|
|
a5a68ec457 | ||
|
|
e26d88d437 | ||
|
|
98ba7d2dee | ||
|
|
78835c1af6 | ||
|
|
2522d1da9f | ||
|
|
8983c01591 | ||
|
|
61b1320d4f | ||
|
|
2c8a0922d1 | ||
|
|
b078d9586d | ||
|
|
6e35de5f4d | ||
|
|
2dbe4cded4 | ||
|
|
10865c6878 | ||
|
|
ee1353fe54 | ||
|
|
5cefd7fc3a | ||
|
|
ab0e5ea82a | ||
|
|
b2276c086c | ||
|
|
4fa462661c | ||
|
|
2b30d0cf34 | ||
|
|
df2c56e6c4 | ||
|
|
a997c3d7be | ||
|
|
3c964f2aab | ||
|
|
c445b3e098 | ||
|
|
2ea2a2592e | ||
|
|
27072598cd | ||
|
|
4a2d4772d7 | ||
|
|
2bf00606d3 | ||
|
|
3773e1d96c | ||
|
|
19ddc753c7 | ||
|
|
0c41c750e8 | ||
|
|
4bfd5c8e11 | ||
|
|
f0fb70e38b | ||
|
|
6e5bcafec0 | ||
|
|
d5cb18c910 | ||
|
|
3a2069b255 | ||
|
|
80c651dbfd | ||
|
|
5a3b9b57c4 | ||
|
|
ead350eef3 | ||
|
|
b43657a4db | ||
|
|
8fffb9e366 | ||
|
|
0fdd229141 | ||
|
|
2f1ada3f5b | ||
|
|
988a8c6642 | ||
|
|
42ee9eaee3 | ||
|
|
3f28051d79 | ||
|
|
65f13cc868 | ||
|
|
cd8ba3cda3 | ||
|
|
a5936c8f19 | ||
|
|
2842425673 | ||
|
|
06a401a1ff | ||
|
|
3a2fc50fec | ||
|
|
38a58ed8b7 | ||
|
|
c7cba20de0 | ||
|
|
6311df49c3 | ||
|
|
f1d32a39ba | ||
|
|
224b53f774 | ||
|
|
1e2777c5e7 | ||
|
|
c3c21649fb | ||
|
|
99ccabc142 | ||
|
|
f1e6e94450 | ||
|
|
320cddb177 | ||
|
|
42002e3fa4 | ||
|
|
77cabfd712 | ||
|
|
c933e2d759 | ||
|
|
f3f0a46627 | ||
|
|
b5fb4c2947 | ||
|
|
f6cce9df3c | ||
|
|
c0385c0782 | ||
|
|
db43bdb652 | ||
|
|
6bdc10f4a7 | ||
|
|
9692dc7f4f | ||
|
|
6795793858 | ||
|
|
a2c564d789 | ||
|
|
3bc9e731e8 | ||
|
|
95c5f09238 | ||
|
|
0a45d66c0b | ||
|
|
96408eaef3 | ||
|
|
cae3ca7cdf | ||
|
|
c8adc093e0 | ||
|
|
4395516216 | ||
|
|
9281b52464 | ||
|
|
6571de7c32 | ||
|
|
a75d66e028 | ||
|
|
e839148a6f | ||
|
|
65b502a9b1 | ||
|
|
9cde62b2e2 | ||
|
|
cc86c38246 | ||
|
|
357df87f49 | ||
|
|
4b33da565c | ||
|
|
d11f855325 | ||
|
|
eef1f31a21 | ||
|
|
b878ee96a5 | ||
|
|
97eed27458 | ||
|
|
fe08550dc3 | ||
|
|
8a0ae8080f | ||
|
|
ab4025e55f | ||
|
|
22fffe602c | ||
|
|
e4c0219783 | ||
|
|
3362fdfaff | ||
|
|
6093db4502 | ||
|
|
5e7598667b | ||
|
|
4fe8729b85 | ||
|
|
b1dd6666f1 | ||
|
|
a3613889e1 | ||
|
|
7b87d63531 | ||
|
|
d838c78a8a | ||
|
|
7a8bef501a | ||
|
|
9863b54bc8 | ||
|
|
e57c6a6a02 | ||
|
|
afa215534c | ||
|
|
780d44166e | ||
|
|
35e4078dda | ||
|
|
47e09584f2 | ||
|
|
fc8e82c0e8 | ||
|
|
b729b08da2 | ||
|
|
3209ff303c | ||
|
|
41693d9c83 | ||
|
|
8f02f4ff31 | ||
|
|
1525bb7c1a | ||
|
|
2aeaf42325 | ||
|
|
bf4fb469da | ||
|
|
efd0515295 | ||
|
|
be8ac28bc7 | ||
|
|
56dc89ac82 | ||
|
|
62ffc94c49 | ||
|
|
50a38bc557 | ||
|
|
3e643854bc | ||
|
|
0daefb93bb | ||
|
|
f5731c67a0 | ||
|
|
d2ae5f3e83 | ||
|
|
c4d332b68b | ||
|
|
1daa0212ef | ||
|
|
1748a83ec8 | ||
|
|
b3d6b5a59f | ||
|
|
891795b101 | ||
|
|
a20b0761fd | ||
|
|
3b9e8d754d | ||
|
|
fed3281525 | ||
|
|
c1d966d86a | ||
|
|
b2d2f8c13b | ||
|
|
4e5e3d63e1 | ||
|
|
25602fb914 | ||
|
|
602d0d5308 | ||
|
|
f95198e40e | ||
|
|
d2b2bbb94b | ||
|
|
a4246c7ea4 | ||
|
|
498fc21412 | ||
|
|
3f07a506ad | ||
|
|
fb74e2d785 | ||
|
|
3a2290570d | ||
|
|
3b68e3f9fd | ||
|
|
3184b1da8e | ||
|
|
b70a10e697 | ||
|
|
3433bbbebe | ||
|
|
4c0a797e98 | ||
|
|
203c2498ac | ||
|
|
2023ea5221 | ||
|
|
cbb3d4f735 | ||
|
|
8acf219ba2 | ||
|
|
68884cd7df | ||
|
|
1629d82d65 | ||
|
|
17ab11bdf1 | ||
|
|
d2ef959f15 | ||
|
|
21b00e9b83 | ||
|
|
3d7aaaaa3d | ||
|
|
705f7760af | ||
|
|
3b385d592d | ||
|
|
cf6a16656b | ||
|
|
f50f9bfa5b | ||
|
|
77d8c95930 | ||
|
|
57c2019405 | ||
|
|
46432bc61b | ||
|
|
a4360f6993 | ||
|
|
97e0a764b8 | ||
|
|
7409af70ac | ||
|
|
783d51e71a | ||
|
|
a710ab7457 | ||
|
|
6a428e3c76 | ||
|
|
2e56b8e5cf | ||
|
|
1a4c18fa35 | ||
|
|
153d031125 | ||
|
|
5d4c7dfe68 | ||
|
|
021beeb47f | ||
|
|
1140d67c75 | ||
|
|
f0d26a36be | ||
|
|
6afb10351e | ||
|
|
2f3259d063 | ||
|
|
30a9396e4a | ||
|
|
2a94347f3e | ||
|
|
30f5e6c935 | ||
|
|
0ad8bc6d75 | ||
|
|
c076d6b343 | ||
|
|
64e32751c0 | ||
|
|
279c8eefb4 | ||
|
|
b931ed62ff | ||
|
|
05665288ab | ||
|
|
8af89136e7 | ||
|
|
5b6461fa0a | ||
|
|
1f51924bc8 | ||
|
|
b1f3b72a96 | ||
|
|
dfc0661300 | ||
|
|
f747755301 | ||
|
|
ad2c1d615f | ||
|
|
11ad6d39ee | ||
|
|
0f394f622b | ||
|
|
09c542e1e6 | ||
|
|
d772a3d531 | ||
|
|
87206ebe79 | ||
|
|
f4c77feeef | ||
|
|
ae6d77efc1 | ||
|
|
8318ed33e1 | ||
|
|
c4c86b36d2 | ||
|
|
990b695db6 | ||
|
|
33f050ef71 | ||
|
|
026a95e3ac | ||
|
|
4fd9030812 | ||
|
|
45d138ece3 | ||
|
|
4a884a09a1 | ||
|
|
a524915f28 | ||
|
|
7982526790 | ||
|
|
b866c45e9b | ||
|
|
0073ac8b9e | ||
|
|
36d661c75e | ||
|
|
e3f1f2711b | ||
|
|
f9ae8c54e1 | ||
|
|
ad7abe5471 | ||
|
|
a027f3f544 | ||
|
|
0930df5e64 | ||
|
|
1c5bf76bb3 | ||
|
|
d2d697ae80 | ||
|
|
60f30e4c41 | ||
|
|
ecccfab7a6 | ||
|
|
1691c634c6 | ||
|
|
900a2d660c | ||
|
|
eaf60f3292 | ||
|
|
bc0de96ad9 | ||
|
|
a770f5a9b8 | ||
|
|
0fbc9e2bad | ||
|
|
ed5cd89d6a | ||
|
|
dd5b20ab38 | ||
|
|
3f35506b26 | ||
|
|
1ee7e00928 | ||
|
|
ffbfd5ebd5 | ||
|
|
7a2afd1bdc | ||
|
|
30f9ea19dd | ||
|
|
2ec8683b27 | ||
|
|
4f59f23c6f | ||
|
|
daac273edb | ||
|
|
edb084260f | ||
|
|
8370c7c2e7 | ||
|
|
4a394cc5d5 | ||
|
|
f4db55cc0b | ||
|
|
b4f41a2f1f | ||
|
|
5b9156d670 | ||
|
|
bebb83f6fc | ||
|
|
130b59fc91 | ||
|
|
b2a7cfb0d4 | ||
|
|
b67857f658 | ||
|
|
046fab05c0 | ||
|
|
6004a65572 | ||
|
|
0962efd159 | ||
|
|
cb1a471248 | ||
|
|
8da049219a | ||
|
|
91b55eb19c | ||
|
|
6b582bea64 | ||
|
|
61910932c2 | ||
|
|
1ecf528ff0 | ||
|
|
9a5ee99a82 | ||
|
|
cf626d7b91 | ||
|
|
b9e8eeab00 | ||
|
|
b880b62924 | ||
|
|
36f8bfa32f | ||
|
|
8be3b53db4 | ||
|
|
95759e70b4 | ||
|
|
2e6a17121f | ||
|
|
ed21db65c3 | ||
|
|
d29a425880 | ||
|
|
a4139d7a73 | ||
|
|
a6a517b6ea | ||
|
|
07f36f2945 | ||
|
|
e2048ed64c | ||
|
|
90b62779fd | ||
|
|
1c6488d621 | ||
|
|
62e9f612fc | ||
|
|
9e9a01bd43 | ||
|
|
6dcd40c640 | ||
|
|
b54de856af | ||
|
|
118ce9797f | ||
|
|
36ae8479ca | ||
|
|
9ca9d41ddc | ||
|
|
4f26815e68 | ||
|
|
abd68f9a44 | ||
|
|
ae8a0ca4c1 | ||
|
|
ac5684a2b5 | ||
|
|
0f738be73e | ||
|
|
4b85db202e | ||
|
|
96c300d34f | ||
|
|
dbdf1f8fb6 | ||
|
|
6158ee93dc | ||
|
|
6270e0c417 | ||
|
|
67ba9986f2 | ||
|
|
d2e8f4f0e3 | ||
|
|
c9ea85b7b8 | ||
|
|
86ed8b13bf | ||
|
|
328c170888 | ||
|
|
ee31628417 | ||
|
|
267a6557df | ||
|
|
177d17cb81 | ||
|
|
4d0441d9a2 | ||
|
|
01523d3765 | ||
|
|
751f3b29bb | ||
|
|
969041354b | ||
|
|
ba3fcad44d | ||
|
|
877c8446ae | ||
|
|
ae6ee631c6 | ||
|
|
155a3a3113 | ||
|
|
c00f90ed8a | ||
|
|
285facc3fd | ||
|
|
b9d1fe5de7 | ||
|
|
56e519b4e4 | ||
|
|
33f5274a6d | ||
|
|
f1f662a419 | ||
|
|
00fc9ea847 | ||
|
|
b0a534315e | ||
|
|
158bba0d27 | ||
|
|
4a1eb91c2f | ||
|
|
ae876a649a | ||
|
|
e608c9fd6b | ||
|
|
a8ba5d5113 | ||
|
|
2bae912fa0 | ||
|
|
451faf1586 | ||
|
|
1a49390ba8 | ||
|
|
395e159522 | ||
|
|
fefd846f13 | ||
|
|
19d54d4990 | ||
|
|
e428897822 | ||
|
|
1b402566ed | ||
|
|
5d23bcade3 | ||
|
|
56d68f0b63 | ||
|
|
c16e9a8d56 | ||
|
|
955e55f327 | ||
|
|
fbd9c976eb | ||
|
|
2c0ae68db0 | ||
|
|
9a42e199e3 | ||
|
|
e3bb64ef0f | ||
|
|
4361227975 | ||
|
|
c5d550259f | ||
|
|
ab140cc6af | ||
|
|
43ce2552a2 | ||
|
|
d6880fc1b7 | ||
|
|
4b450846df | ||
|
|
95fb7ab9cc | ||
|
|
c5db2c0138 | ||
|
|
deabff9a18 | ||
|
|
fc81344857 | ||
|
|
fd35f20501 | ||
|
|
80f4308ae1 | ||
|
|
33f823b2d8 | ||
|
|
5ad4a07965 | ||
|
|
03900e453e | ||
|
|
e96692405c | ||
|
|
4f70997a38 | ||
|
|
f3a61411f5 | ||
|
|
f20acf0e11 | ||
|
|
57e413d6ff | ||
|
|
12abe09661 | ||
|
|
4e09cf5adb | ||
|
|
938da3ac62 | ||
|
|
3c59cd1bee | ||
|
|
8578c7f220 | ||
|
|
f23fc0d4c4 | ||
|
|
10b17c250c | ||
|
|
8d47659660 | ||
|
|
08a08282b5 | ||
|
|
851c51aa7c | ||
|
|
ecc92176f3 | ||
|
|
2a97a8f584 | ||
|
|
c18f06af07 | ||
|
|
b9b609cabf | ||
|
|
f96bf993d8 | ||
|
|
899b379cf7 | ||
|
|
868d16d8ee | ||
|
|
bfe7c5a29e | ||
|
|
c7c1c21ab3 | ||
|
|
fe9cfa42ff | ||
|
|
32762f0fdb | ||
|
|
d42ad8c5cf | ||
|
|
2eaf2b044c | ||
|
|
0b400fcbd0 | ||
|
|
7facefb305 | ||
|
|
917051f072 | ||
|
|
589fd9cf18 | ||
|
|
4914ded61d | ||
|
|
1af0b71503 | ||
|
|
2f1a8cc9d6 | ||
|
|
32047ef76a | ||
|
|
18f7de5f97 | ||
|
|
6d3fa9b110 | ||
|
|
eea94d1d9f | ||
|
|
a6ba6e26b2 | ||
|
|
c75e3d08d3 | ||
|
|
43a32adb7e | ||
|
|
9a7ed9668b | ||
|
|
068aee3cbd | ||
|
|
2710823931 | ||
|
|
6150c5b808 | ||
|
|
3c93e56b67 | ||
|
|
af13e2f2b4 | ||
|
|
4d018a8ba8 | ||
|
|
df89050d78 | ||
|
|
6071d7f598 | ||
|
|
1b767f6298 | ||
|
|
8da5512eb0 | ||
|
|
1133a2d5bf | ||
|
|
c8ff5f8813 | ||
|
|
1f0bbc0d4e | ||
|
|
ba549cbaee | ||
|
|
1a8a6defd9 | ||
|
|
9a5f2c1a60 | ||
|
|
ee89158ae3 | ||
|
|
15e9c25dcf | ||
|
|
c826b40e80 | ||
|
|
804cf2aaea | ||
|
|
47511ef873 | ||
|
|
43caffd73d | ||
|
|
0d0355c65a | ||
|
|
dfddc8a980 | ||
|
|
68c3ccbef6 | ||
|
|
ff28d507cf | ||
|
|
2c00ed6dc4 | ||
|
|
cd84c82475 | ||
|
|
e324de985f | ||
|
|
0e45ef6689 | ||
|
|
edc48d8723 | ||
|
|
3630af4a59 | ||
|
|
d1e0d1466d | ||
|
|
bbffc3b406 | ||
|
|
9bc9db1792 | ||
|
|
19c9e3a2da | ||
|
|
9a79ff1344 | ||
|
|
021f17c774 | ||
|
|
513c808f2b | ||
|
|
09a0968b76 | ||
|
|
351157dbba | ||
|
|
0494054171 | ||
|
|
587f6dffd0 | ||
|
|
a35716733d | ||
|
|
44761ff411 | ||
|
|
5f7a80b826 | ||
|
|
99337ba7d9 | ||
|
|
772080ae3b | ||
|
|
9b5ee442a6 | ||
|
|
51b3e994c3 | ||
|
|
335fce3e39 | ||
|
|
44fc7b92fd | ||
|
|
0f5c4b083d | ||
|
|
5996fda348 | ||
|
|
339d79595d | ||
|
|
a2a3d5940e | ||
|
|
62913cf68f | ||
|
|
3b70baeff0 | ||
|
|
bfa69ef611 | ||
|
|
8c7bd51ca8 | ||
|
|
87fa7fb669 | ||
|
|
7205682d75 | ||
|
|
235da5e9e1 | ||
|
|
13b30b2caf | ||
|
|
b5e2a7bdc9 | ||
|
|
078bd8aaf4 | ||
|
|
cef5dc3c10 | ||
|
|
1355777fe0 | ||
|
|
f82da6e4c8 | ||
|
|
6c181cdb67 | ||
|
|
a0aea713b0 | ||
|
|
709636e82b | ||
|
|
273f2b73d4 | ||
|
|
c74047c292 | ||
|
|
dd72d6f046 | ||
|
|
f80181e53e | ||
|
|
7988cd60ba | ||
|
|
057e4fa240 | ||
|
|
398661b763 | ||
|
|
6809c75613 | ||
|
|
3e674b972a | ||
|
|
3a6b734aee | ||
|
|
554709538b | ||
|
|
47efa15dd5 | ||
|
|
a8f42cbb63 | ||
|
|
a975b5d0f4 | ||
|
|
af551b07bf | ||
|
|
84b48c4ecc | ||
|
|
16de6c5d8b | ||
|
|
3b81f1a143 | ||
|
|
aa04ea620b | ||
|
|
3a28e33437 | ||
|
|
95f9b01cb0 | ||
|
|
6309796af5 | ||
|
|
2a2eae0c6a | ||
|
|
11c47964a9 | ||
|
|
4c89c0f7c4 | ||
|
|
2106e82ede | ||
|
|
cd15ab2432 | ||
|
|
ac7c737d1b | ||
|
|
827a9f7c58 | ||
|
|
f1ef16e1a3 | ||
|
|
7613613fad | ||
|
|
9d01d565df | ||
|
|
9f5c89db06 | ||
|
|
0568966ba6 | ||
|
|
62d725d879 | ||
|
|
81151935bc | ||
|
|
bec7287531 | ||
|
|
db3a40d817 | ||
|
|
0a1966d5f9 | ||
|
|
cfe55e430a | ||
|
|
2642e3cc46 | ||
|
|
4f1e7507f9 | ||
|
|
3a2ab6c286 | ||
|
|
fc95847377 | ||
|
|
c5769bed0c | ||
|
|
24413482bc | ||
|
|
65b5164f0b | ||
|
|
b98af02b55 | ||
|
|
4e32d037ea | ||
|
|
5ea9c51f77 | ||
|
|
08c0a61110 | ||
|
|
fdb1e112dc | ||
|
|
870b49d8ad | ||
|
|
17c77758c6 | ||
|
|
3f0124825d | ||
|
|
5507a65170 | ||
|
|
b2099ad68c | ||
|
|
9d1698b462 | ||
|
|
847956f708 | ||
|
|
95d5d16c83 | ||
|
|
b36a76f413 | ||
|
|
1f05cc420c | ||
|
|
eeaf1e1682 | ||
|
|
1905d3644e | ||
|
|
39197ddd71 | ||
|
|
8b8198e298 | ||
|
|
b57ffac9bc | ||
|
|
1dc35e6135 | ||
|
|
5aec3c1ecc | ||
|
|
3603d31add | ||
|
|
be326dae5f | ||
|
|
ce3328fbf6 | ||
|
|
9724e8779a | ||
|
|
f33bc4f167 | ||
|
|
d84588650f | ||
|
|
02747a975a | ||
|
|
5d78f7428b | ||
|
|
d5544d3041 | ||
|
|
d02e06cb9a | ||
|
|
988bcd6387 | ||
|
|
56294bbffc | ||
|
|
3a8f9ea2e0 | ||
|
|
6d9a7e2385 | ||
|
|
dd24c8b073 | ||
|
|
4e12942f5f | ||
|
|
a81858ee9f | ||
|
|
3b211b8644 | ||
|
|
0732e8360f | ||
|
|
c53cb8ace0 | ||
|
|
a58fe1f997 | ||
|
|
cb1a66381f | ||
|
|
535038bce1 | ||
|
|
e651244601 | ||
|
|
b63408cc68 | ||
|
|
bb3a6ff4f3 | ||
|
|
ce0b8af4a0 | ||
|
|
1bc3e5d6eb | ||
|
|
08c2d3b0d8 | ||
|
|
4fda48f7e7 | ||
|
|
dd08ca770d | ||
|
|
c7e87c95da | ||
|
|
79e80e8b6d | ||
|
|
689841cd2d | ||
|
|
0cc21f40af | ||
|
|
e4da4929e4 | ||
|
|
8a846a774f | ||
|
|
51aa0f4e43 | ||
|
|
4e9d1c8281 | ||
|
|
5e790e5d07 | ||
|
|
931a4bcc00 | ||
|
|
d6ae50f4dd | ||
|
|
ef004ce92e | ||
|
|
df6741cf1a | ||
|
|
f083fe568e | ||
|
|
a8e808a510 | ||
|
|
27972aff64 | ||
|
|
0468d9abf5 | ||
|
|
bebb5e5909 | ||
|
|
71c4f8f32f | ||
|
|
1a8ef4f1be | ||
|
|
6be8af6d63 | ||
|
|
68ca5c4901 | ||
|
|
79e1fff45e | ||
|
|
eb142244e4 | ||
|
|
baf7f84343 | ||
|
|
0fc8bb4ea0 | ||
|
|
25856496d8 | ||
|
|
ebf7c97bc6 | ||
|
|
9bfa70d5c1 | ||
|
|
80beb9d54b | ||
|
|
aff25e307d | ||
|
|
ce6896b584 | ||
|
|
9b1a427369 | ||
|
|
78f9b10255 | ||
|
|
061ab99486 | ||
|
|
ef96c06328 | ||
|
|
8f5291332f | ||
|
|
747195fc10 | ||
|
|
0e8bbec3bc | ||
|
|
141b9a7b4c | ||
|
|
595f0c514e | ||
|
|
e1dfe758cd | ||
|
|
6eaa9dad90 | ||
|
|
be9d912489 | ||
|
|
d7e65ff04b | ||
|
|
ff70a11cad | ||
|
|
e201c0ea66 | ||
|
|
1c093caff3 | ||
|
|
48484e1dbb | ||
|
|
068c51157e | ||
|
|
e8e1be644b | ||
|
|
d971831ab8 | ||
|
|
a432bbb5c6 | ||
|
|
95a0cebcf8 | ||
|
|
d22158404d | ||
|
|
4770f3e393 | ||
|
|
d287902f62 | ||
|
|
f74fff9b51 | ||
|
|
bdefc0b8fa | ||
|
|
afa213f8d5 | ||
|
|
7af4e9465c | ||
|
|
6e1b02ebd5 | ||
|
|
93d5398f10 | ||
|
|
baae5655d4 | ||
|
|
b1862e2f02 | ||
|
|
3e7ad6c06c | ||
|
|
768fb69653 | ||
|
|
21183ca801 | ||
|
|
13b3aca95f | ||
|
|
a21766b944 | ||
|
|
6f701adb9e | ||
|
|
e4c6bf5aa6 | ||
|
|
a1edfcc71a | ||
|
|
e2a8d66e48 | ||
|
|
6cf3bd6160 | ||
|
|
84c8ec26b6 | ||
|
|
d27c1b89ad | ||
|
|
f87cbe9e54 | ||
|
|
2a96af3503 | ||
|
|
1e5e0508e4 | ||
|
|
1baba9ee6d | ||
|
|
724872eb43 | ||
|
|
69fde570ce | ||
|
|
9495b9f3a3 | ||
|
|
cdca702738 | ||
|
|
f5786ef93d | ||
|
|
1c27f0df4c | ||
|
|
3f9973f8b8 | ||
|
|
be07d04f67 | ||
|
|
c950cc231c | ||
|
|
8dc45484b0 | ||
|
|
35815fe78a | ||
|
|
b5f8d06e5b | ||
|
|
a9d6fa631c | ||
|
|
878e7be9fa | ||
|
|
4cf4192ebb | ||
|
|
5325d7f6ee | ||
|
|
f54430ccf6 | ||
|
|
71ae636410 | ||
|
|
3732d3255f | ||
|
|
56a9984626 | ||
|
|
29d64c69eb | ||
|
|
63a15fc1de | ||
|
|
d2f3a937ec | ||
|
|
8c15fe34ee | ||
|
|
57793ed382 | ||
|
|
fea9b01922 | ||
|
|
a33e4de467 | ||
|
|
5a1d77dd87 | ||
|
|
ea05871b19 | ||
|
|
229c87f920 | ||
|
|
dd8feaa963 | ||
|
|
8507511776 | ||
|
|
1e8d2975f0 | ||
|
|
1fb76a2167 | ||
|
|
34f8bb226f | ||
|
|
bc3fb0f8a0 | ||
|
|
9416b79b38 | ||
|
|
20171e99a6 | ||
|
|
822ef33da8 | ||
|
|
3bfb34a6ea | ||
|
|
c28828fcdd | ||
|
|
889a370f90 | ||
|
|
a369127850 | ||
|
|
82a3574222 | ||
|
|
f3fc3d3ba4 | ||
|
|
a5a139aff6 | ||
|
|
09da203962 | ||
|
|
77ad6a529d | ||
|
|
54658bdd38 | ||
|
|
809897342a | ||
|
|
70767de3fc | ||
|
|
d62c1ff106 | ||
|
|
bf583e3061 | ||
|
|
270a46982d | ||
|
|
659315c519 | ||
|
|
04db3f975e | ||
|
|
c0e18458aa | ||
|
|
d09316a34a | ||
|
|
8c0ebcb871 | ||
|
|
fcdf1ea16b | ||
|
|
d6261e4d80 | ||
|
|
9f5c4e7347 | ||
|
|
90e58266a9 | ||
|
|
5b5f0ac41e | ||
|
|
ddca028eb2 | ||
|
|
fea7d0dc85 | ||
|
|
1f67899a5c | ||
|
|
2945049288 | ||
|
|
070a76aade | ||
|
|
2c100c7150 | ||
|
|
19b23ea212 | ||
|
|
e5edb90bfd | ||
|
|
2ec611964f | ||
|
|
c007bca797 | ||
|
|
767796662e | ||
|
|
7b321abb30 |
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Root Type="DevExpress.CodeRush.Foundation.CodePlaces.Options.FavoritesListContainer">
|
||||||
|
<Options Language="Neutral">
|
||||||
|
<Groups />
|
||||||
|
</Options>
|
||||||
|
</Root>
|
||||||
+129
-22
@@ -1,13 +1,20 @@
|
|||||||
|
# Generated build outputs for all projects, including Debug/Release archives.
|
||||||
|
[Bb]in/
|
||||||
|
[Oo]bj/
|
||||||
|
|
||||||
|
# Generated test results and hardware diagnostic captures.
|
||||||
|
[Tt]est[Rr]esults/
|
||||||
|
|
||||||
|
AppDiagnostic/bin/
|
||||||
|
AppDiagnostic/obj/
|
||||||
Common/bin/
|
Common/bin/
|
||||||
Common/obj/
|
Common/obj/
|
||||||
Config/bin/
|
Config/bin/
|
||||||
Config/obj/
|
Config/obj/
|
||||||
|
DataMatrix4Net/bin/
|
||||||
|
DataMatrix4Net/obj/
|
||||||
DataStreamInterface/bin/
|
DataStreamInterface/bin/
|
||||||
DataStreamInterface/obj/
|
DataStreamInterface/obj/
|
||||||
DataStreamInterfaceTest/bin/
|
|
||||||
DataStreamInterfaceTest/obj/
|
|
||||||
DataStreamMeter/bin/
|
|
||||||
DataStreamMeter/obj/
|
|
||||||
Decrypt/bin/
|
Decrypt/bin/
|
||||||
Decrypt/obj/
|
Decrypt/obj/
|
||||||
DeviceTest/bin/
|
DeviceTest/bin/
|
||||||
@@ -18,42 +25,142 @@ Encrypt/bin/
|
|||||||
Encrypt/obj/
|
Encrypt/obj/
|
||||||
EventViewer/bin/
|
EventViewer/bin/
|
||||||
EventViewer/obj/
|
EventViewer/obj/
|
||||||
Events/bin/
|
|
||||||
Events/obj/
|
|
||||||
FeatureVectorCalculator/bin/
|
FeatureVectorCalculator/bin/
|
||||||
FeatureVectorCalculator/obj/
|
FeatureVectorCalculator/obj/
|
||||||
GemCard/bin
|
GemCard/bin/
|
||||||
GemCard/obj
|
GemCard/obj/
|
||||||
GenCode128/bin
|
GenCode128/bin/
|
||||||
GenCode128/obj
|
GenCode128/obj/
|
||||||
GraphLib/bin
|
GenericTest/bin/
|
||||||
GraphLib/obj
|
GenericTest/obj/
|
||||||
MergeResultsDBs/bin
|
GraphLib/bin/
|
||||||
MergeResultsDBs/obj
|
GraphLib/obj/
|
||||||
TracingDB/bin
|
LabelPrinting/bin/
|
||||||
TracingDB/obj
|
LabelPrinting/obj/
|
||||||
ResetBatchNr/bin
|
MergeResultsDBs/bin/
|
||||||
ResetBatchNr/obj
|
MergeResultsDBs/obj/
|
||||||
RestClient/bin
|
NfcC7_Dll/bin/
|
||||||
RestClient/obj
|
NfcC7_Dll/obj/
|
||||||
|
NfcC7_DLL.Tests/bin/
|
||||||
|
NfcC7_DLL.Tests/obj/
|
||||||
|
OrderManagement/bin/
|
||||||
|
OrderManagement/obj/
|
||||||
|
ProductionTracing/bin/
|
||||||
|
ProductionTracing/obj/
|
||||||
|
RecordProcessing/bin/
|
||||||
|
RecordProcessing/obj/
|
||||||
|
ResetBatchNr/bin/
|
||||||
|
ResetBatchNr/obj/
|
||||||
|
RestClient/bin/
|
||||||
|
RestClient/obj/
|
||||||
Results/bin/
|
Results/bin/
|
||||||
Results/obj/
|
Results/obj/
|
||||||
ResultsBrowser/bin/
|
ResultsBrowser/bin/
|
||||||
ResultsBrowser/obj/
|
ResultsBrowser/obj/
|
||||||
ResultsParser/bin/
|
ResultsParser/bin/
|
||||||
ResultsParser/obj/
|
ResultsParser/obj/
|
||||||
|
S640TestApp/bin/
|
||||||
|
S640TestApp/obj/
|
||||||
|
SharedComponents/bin/
|
||||||
|
SharedComponents/obj/
|
||||||
|
SharedDatabase/bin/
|
||||||
|
SharedDatabase/obj/
|
||||||
|
SchematicDrawing/bin/
|
||||||
|
SchematicDrawing/obj/
|
||||||
Statistics/bin/
|
Statistics/bin/
|
||||||
Statistics/obj/
|
Statistics/obj/
|
||||||
TBF/bin/
|
TBF/bin/
|
||||||
TBF/obj/
|
TBF/obj/
|
||||||
|
TBFTests/bin/
|
||||||
|
TBFTests/obj/
|
||||||
ToFirstMonitor/bin/
|
ToFirstMonitor/bin/
|
||||||
ToFirstMonitor/obj/
|
ToFirstMonitor/obj/
|
||||||
ToSecondMonitor/bin/
|
ToSecondMonitor/bin/
|
||||||
ToSecondMonitor/obj/
|
ToSecondMonitor/obj/
|
||||||
Users/bin/
|
|
||||||
Users/obj/
|
|
||||||
UserManagement/bin/
|
UserManagement/bin/
|
||||||
UserManagement/obj/
|
UserManagement/obj/
|
||||||
|
WorkflowConfigurator/bin/
|
||||||
|
WorkflowConfigurator/obj/
|
||||||
|
Workplace/bin/
|
||||||
|
Workplace/obj/
|
||||||
|
DataStreamInterfaceTest/bin/
|
||||||
|
DataStreamInterfaceTest/obj/
|
||||||
|
DataStreamMeter/bin/
|
||||||
|
DataStreamMeter/obj/
|
||||||
|
Events/bin/
|
||||||
|
Events/obj/
|
||||||
|
TracingDB/bin/
|
||||||
|
TracingDB/obj/
|
||||||
|
Users/bin/
|
||||||
|
Users/obj/
|
||||||
.vs/
|
.vs/
|
||||||
|
.idea/
|
||||||
*.suo
|
*.suo
|
||||||
*.bak
|
*.bak
|
||||||
|
TBF.sln.DotSettings.user
|
||||||
|
/ExternalProjects
|
||||||
|
/GenesisCordonelTester
|
||||||
|
/packages/*
|
||||||
|
!/packages/Common/
|
||||||
|
/GenesisCordonelInterface/bin/Debug/GenesisCordonelInterfaceLogger.log
|
||||||
|
/GenesisCordonelInterface/bin/Debug/GenesisCordonelTesterLogger.log
|
||||||
|
/GenesisCordonelInterface/bin/Debug/SirtConfig.json
|
||||||
|
/GenesisCordonelInterface/bin/Release
|
||||||
|
/GenesisCordonelInterface/obj/Debug
|
||||||
|
/GenesisCordonelInterface/obj/Release
|
||||||
|
/ExternalProjects
|
||||||
|
/AppDiagnostic.Logging/bin/Debug/net472/AppDiagnostic.Logging.dll
|
||||||
|
/AppDiagnostic.Logging/bin/Debug/net472/AppDiagnostic.Logging.pdb
|
||||||
|
/AppDiagnostic.Logging/obj/Debug/net472/AppDiagnostic.Logging.AssemblyInfo.cs
|
||||||
|
/AppDiagnostic.Logging/obj/Debug/net472/AppDiagnostic.Logging.AssemblyInfoInputs.cache
|
||||||
|
/AppDiagnostic.Logging/obj/Debug/net472/AppDiagnostic.Logging.csproj.AssemblyReference.cache
|
||||||
|
/AppDiagnostic.Logging/obj/Debug/net472/AppDiagnostic.Logging.dll
|
||||||
|
/AppDiagnostic.Logging/obj/Debug/net472/AppDiagnostic.Logging.pdb
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Metrology.Measurements.dll
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Metrology.Measurements.pdb
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Ui.CordonelPreadjustmentUi.dll
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Ui.CordonelPreadjustmentUi.pdb
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Ui.GenesisToolBox.exe
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Ui.GenesisToolBox.pdb
|
||||||
|
/GenesisCordonelInterface/bin/Debug/XylemCommonUiLegacyGenCtl.dll
|
||||||
|
/GenesisCordonelInterface/bin/Debug/XylemCommonUiLegacyGenCtl.pdb
|
||||||
|
/GenesisCordonelInterface/bin/Debug/de/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.resources.dll
|
||||||
|
/GenesisCordonelInterface/bin/Debug/GenesisCordonelInterface.exe
|
||||||
|
/GenesisCordonelInterface/bin/Debug/GenesisCordonelInterface.pdb
|
||||||
|
/GenesisCordonelInterface/bin/Debug/TempFlansh.exe
|
||||||
|
/GenesisCordonelInterface/bin/Debug/TempFlansh.pdb
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Hardware.Interfaces.Protocols.ProtocolCore.dll
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Hardware.Interfaces.Protocols.ProtocolCore.pdb
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Hardware.Interfaces.Protocols.TransmitProtocol.dll
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Hardware.Interfaces.Protocols.TransmitProtocol.pdb
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Hardware.WaterMeter.eRegister.eRegisterCore.dll
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Hardware.WaterMeter.eRegister.eRegisterCore.pdb
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.dll
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.pdb
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.dll
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.pdb
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.dll
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.pdb
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisPwd.dll
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Hardware.WaterMeter.Genesis.GenesisPwd.pdb
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.dll
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.pdb
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.dll
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.pdb
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Hardware.WaterMeter.MagFlux.MagFluxConfig.dll
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Hardware.WaterMeter.MagFlux.MagFluxConfig.pdb
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Hardware.WaterMeter.MagFlux.MagFluxCore.dll
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Hardware.WaterMeter.MagFlux.MagFluxCore.pdb
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Logic.RelatePcb.dll
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Logic.RelatePcb.pdb
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Logic.ServiceCore.dll
|
||||||
|
/GenesisCordonelInterface/bin/Debug/Xylem.Common.Logic.ServiceCore.pdb
|
||||||
|
/GenesisCordonelInterface/RuntimePackage/Package
|
||||||
|
/SharedComponents/obj/SharedComponents.csproj.nuget.g.props
|
||||||
|
/AppDiagnostic.Logging/obj/Release/net472/AppDiagnostic.Logging.AssemblyInfo.cs
|
||||||
|
/AppDiagnostic.Logging/obj/Release/net472/AppDiagnostic.Logging.AssemblyInfoInputs.cache
|
||||||
|
/AppDiagnostic.Logging/obj/Release/net472/AppDiagnostic.Logging.csproj.AssemblyReference.cache
|
||||||
|
/AppDiagnostic.Logging/obj/Release/net472/AppDiagnostic.Logging.dll
|
||||||
|
/AppDiagnostic.Logging/obj/Release/net472/AppDiagnostic.Logging.pdb
|
||||||
|
/AppDiagnostic.Logging/bin/Release/net472/AppDiagnostic.Logging.dll
|
||||||
|
/AppDiagnostic.Logging/bin/Release/net472/AppDiagnostic.Logging.pdb
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net472</TargetFramework>
|
||||||
|
<LangVersion>7.3</LangVersion>
|
||||||
|
<RootNamespace>AppDiagnostic.Logging</RootNamespace>
|
||||||
|
<AssemblyName>AppDiagnostic.Logging</AssemblyName>
|
||||||
|
<GenerateAssemblyInfo>true</GenerateAssemblyInfo>
|
||||||
|
<ProjectGuid>{A7AF8ED2-362E-4DBB-B607-EBA2820719EC}</ProjectGuid>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="NLog" Version="5.2.2" />
|
||||||
|
<Reference Include="System.Runtime.Serialization" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
using NLog;
|
||||||
|
using NLog.Config;
|
||||||
|
using NLog.Layouts;
|
||||||
|
|
||||||
|
namespace AppDiagnostic.Logging
|
||||||
|
{
|
||||||
|
public static class AppDiagnosticConnector
|
||||||
|
{
|
||||||
|
private static readonly object syncRoot = new object();
|
||||||
|
|
||||||
|
public static void Register()
|
||||||
|
{
|
||||||
|
lock (syncRoot)
|
||||||
|
{
|
||||||
|
LoggingConfiguration configuration = LogManager.Configuration ?? new LoggingConfiguration();
|
||||||
|
NLog.Targets.Target existingTarget = configuration.FindTargetByName("appDiagnostic");
|
||||||
|
|
||||||
|
if (existingTarget != null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var target = new AppDiagnosticTarget
|
||||||
|
{
|
||||||
|
Name = "appDiagnostic",
|
||||||
|
PipeName = DiagnosticProtocol.DefaultPipeName,
|
||||||
|
QueueLimit = DiagnosticProtocol.DefaultQueueLimit,
|
||||||
|
ReconnectDelayMilliseconds = DiagnosticProtocol.DefaultReconnectDelayMilliseconds,
|
||||||
|
ConnectTimeoutMilliseconds = DiagnosticProtocol.DefaultConnectTimeoutMilliseconds,
|
||||||
|
Layout = new SimpleLayout("${message}")
|
||||||
|
};
|
||||||
|
|
||||||
|
configuration.AddTarget(target.Name, target);
|
||||||
|
configuration.AddRule(LogLevel.Trace, LogLevel.Fatal, target, "*");
|
||||||
|
|
||||||
|
LogManager.Configuration = configuration;
|
||||||
|
LogManager.ReconfigExistingLoggers();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,233 @@
|
|||||||
|
using NLog;
|
||||||
|
using NLog.Targets;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Concurrent;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.IO;
|
||||||
|
using System.IO.Pipes;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace AppDiagnostic.Logging
|
||||||
|
{
|
||||||
|
[Target("AppDiagnostic")]
|
||||||
|
public sealed class AppDiagnosticTarget : TargetWithLayout
|
||||||
|
{
|
||||||
|
private readonly object connectionLock = new object();
|
||||||
|
private readonly string applicationName;
|
||||||
|
private readonly int processId;
|
||||||
|
|
||||||
|
private BlockingCollection<DiagnosticLogEntry> queue;
|
||||||
|
private CancellationTokenSource cancellation;
|
||||||
|
private Task senderTask;
|
||||||
|
private NamedPipeClientStream pipeClient;
|
||||||
|
|
||||||
|
public AppDiagnosticTarget()
|
||||||
|
{
|
||||||
|
using (Process process = Process.GetCurrentProcess())
|
||||||
|
{
|
||||||
|
applicationName = process.ProcessName;
|
||||||
|
processId = process.Id;
|
||||||
|
}
|
||||||
|
|
||||||
|
PipeName = DiagnosticProtocol.DefaultPipeName;
|
||||||
|
QueueLimit = DiagnosticProtocol.DefaultQueueLimit;
|
||||||
|
ReconnectDelayMilliseconds =
|
||||||
|
DiagnosticProtocol.DefaultReconnectDelayMilliseconds;
|
||||||
|
ConnectTimeoutMilliseconds =
|
||||||
|
DiagnosticProtocol.DefaultConnectTimeoutMilliseconds;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string PipeName { get; set; }
|
||||||
|
|
||||||
|
public int QueueLimit { get; set; }
|
||||||
|
|
||||||
|
public int ReconnectDelayMilliseconds { get; set; }
|
||||||
|
|
||||||
|
public int ConnectTimeoutMilliseconds { get; set; }
|
||||||
|
|
||||||
|
protected override void InitializeTarget()
|
||||||
|
{
|
||||||
|
base.InitializeTarget();
|
||||||
|
|
||||||
|
int queueLimit = QueueLimit > 0
|
||||||
|
? QueueLimit
|
||||||
|
: DiagnosticProtocol.DefaultQueueLimit;
|
||||||
|
|
||||||
|
queue = new BlockingCollection<DiagnosticLogEntry>(queueLimit);
|
||||||
|
cancellation = new CancellationTokenSource();
|
||||||
|
|
||||||
|
senderTask = Task.Factory.StartNew(
|
||||||
|
ProcessQueue,
|
||||||
|
cancellation.Token,
|
||||||
|
TaskCreationOptions.LongRunning,
|
||||||
|
TaskScheduler.Default);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Write(LogEventInfo logEvent)
|
||||||
|
{
|
||||||
|
if (logEvent == null || queue == null || queue.IsAddingCompleted)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var entry = new DiagnosticLogEntry
|
||||||
|
{
|
||||||
|
TimestampUtc = logEvent.TimeStamp.ToUniversalTime(),
|
||||||
|
MachineName = Environment.MachineName,
|
||||||
|
ApplicationName = applicationName,
|
||||||
|
ProcessId = processId,
|
||||||
|
LoggerName = logEvent.LoggerName ?? string.Empty,
|
||||||
|
Level = logEvent.Level?.Name ?? string.Empty,
|
||||||
|
Message = Layout != null
|
||||||
|
? Layout.Render(logEvent)
|
||||||
|
: logEvent.FormattedMessage,
|
||||||
|
Exception = logEvent.Exception?.ToString() ?? string.Empty
|
||||||
|
};
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
queue.TryAdd(entry);
|
||||||
|
}
|
||||||
|
catch (ObjectDisposedException)
|
||||||
|
{
|
||||||
|
// A concurrent NLog shutdown may dispose the queue.
|
||||||
|
}
|
||||||
|
catch (InvalidOperationException)
|
||||||
|
{
|
||||||
|
// A concurrent NLog shutdown may complete the queue.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void CloseTarget()
|
||||||
|
{
|
||||||
|
BlockingCollection<DiagnosticLogEntry> currentQueue = queue;
|
||||||
|
CancellationTokenSource currentCancellation = cancellation;
|
||||||
|
|
||||||
|
if (currentQueue != null)
|
||||||
|
{
|
||||||
|
currentQueue.CompleteAdding();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentCancellation != null)
|
||||||
|
{
|
||||||
|
currentCancellation.Cancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
CloseConnection();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
senderTask?.Wait(2000);
|
||||||
|
}
|
||||||
|
catch (AggregateException)
|
||||||
|
{
|
||||||
|
// Cancellation during application shutdown is expected.
|
||||||
|
}
|
||||||
|
|
||||||
|
currentQueue?.Dispose();
|
||||||
|
currentCancellation?.Dispose();
|
||||||
|
|
||||||
|
queue = null;
|
||||||
|
cancellation = null;
|
||||||
|
senderTask = null;
|
||||||
|
|
||||||
|
base.CloseTarget();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ProcessQueue()
|
||||||
|
{
|
||||||
|
CancellationToken token = cancellation.Token;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
foreach (DiagnosticLogEntry entry in
|
||||||
|
queue.GetConsumingEnumerable(token))
|
||||||
|
{
|
||||||
|
SendWhenConnected(entry, token);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (OperationCanceledException)
|
||||||
|
{
|
||||||
|
// Target shutdown is expected to cancel the sender.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SendWhenConnected(
|
||||||
|
DiagnosticLogEntry entry,
|
||||||
|
CancellationToken token)
|
||||||
|
{
|
||||||
|
while (!token.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
EnsureConnected();
|
||||||
|
DiagnosticMessageSerializer.WriteFramed(pipeClient, entry);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
catch (Exception exception) when (
|
||||||
|
exception is IOException ||
|
||||||
|
exception is TimeoutException ||
|
||||||
|
exception is InvalidOperationException)
|
||||||
|
{
|
||||||
|
CloseConnection();
|
||||||
|
|
||||||
|
int delay = ReconnectDelayMilliseconds > 0
|
||||||
|
? ReconnectDelayMilliseconds
|
||||||
|
: DiagnosticProtocol.DefaultReconnectDelayMilliseconds;
|
||||||
|
|
||||||
|
if (token.WaitHandle.WaitOne(delay))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void EnsureConnected()
|
||||||
|
{
|
||||||
|
lock (connectionLock)
|
||||||
|
{
|
||||||
|
if (pipeClient != null && pipeClient.IsConnected)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
CloseConnectionWithoutLock();
|
||||||
|
|
||||||
|
pipeClient = new NamedPipeClientStream(
|
||||||
|
".",
|
||||||
|
string.IsNullOrWhiteSpace(PipeName)
|
||||||
|
? DiagnosticProtocol.DefaultPipeName
|
||||||
|
: PipeName,
|
||||||
|
PipeDirection.Out,
|
||||||
|
PipeOptions.Asynchronous);
|
||||||
|
|
||||||
|
int timeout = ConnectTimeoutMilliseconds > 0
|
||||||
|
? ConnectTimeoutMilliseconds
|
||||||
|
: DiagnosticProtocol.DefaultConnectTimeoutMilliseconds;
|
||||||
|
|
||||||
|
pipeClient.Connect(timeout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CloseConnection()
|
||||||
|
{
|
||||||
|
lock (connectionLock)
|
||||||
|
{
|
||||||
|
CloseConnectionWithoutLock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CloseConnectionWithoutLock()
|
||||||
|
{
|
||||||
|
if (pipeClient == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pipeClient.Dispose();
|
||||||
|
pipeClient = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
using System;
|
||||||
|
using System.Runtime.Serialization;
|
||||||
|
|
||||||
|
namespace AppDiagnostic.Logging
|
||||||
|
{
|
||||||
|
[DataContract]
|
||||||
|
public sealed class DiagnosticLogEntry
|
||||||
|
{
|
||||||
|
[DataMember(Order = 1)]
|
||||||
|
public DateTime TimestampUtc { get; set; }
|
||||||
|
|
||||||
|
[DataMember(Order = 2)]
|
||||||
|
public string MachineName { get; set; }
|
||||||
|
|
||||||
|
[DataMember(Order = 3)]
|
||||||
|
public string ApplicationName { get; set; }
|
||||||
|
|
||||||
|
[DataMember(Order = 4)]
|
||||||
|
public int ProcessId { get; set; }
|
||||||
|
|
||||||
|
[DataMember(Order = 5)]
|
||||||
|
public string LoggerName { get; set; }
|
||||||
|
|
||||||
|
[DataMember(Order = 6)]
|
||||||
|
public string Level { get; set; }
|
||||||
|
|
||||||
|
[DataMember(Order = 7)]
|
||||||
|
public string Message { get; set; }
|
||||||
|
|
||||||
|
[DataMember(Order = 8)]
|
||||||
|
public string Exception { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,113 @@
|
|||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Runtime.Serialization.Json;
|
||||||
|
|
||||||
|
namespace AppDiagnostic.Logging
|
||||||
|
{
|
||||||
|
public static class DiagnosticMessageSerializer
|
||||||
|
{
|
||||||
|
private static readonly DataContractJsonSerializer Serializer =
|
||||||
|
new DataContractJsonSerializer(typeof(DiagnosticLogEntry));
|
||||||
|
|
||||||
|
private static readonly object SerializerLock = new object();
|
||||||
|
|
||||||
|
public static byte[] Serialize(DiagnosticLogEntry entry)
|
||||||
|
{
|
||||||
|
if (entry == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(entry));
|
||||||
|
}
|
||||||
|
|
||||||
|
using (var stream = new MemoryStream())
|
||||||
|
{
|
||||||
|
lock (SerializerLock)
|
||||||
|
{
|
||||||
|
Serializer.WriteObject(stream, entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
return stream.ToArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static DiagnosticLogEntry Deserialize(byte[] payload)
|
||||||
|
{
|
||||||
|
if (payload == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(payload));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (payload.Length == 0 ||
|
||||||
|
payload.Length > DiagnosticProtocol.MaximumMessageSize)
|
||||||
|
{
|
||||||
|
throw new InvalidDataException("Invalid diagnostic message size.");
|
||||||
|
}
|
||||||
|
|
||||||
|
using (var stream = new MemoryStream(payload, false))
|
||||||
|
{
|
||||||
|
lock (SerializerLock)
|
||||||
|
{
|
||||||
|
return (DiagnosticLogEntry)Serializer.ReadObject(stream);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void WriteFramed(Stream stream, DiagnosticLogEntry entry)
|
||||||
|
{
|
||||||
|
if (stream == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(stream));
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] payload = Serialize(entry);
|
||||||
|
|
||||||
|
if (payload.Length > DiagnosticProtocol.MaximumMessageSize)
|
||||||
|
{
|
||||||
|
throw new InvalidDataException("Diagnostic message is too large.");
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] length = BitConverter.GetBytes(payload.Length);
|
||||||
|
stream.Write(length, 0, length.Length);
|
||||||
|
stream.Write(payload, 0, payload.Length);
|
||||||
|
stream.Flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static DiagnosticLogEntry ReadFramed(Stream stream)
|
||||||
|
{
|
||||||
|
if (stream == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(stream));
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] lengthBuffer = ReadExactly(stream, sizeof(int));
|
||||||
|
int payloadLength = BitConverter.ToInt32(lengthBuffer, 0);
|
||||||
|
|
||||||
|
if (payloadLength <= 0 ||
|
||||||
|
payloadLength > DiagnosticProtocol.MaximumMessageSize)
|
||||||
|
{
|
||||||
|
throw new InvalidDataException("Invalid diagnostic message size.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return Deserialize(ReadExactly(stream, payloadLength));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static byte[] ReadExactly(Stream stream, int count)
|
||||||
|
{
|
||||||
|
byte[] buffer = new byte[count];
|
||||||
|
int offset = 0;
|
||||||
|
|
||||||
|
while (offset < count)
|
||||||
|
{
|
||||||
|
int bytesRead = stream.Read(buffer, offset, count - offset);
|
||||||
|
|
||||||
|
if (bytesRead == 0)
|
||||||
|
{
|
||||||
|
throw new EndOfStreamException();
|
||||||
|
}
|
||||||
|
|
||||||
|
offset += bytesRead;
|
||||||
|
}
|
||||||
|
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
namespace AppDiagnostic.Logging
|
||||||
|
{
|
||||||
|
public static class DiagnosticProtocol
|
||||||
|
{
|
||||||
|
public const string DefaultPipeName = "Sensus.AppDiagnostic.LogPipe";
|
||||||
|
public const int MaximumMessageSize = 1024 * 1024;
|
||||||
|
public const int DefaultQueueLimit = 10000;
|
||||||
|
public const int DefaultReconnectDelayMilliseconds = 500;
|
||||||
|
public const int DefaultConnectTimeoutMilliseconds = 250;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
# AppDiagnostic.Logging
|
||||||
|
|
||||||
|
Reusable NLog target for sending structured diagnostic events from multiple
|
||||||
|
.NET Framework processes to `AppDiagnostic.exe` through a local named pipe.
|
||||||
|
|
||||||
|
## Producer integration
|
||||||
|
|
||||||
|
Reference this project from the producer application and add the extension and
|
||||||
|
target to its NLog configuration:
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<extensions>
|
||||||
|
<add assembly="AppDiagnostic.Logging" />
|
||||||
|
</extensions>
|
||||||
|
|
||||||
|
<targets>
|
||||||
|
<target name="appDiagnostic"
|
||||||
|
xsi:type="AppDiagnostic"
|
||||||
|
layout="${message}" />
|
||||||
|
</targets>
|
||||||
|
|
||||||
|
<rules>
|
||||||
|
<logger name="*" minlevel="Trace" writeTo="appDiagnostic" />
|
||||||
|
</rules>
|
||||||
|
```
|
||||||
|
|
||||||
|
The target writes to a bounded background queue. Producer threads are not
|
||||||
|
blocked while the diagnostic viewer is unavailable. Queued messages are sent
|
||||||
|
after the viewer becomes available; new messages are discarded when the queue
|
||||||
|
limit is reached.
|
||||||
|
|
||||||
|
The receiver can read messages with:
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
DiagnosticLogEntry entry =
|
||||||
|
DiagnosticMessageSerializer.ReadFramed(namedPipeServerStream);
|
||||||
|
```
|
||||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,65 @@
|
|||||||
|
{
|
||||||
|
"format": 1,
|
||||||
|
"restore": {
|
||||||
|
"C:\\Sensus_projects\\New\\LocalBranch_start_at_6.3.2026\\tbf-local\\tbf\\AppDiagnostic.Logging\\AppDiagnostic.Logging.csproj": {}
|
||||||
|
},
|
||||||
|
"projects": {
|
||||||
|
"C:\\Sensus_projects\\New\\LocalBranch_start_at_6.3.2026\\tbf-local\\tbf\\AppDiagnostic.Logging\\AppDiagnostic.Logging.csproj": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"restore": {
|
||||||
|
"projectUniqueName": "C:\\Sensus_projects\\New\\LocalBranch_start_at_6.3.2026\\tbf-local\\tbf\\AppDiagnostic.Logging\\AppDiagnostic.Logging.csproj",
|
||||||
|
"projectName": "AppDiagnostic.Logging",
|
||||||
|
"projectPath": "C:\\Sensus_projects\\New\\LocalBranch_start_at_6.3.2026\\tbf-local\\tbf\\AppDiagnostic.Logging\\AppDiagnostic.Logging.csproj",
|
||||||
|
"packagesPath": "C:\\Users\\MFRNIAK\\.nuget\\packages\\",
|
||||||
|
"outputPath": "C:\\Sensus_projects\\New\\LocalBranch_start_at_6.3.2026\\tbf-local\\tbf\\AppDiagnostic.Logging\\obj\\",
|
||||||
|
"projectStyle": "PackageReference",
|
||||||
|
"fallbackFolders": [
|
||||||
|
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
|
||||||
|
],
|
||||||
|
"configFilePaths": [
|
||||||
|
"C:\\Users\\MFRNIAK\\AppData\\Roaming\\NuGet\\NuGet.Config",
|
||||||
|
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
|
||||||
|
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
|
||||||
|
],
|
||||||
|
"originalTargetFrameworks": [
|
||||||
|
"net472"
|
||||||
|
],
|
||||||
|
"sources": {
|
||||||
|
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
|
||||||
|
"https://api.nuget.org/v3/index.json": {}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net472": {
|
||||||
|
"framework": "net472",
|
||||||
|
"targetAlias": "net472",
|
||||||
|
"projectReferences": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"warningProperties": {
|
||||||
|
"warnAsError": [
|
||||||
|
"NU1605"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"restoreAuditProperties": {
|
||||||
|
"enableAudit": "true",
|
||||||
|
"auditLevel": "low",
|
||||||
|
"auditMode": "direct"
|
||||||
|
},
|
||||||
|
"SdkAnalysisLevel": "10.0.300"
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net472": {
|
||||||
|
"framework": "net472",
|
||||||
|
"targetAlias": "net472",
|
||||||
|
"dependencies": {
|
||||||
|
"NLog": {
|
||||||
|
"target": "Package",
|
||||||
|
"version": "[5.2.2, )"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.303\\RuntimeIdentifierGraph.json"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||||
|
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||||
|
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
|
||||||
|
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
|
||||||
|
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
|
||||||
|
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
|
||||||
|
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\MFRNIAK\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages</NuGetPackageFolders>
|
||||||
|
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
|
||||||
|
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">7.0.0</NuGetToolVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||||
|
<SourceRoot Include="C:\Users\MFRNIAK\.nuget\packages\" />
|
||||||
|
<SourceRoot Include="C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages\" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||||
|
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
// <autogenerated />
|
||||||
|
using System;
|
||||||
|
using System.Reflection;
|
||||||
|
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
is_global = true
|
||||||
|
build_property.RootNamespace = AppDiagnostic.Logging
|
||||||
|
build_property.ProjectDir = C:\Sensus_projects\New\LocalBranch_start_at_6.3.2026\tbf-local\tbf\AppDiagnostic.Logging\
|
||||||
|
build_property.EnableComHosting =
|
||||||
|
build_property.EnableGeneratedComInterfaceComImportInterop =
|
||||||
|
build_property.CsWinRTUseWindowsUIXamlProjections = false
|
||||||
|
build_property.EffectiveAnalysisLevelStyle =
|
||||||
|
build_property.EnableCodeStyleSeverity =
|
||||||
Binary file not shown.
+1
@@ -0,0 +1 @@
|
|||||||
|
551ba94934db30a277a1a9cec2dacbe03f8393107e5d0b2436695f9bd62bd569
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
C:\Sensus_projects\New\LocalBranch_start_at_6.3.2026\tbf-local\tbf\AppDiagnostic.Logging\bin\Debug\net472\AppDiagnostic.Logging.dll
|
||||||
|
C:\Sensus_projects\New\LocalBranch_start_at_6.3.2026\tbf-local\tbf\AppDiagnostic.Logging\bin\Debug\net472\AppDiagnostic.Logging.pdb
|
||||||
|
C:\Sensus_projects\New\LocalBranch_start_at_6.3.2026\tbf-local\tbf\AppDiagnostic.Logging\bin\Debug\net472\NLog.dll
|
||||||
|
C:\Sensus_projects\New\LocalBranch_start_at_6.3.2026\tbf-local\tbf\AppDiagnostic.Logging\obj\Debug\net472\AppDiagnostic.Logging.csproj.AssemblyReference.cache
|
||||||
|
C:\Sensus_projects\New\LocalBranch_start_at_6.3.2026\tbf-local\tbf\AppDiagnostic.Logging\obj\Debug\net472\AppDiagnostic.Logging.GeneratedMSBuildEditorConfig.editorconfig
|
||||||
|
C:\Sensus_projects\New\LocalBranch_start_at_6.3.2026\tbf-local\tbf\AppDiagnostic.Logging\obj\Debug\net472\AppDiagnostic.Logging.AssemblyInfoInputs.cache
|
||||||
|
C:\Sensus_projects\New\LocalBranch_start_at_6.3.2026\tbf-local\tbf\AppDiagnostic.Logging\obj\Debug\net472\AppDiagnostic.Logging.AssemblyInfo.cs
|
||||||
|
C:\Sensus_projects\New\LocalBranch_start_at_6.3.2026\tbf-local\tbf\AppDiagnostic.Logging\obj\Debug\net472\AppDiagnostic.Logging.csproj.CoreCompileInputs.cache
|
||||||
|
C:\Sensus_projects\New\LocalBranch_start_at_6.3.2026\tbf-local\tbf\AppDiagnostic.Logging\obj\Debug\net472\AppDiagn.CFEA7AC0.Up2Date
|
||||||
|
C:\Sensus_projects\New\LocalBranch_start_at_6.3.2026\tbf-local\tbf\AppDiagnostic.Logging\obj\Debug\net472\AppDiagnostic.Logging.dll
|
||||||
|
C:\Sensus_projects\New\LocalBranch_start_at_6.3.2026\tbf-local\tbf\AppDiagnostic.Logging\obj\Debug\net472\AppDiagnostic.Logging.pdb
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
// <autogenerated />
|
||||||
|
using System;
|
||||||
|
using System.Reflection;
|
||||||
|
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
is_global = true
|
||||||
|
build_property.RootNamespace = AppDiagnostic.Logging
|
||||||
|
build_property.ProjectDir = C:\Sensus_projects\New\LocalBranch_start_at_6.3.2026\tbf-local\tbf\AppDiagnostic.Logging\
|
||||||
|
build_property.EnableComHosting =
|
||||||
|
build_property.EnableGeneratedComInterfaceComImportInterop =
|
||||||
|
build_property.CsWinRTUseWindowsUIXamlProjections = false
|
||||||
|
build_property.EffectiveAnalysisLevelStyle =
|
||||||
|
build_property.EnableCodeStyleSeverity =
|
||||||
Binary file not shown.
+1
@@ -0,0 +1 @@
|
|||||||
|
a53d59482cad49b656138b1af5cf3e55edf2108969aedc574c362be6c671436b
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
C:\Sensus_projects\New\LocalBranch_start_at_6.3.2026\tbf-local\tbf\AppDiagnostic.Logging\bin\Release\net472\AppDiagnostic.Logging.dll
|
||||||
|
C:\Sensus_projects\New\LocalBranch_start_at_6.3.2026\tbf-local\tbf\AppDiagnostic.Logging\bin\Release\net472\AppDiagnostic.Logging.pdb
|
||||||
|
C:\Sensus_projects\New\LocalBranch_start_at_6.3.2026\tbf-local\tbf\AppDiagnostic.Logging\bin\Release\net472\NLog.dll
|
||||||
|
C:\Sensus_projects\New\LocalBranch_start_at_6.3.2026\tbf-local\tbf\AppDiagnostic.Logging\obj\Release\net472\AppDiagnostic.Logging.csproj.AssemblyReference.cache
|
||||||
|
C:\Sensus_projects\New\LocalBranch_start_at_6.3.2026\tbf-local\tbf\AppDiagnostic.Logging\obj\Release\net472\AppDiagnostic.Logging.GeneratedMSBuildEditorConfig.editorconfig
|
||||||
|
C:\Sensus_projects\New\LocalBranch_start_at_6.3.2026\tbf-local\tbf\AppDiagnostic.Logging\obj\Release\net472\AppDiagnostic.Logging.AssemblyInfoInputs.cache
|
||||||
|
C:\Sensus_projects\New\LocalBranch_start_at_6.3.2026\tbf-local\tbf\AppDiagnostic.Logging\obj\Release\net472\AppDiagnostic.Logging.AssemblyInfo.cs
|
||||||
|
C:\Sensus_projects\New\LocalBranch_start_at_6.3.2026\tbf-local\tbf\AppDiagnostic.Logging\obj\Release\net472\AppDiagnostic.Logging.csproj.CoreCompileInputs.cache
|
||||||
|
C:\Sensus_projects\New\LocalBranch_start_at_6.3.2026\tbf-local\tbf\AppDiagnostic.Logging\obj\Release\net472\AppDiagn.CFEA7AC0.Up2Date
|
||||||
|
C:\Sensus_projects\New\LocalBranch_start_at_6.3.2026\tbf-local\tbf\AppDiagnostic.Logging\obj\Release\net472\AppDiagnostic.Logging.dll
|
||||||
|
C:\Sensus_projects\New\LocalBranch_start_at_6.3.2026\tbf-local\tbf\AppDiagnostic.Logging\obj\Release\net472\AppDiagnostic.Logging.pdb
|
||||||
@@ -0,0 +1,119 @@
|
|||||||
|
{
|
||||||
|
"version": 4,
|
||||||
|
"targets": {
|
||||||
|
"net472": {
|
||||||
|
"NLog/5.2.2": {
|
||||||
|
"type": "package",
|
||||||
|
"frameworkAssemblies": [
|
||||||
|
"System",
|
||||||
|
"System.Configuration",
|
||||||
|
"System.Core",
|
||||||
|
"System.IO.Compression",
|
||||||
|
"System.Xml"
|
||||||
|
],
|
||||||
|
"compile": {
|
||||||
|
"lib/net46/NLog.dll": {
|
||||||
|
"related": ".xml"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net46/NLog.dll": {
|
||||||
|
"related": ".xml"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"libraries": {
|
||||||
|
"NLog/5.2.2": {
|
||||||
|
"sha512": "r6Q9740g29gTwmTWlsgdIFm0mhNsfNZmbvWKX/Fxmi8X89ZrpUowHM2T2X1lP7RVpND+ef+XnfKL5g6Q1iNGXA==",
|
||||||
|
"type": "package",
|
||||||
|
"path": "nlog/5.2.2",
|
||||||
|
"files": [
|
||||||
|
".nupkg.metadata",
|
||||||
|
".signature.p7s",
|
||||||
|
"N.png",
|
||||||
|
"lib/net35/NLog.dll",
|
||||||
|
"lib/net35/NLog.xml",
|
||||||
|
"lib/net45/NLog.dll",
|
||||||
|
"lib/net45/NLog.xml",
|
||||||
|
"lib/net46/NLog.dll",
|
||||||
|
"lib/net46/NLog.xml",
|
||||||
|
"lib/netstandard1.3/NLog.dll",
|
||||||
|
"lib/netstandard1.3/NLog.xml",
|
||||||
|
"lib/netstandard1.5/NLog.dll",
|
||||||
|
"lib/netstandard1.5/NLog.xml",
|
||||||
|
"lib/netstandard2.0/NLog.dll",
|
||||||
|
"lib/netstandard2.0/NLog.xml",
|
||||||
|
"nlog.5.2.2.nupkg.sha512",
|
||||||
|
"nlog.nuspec"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"projectFileDependencyGroups": {
|
||||||
|
"net472": [
|
||||||
|
"NLog >= 5.2.2"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"packageFolders": {
|
||||||
|
"C:\\Users\\MFRNIAK\\.nuget\\packages\\": {},
|
||||||
|
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {}
|
||||||
|
},
|
||||||
|
"project": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"restore": {
|
||||||
|
"projectUniqueName": "C:\\Sensus_projects\\New\\LocalBranch_start_at_6.3.2026\\tbf-local\\tbf\\AppDiagnostic.Logging\\AppDiagnostic.Logging.csproj",
|
||||||
|
"projectName": "AppDiagnostic.Logging",
|
||||||
|
"projectPath": "C:\\Sensus_projects\\New\\LocalBranch_start_at_6.3.2026\\tbf-local\\tbf\\AppDiagnostic.Logging\\AppDiagnostic.Logging.csproj",
|
||||||
|
"packagesPath": "C:\\Users\\MFRNIAK\\.nuget\\packages\\",
|
||||||
|
"outputPath": "C:\\Sensus_projects\\New\\LocalBranch_start_at_6.3.2026\\tbf-local\\tbf\\AppDiagnostic.Logging\\obj\\",
|
||||||
|
"projectStyle": "PackageReference",
|
||||||
|
"fallbackFolders": [
|
||||||
|
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
|
||||||
|
],
|
||||||
|
"configFilePaths": [
|
||||||
|
"C:\\Users\\MFRNIAK\\AppData\\Roaming\\NuGet\\NuGet.Config",
|
||||||
|
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
|
||||||
|
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
|
||||||
|
],
|
||||||
|
"originalTargetFrameworks": [
|
||||||
|
"net472"
|
||||||
|
],
|
||||||
|
"sources": {
|
||||||
|
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
|
||||||
|
"https://api.nuget.org/v3/index.json": {}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net472": {
|
||||||
|
"framework": "net472",
|
||||||
|
"targetAlias": "net472",
|
||||||
|
"projectReferences": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"warningProperties": {
|
||||||
|
"warnAsError": [
|
||||||
|
"NU1605"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"restoreAuditProperties": {
|
||||||
|
"enableAudit": "true",
|
||||||
|
"auditLevel": "low",
|
||||||
|
"auditMode": "direct"
|
||||||
|
},
|
||||||
|
"SdkAnalysisLevel": "10.0.300"
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net472": {
|
||||||
|
"framework": "net472",
|
||||||
|
"targetAlias": "net472",
|
||||||
|
"dependencies": {
|
||||||
|
"NLog": {
|
||||||
|
"target": "Package",
|
||||||
|
"version": "[5.2.2, )"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.303\\RuntimeIdentifierGraph.json"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"version": 2,
|
||||||
|
"dgSpecHash": "ezwKOPZAAXU=",
|
||||||
|
"success": true,
|
||||||
|
"projectFilePath": "C:\\Sensus_projects\\New\\LocalBranch_start_at_6.3.2026\\tbf-local\\tbf\\AppDiagnostic.Logging\\AppDiagnostic.Logging.csproj",
|
||||||
|
"expectedPackageFiles": [
|
||||||
|
"C:\\Users\\MFRNIAK\\.nuget\\packages\\nlog\\5.2.2\\nlog.5.2.2.nupkg.sha512"
|
||||||
|
],
|
||||||
|
"logs": []
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<configuration>
|
||||||
|
<startup>
|
||||||
|
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
|
||||||
|
</startup>
|
||||||
|
<runtime>
|
||||||
|
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="NLog" publicKeyToken="5120e14c03d0593c" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
</assemblyBinding>
|
||||||
|
</runtime>
|
||||||
|
</configuration>
|
||||||
@@ -0,0 +1,104 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{FA9ABAD1-7184-4295-ADE8-D44F2E3DE6B2}</ProjectGuid>
|
||||||
|
<OutputType>WinExe</OutputType>
|
||||||
|
<RootNamespace>AppDiagnostic</RootNamespace>
|
||||||
|
<AssemblyName>AppDiagnostic</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||||
|
<Deterministic>true</Deterministic>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Configuration" />
|
||||||
|
<Reference Include="System.Core" />
|
||||||
|
<Reference Include="System.Web" />
|
||||||
|
<Reference Include="System.Xml.Linq" />
|
||||||
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
|
<Reference Include="Microsoft.CSharp" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Deployment" />
|
||||||
|
<Reference Include="System.Drawing" />
|
||||||
|
<Reference Include="System.Net.Http" />
|
||||||
|
<Reference Include="System.Windows.Forms" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="ColorRuleEditorForm.cs">
|
||||||
|
<SubType>Form</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="DiagnosticLogFormatter.cs" />
|
||||||
|
<Compile Include="DiagnosticLogStore.cs" />
|
||||||
|
<Compile Include="DiagnosticPipeServer.cs" />
|
||||||
|
<Compile Include="LogColorizer.cs" />
|
||||||
|
<Compile Include="LogColorRule.cs" />
|
||||||
|
<Compile Include="LogColorRuleRepository.cs" />
|
||||||
|
<Compile Include="MainForm.cs">
|
||||||
|
<SubType>Form</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="MainForm.Designer.cs">
|
||||||
|
<DependentUpon>MainForm.cs</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Program.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
<EmbeddedResource Include="MainForm.resx">
|
||||||
|
<DependentUpon>MainForm.cs</DependentUpon>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="Properties\Resources.resx">
|
||||||
|
<Generator>ResXFileCodeGenerator</Generator>
|
||||||
|
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<Compile Include="Properties\Resources.Designer.cs">
|
||||||
|
<AutoGen>True</AutoGen>
|
||||||
|
<DependentUpon>Resources.resx</DependentUpon>
|
||||||
|
<DesignTime>True</DesignTime>
|
||||||
|
</Compile>
|
||||||
|
<None Include="Properties\Settings.settings">
|
||||||
|
<Generator>SettingsSingleFileGenerator</Generator>
|
||||||
|
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
||||||
|
</None>
|
||||||
|
<Compile Include="Properties\Settings.Designer.cs">
|
||||||
|
<AutoGen>True</AutoGen>
|
||||||
|
<DependentUpon>Settings.settings</DependentUpon>
|
||||||
|
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||||
|
</Compile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="App.config" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\AppDiagnostic.Logging\AppDiagnostic.Logging.csproj">
|
||||||
|
<Project>{A7AF8ED2-362E-4DBB-B607-EBA2820719EC}</Project>
|
||||||
|
<Name>AppDiagnostic.Logging</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="Resources\TBF_icon.ico" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
public class BufferedListView : ListView
|
||||||
|
{
|
||||||
|
public BufferedListView()
|
||||||
|
{
|
||||||
|
// Zapne dvojité bufferovanie pre ListView
|
||||||
|
this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
|
||||||
|
this.UpdateStyles();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,319 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace AppDiagnostic
|
||||||
|
{
|
||||||
|
public sealed class ColorRuleEditorForm : Form
|
||||||
|
{
|
||||||
|
private readonly List<LogColorRule> rules;
|
||||||
|
private readonly ListBox ruleList = new ListBox();
|
||||||
|
private readonly TextBox patternTextBox = new TextBox();
|
||||||
|
private readonly CheckBox enabledCheckBox = new CheckBox();
|
||||||
|
private readonly CheckBox boldCheckBox = new CheckBox();
|
||||||
|
private readonly CheckBox backgroundCheckBox = new CheckBox();
|
||||||
|
private readonly Button foregroundButton = new Button();
|
||||||
|
private readonly Button backgroundButton = new Button();
|
||||||
|
private readonly RichTextBox previewBox = new RichTextBox();
|
||||||
|
private readonly Font previewBoldFont;
|
||||||
|
private bool loadingRule;
|
||||||
|
|
||||||
|
public ColorRuleEditorForm(IEnumerable<LogColorRule> sourceRules)
|
||||||
|
{
|
||||||
|
rules = sourceRules.Select(rule => rule.Clone()).ToList();
|
||||||
|
InitializeWindow();
|
||||||
|
previewBoldFont = new Font(previewBox.Font, FontStyle.Bold);
|
||||||
|
RefreshRuleList(0);
|
||||||
|
RefreshPreview();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<LogColorRule> Rules => rules.Select(rule => rule.Clone()).ToList();
|
||||||
|
|
||||||
|
protected override void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
if (disposing)
|
||||||
|
{
|
||||||
|
previewBoldFont.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void InitializeWindow()
|
||||||
|
{
|
||||||
|
Text = "Log color rules";
|
||||||
|
Icon = Properties.Resources.TBF_icon;
|
||||||
|
StartPosition = FormStartPosition.CenterParent;
|
||||||
|
MinimumSize = new Size(760, 500);
|
||||||
|
ClientSize = new Size(860, 560);
|
||||||
|
|
||||||
|
var root = new TableLayoutPanel { Dock = DockStyle.Fill, ColumnCount = 1, RowCount = 3, Padding = new Padding(10) };
|
||||||
|
root.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
|
||||||
|
root.RowStyles.Add(new RowStyle(SizeType.Absolute, 145F));
|
||||||
|
root.RowStyles.Add(new RowStyle(SizeType.Absolute, 42F));
|
||||||
|
|
||||||
|
var split = new SplitContainer { Dock = DockStyle.Fill, SplitterDistance = 280 };
|
||||||
|
split.Panel1.Padding = new Padding(0, 0, 8, 0);
|
||||||
|
split.Panel2.Padding = new Padding(8, 0, 0, 0);
|
||||||
|
|
||||||
|
ruleList.Dock = DockStyle.Fill;
|
||||||
|
ruleList.IntegralHeight = false;
|
||||||
|
ruleList.SelectedIndexChanged += RuleList_SelectedIndexChanged;
|
||||||
|
|
||||||
|
var listButtons = new FlowLayoutPanel { Dock = DockStyle.Bottom, Height = 36, FlowDirection = FlowDirection.LeftToRight };
|
||||||
|
listButtons.Controls.Add(CreateButton("Add", AddRule_Click));
|
||||||
|
listButtons.Controls.Add(CreateButton("Delete", DeleteRule_Click));
|
||||||
|
listButtons.Controls.Add(CreateButton("Up", MoveUp_Click));
|
||||||
|
listButtons.Controls.Add(CreateButton("Down", MoveDown_Click));
|
||||||
|
split.Panel1.Controls.Add(ruleList);
|
||||||
|
split.Panel1.Controls.Add(listButtons);
|
||||||
|
|
||||||
|
var editor = new TableLayoutPanel { Dock = DockStyle.Top, AutoSize = true, ColumnCount = 2, Padding = new Padding(4) };
|
||||||
|
editor.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 120F));
|
||||||
|
editor.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
|
||||||
|
|
||||||
|
enabledCheckBox.Text = "Rule enabled";
|
||||||
|
enabledCheckBox.AutoSize = true;
|
||||||
|
enabledCheckBox.CheckedChanged += EditorValueChanged;
|
||||||
|
AddEditorRow(editor, "State", enabledCheckBox);
|
||||||
|
|
||||||
|
patternTextBox.Dock = DockStyle.Fill;
|
||||||
|
patternTextBox.TextChanged += EditorValueChanged;
|
||||||
|
AddEditorRow(editor, "Substring", patternTextBox);
|
||||||
|
|
||||||
|
foregroundButton.Text = "Choose text color...";
|
||||||
|
foregroundButton.AutoSize = true;
|
||||||
|
foregroundButton.Click += ForegroundButton_Click;
|
||||||
|
AddEditorRow(editor, "Text color", foregroundButton);
|
||||||
|
|
||||||
|
var backgroundPanel = new FlowLayoutPanel { Dock = DockStyle.Fill, AutoSize = true };
|
||||||
|
backgroundCheckBox.Text = "Use background";
|
||||||
|
backgroundCheckBox.AutoSize = true;
|
||||||
|
backgroundCheckBox.CheckedChanged += EditorValueChanged;
|
||||||
|
backgroundButton.Text = "Choose...";
|
||||||
|
backgroundButton.AutoSize = true;
|
||||||
|
backgroundButton.Click += BackgroundButton_Click;
|
||||||
|
backgroundPanel.Controls.Add(backgroundCheckBox);
|
||||||
|
backgroundPanel.Controls.Add(backgroundButton);
|
||||||
|
AddEditorRow(editor, "Background", backgroundPanel);
|
||||||
|
|
||||||
|
boldCheckBox.Text = "Bold text";
|
||||||
|
boldCheckBox.AutoSize = true;
|
||||||
|
boldCheckBox.CheckedChanged += EditorValueChanged;
|
||||||
|
AddEditorRow(editor, "Font", boldCheckBox);
|
||||||
|
|
||||||
|
var resetButton = CreateButton("Restore default rules", RestoreDefaults_Click);
|
||||||
|
resetButton.AutoSize = true;
|
||||||
|
AddEditorRow(editor, string.Empty, resetButton);
|
||||||
|
split.Panel2.Controls.Add(editor);
|
||||||
|
|
||||||
|
previewBox.Dock = DockStyle.Fill;
|
||||||
|
previewBox.ReadOnly = true;
|
||||||
|
previewBox.WordWrap = true;
|
||||||
|
previewBox.Font = new Font("Consolas", 9F);
|
||||||
|
previewBox.Text = "2026-09-10 14:25:31.042|DEBUG|TBF[14280]|TBF.UI.MainWnd|Device configuration loaded.\n2026-09-10 14:25:31.384|INFO |TBF[14280]|TBF.Rig.StateMachine|Test bench started.\n2026-09-10 14:25:32.018|WARN |TBF[14280]|TBF.Device|Pressure is approaching the limit.\n2026-09-10 14:25:32.611|ERROR|TBF[14280]|TBF.Device|Communication failed.";
|
||||||
|
|
||||||
|
var previewGroup = new GroupBox { Text = "Live preview", Dock = DockStyle.Fill, Padding = new Padding(8) };
|
||||||
|
previewGroup.Controls.Add(previewBox);
|
||||||
|
|
||||||
|
var footer = new FlowLayoutPanel { Dock = DockStyle.Fill, FlowDirection = FlowDirection.RightToLeft, Padding = new Padding(0, 8, 0, 0) };
|
||||||
|
var okButton = new Button { Text = "OK", DialogResult = DialogResult.OK, AutoSize = true };
|
||||||
|
var cancelButton = new Button { Text = "Cancel", DialogResult = DialogResult.Cancel, AutoSize = true };
|
||||||
|
footer.Controls.Add(okButton);
|
||||||
|
footer.Controls.Add(cancelButton);
|
||||||
|
|
||||||
|
AcceptButton = okButton;
|
||||||
|
CancelButton = cancelButton;
|
||||||
|
root.Controls.Add(split, 0, 0);
|
||||||
|
root.Controls.Add(previewGroup, 0, 1);
|
||||||
|
root.Controls.Add(footer, 0, 2);
|
||||||
|
Controls.Add(root);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Button CreateButton(string text, EventHandler clickHandler)
|
||||||
|
{
|
||||||
|
var button = new Button { Text = text, AutoSize = true };
|
||||||
|
button.Click += clickHandler;
|
||||||
|
return button;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void AddEditorRow(TableLayoutPanel panel, string labelText, Control control)
|
||||||
|
{
|
||||||
|
int row = panel.RowCount++;
|
||||||
|
panel.RowStyles.Add(new RowStyle(SizeType.AutoSize));
|
||||||
|
var label = new Label { Text = labelText, AutoSize = true, Anchor = AnchorStyles.Left, Margin = new Padding(3, 8, 3, 3) };
|
||||||
|
control.Margin = new Padding(3, 5, 3, 5);
|
||||||
|
panel.Controls.Add(label, 0, row);
|
||||||
|
panel.Controls.Add(control, 1, row);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RefreshRuleList(int selectedIndex)
|
||||||
|
{
|
||||||
|
ruleList.BeginUpdate();
|
||||||
|
ruleList.Items.Clear();
|
||||||
|
foreach (LogColorRule rule in rules)
|
||||||
|
{
|
||||||
|
ruleList.Items.Add(rule);
|
||||||
|
}
|
||||||
|
ruleList.EndUpdate();
|
||||||
|
|
||||||
|
if (rules.Count > 0)
|
||||||
|
{
|
||||||
|
ruleList.SelectedIndex = Math.Max(0, Math.Min(selectedIndex, rules.Count - 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RuleList_SelectedIndexChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
LogColorRule rule = ruleList.SelectedItem as LogColorRule;
|
||||||
|
if (rule == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
loadingRule = true;
|
||||||
|
enabledCheckBox.Checked = rule.Enabled;
|
||||||
|
patternTextBox.Text = rule.Pattern;
|
||||||
|
foregroundButton.BackColor = rule.ForeColor;
|
||||||
|
backgroundCheckBox.Checked = rule.UseBackColor;
|
||||||
|
backgroundButton.Enabled = rule.UseBackColor;
|
||||||
|
backgroundButton.BackColor = rule.UseBackColor ? rule.BackColor : SystemColors.Control;
|
||||||
|
boldCheckBox.Checked = rule.Bold;
|
||||||
|
loadingRule = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void EditorValueChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (loadingRule)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
LogColorRule rule = ruleList.SelectedItem as LogColorRule;
|
||||||
|
if (rule == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
rule.Enabled = enabledCheckBox.Checked;
|
||||||
|
rule.Pattern = patternTextBox.Text;
|
||||||
|
rule.UseBackColor = backgroundCheckBox.Checked;
|
||||||
|
rule.Bold = boldCheckBox.Checked;
|
||||||
|
backgroundButton.Enabled = rule.UseBackColor;
|
||||||
|
int index = ruleList.SelectedIndex;
|
||||||
|
RefreshRuleList(index);
|
||||||
|
RefreshPreview();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ForegroundButton_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
LogColorRule rule = ruleList.SelectedItem as LogColorRule;
|
||||||
|
if (rule == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
using (var dialog = new ColorDialog { Color = rule.ForeColor, FullOpen = true })
|
||||||
|
{
|
||||||
|
if (dialog.ShowDialog(this) != DialogResult.OK)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
rule.ForeColorArgb = dialog.Color.ToArgb();
|
||||||
|
foregroundButton.BackColor = dialog.Color;
|
||||||
|
RefreshPreview();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void BackgroundButton_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
LogColorRule rule = ruleList.SelectedItem as LogColorRule;
|
||||||
|
if (rule == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Color initialColor = rule.UseBackColor ? rule.BackColor : SystemColors.Window;
|
||||||
|
using (var dialog = new ColorDialog { Color = initialColor, FullOpen = true })
|
||||||
|
{
|
||||||
|
if (dialog.ShowDialog(this) != DialogResult.OK)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
rule.BackColorArgb = dialog.Color.ToArgb();
|
||||||
|
rule.UseBackColor = true;
|
||||||
|
backgroundCheckBox.Checked = true;
|
||||||
|
backgroundButton.BackColor = dialog.Color;
|
||||||
|
RefreshPreview();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AddRule_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
rules.Add(new LogColorRule { Pattern = "NEW SUBSTRING", ForeColorArgb = Color.MediumPurple.ToArgb() });
|
||||||
|
RefreshRuleList(rules.Count - 1);
|
||||||
|
patternTextBox.Focus();
|
||||||
|
patternTextBox.SelectAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DeleteRule_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
int index = ruleList.SelectedIndex;
|
||||||
|
if (index < 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
rules.RemoveAt(index);
|
||||||
|
RefreshRuleList(Math.Min(index, rules.Count - 1));
|
||||||
|
RefreshPreview();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void MoveUp_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
MoveSelectedRule(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void MoveDown_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
MoveSelectedRule(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void MoveSelectedRule(int offset)
|
||||||
|
{
|
||||||
|
int index = ruleList.SelectedIndex;
|
||||||
|
int newIndex = index + offset;
|
||||||
|
if (index < 0 || newIndex < 0 || newIndex >= rules.Count)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
LogColorRule rule = rules[index];
|
||||||
|
rules.RemoveAt(index);
|
||||||
|
rules.Insert(newIndex, rule);
|
||||||
|
RefreshRuleList(newIndex);
|
||||||
|
RefreshPreview();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RestoreDefaults_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
rules.Clear();
|
||||||
|
rules.AddRange(LogColorRule.CreateDefaults());
|
||||||
|
RefreshRuleList(0);
|
||||||
|
RefreshPreview();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RefreshPreview()
|
||||||
|
{
|
||||||
|
int selectionStart = previewBox.SelectionStart;
|
||||||
|
int selectionLength = previewBox.SelectionLength;
|
||||||
|
string text = previewBox.Text;
|
||||||
|
LogColorizer.Apply(previewBox, 0, text.Length, text, rules, previewBox.Font, previewBoldFont);
|
||||||
|
previewBox.Select(Math.Min(selectionStart, previewBox.TextLength), Math.Min(selectionLength, Math.Max(0, previewBox.TextLength - selectionStart)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace AppDiagnostic
|
||||||
|
{
|
||||||
|
public class DiagApi
|
||||||
|
{
|
||||||
|
private static MainForm diagWindow; // Udržiava referenciu na existujúce okno
|
||||||
|
|
||||||
|
public DiagApi()
|
||||||
|
{
|
||||||
|
if (diagWindow == null || diagWindow.IsDisposed) // Ak okno neexistuje, vytvoríme ho
|
||||||
|
{
|
||||||
|
diagWindow = new MainForm();
|
||||||
|
diagWindow.FormClosing += (s, e) =>
|
||||||
|
{
|
||||||
|
diagWindow = null; // Keď sa zavrie, vyčistíme referenciu
|
||||||
|
};
|
||||||
|
diagWindow.Show();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
diagWindow.BringToFront(); // Ak už beží, len ho presunieme na vrch
|
||||||
|
diagWindow.WindowState = FormWindowState.Normal; // Ak je minimalizované, obnovíme ho
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
using AppDiagnostic.Logging;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace AppDiagnostic
|
||||||
|
{
|
||||||
|
public static class DiagnosticLogFormatter
|
||||||
|
{
|
||||||
|
public static string Format(DiagnosticLogEntry entry)
|
||||||
|
{
|
||||||
|
if (entry == null)
|
||||||
|
{
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
string level = (entry.Level ?? string.Empty).ToUpperInvariant().PadRight(5);
|
||||||
|
string application = string.IsNullOrWhiteSpace(entry.ApplicationName) ? "Unknown" : entry.ApplicationName;
|
||||||
|
string logger = entry.LoggerName ?? string.Empty;
|
||||||
|
string message = entry.Message ?? string.Empty;
|
||||||
|
string exception = string.IsNullOrWhiteSpace(entry.Exception) ? string.Empty : Environment.NewLine + entry.Exception;
|
||||||
|
|
||||||
|
return $"{entry.TimestampUtc.ToLocalTime():yyyy-MM-dd HH:mm:ss.fff}|{level}|{application}[{entry.ProcessId}]|{logger}|{message}{exception}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
using AppDiagnostic.Logging;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace AppDiagnostic
|
||||||
|
{
|
||||||
|
public sealed class DiagnosticLogStore
|
||||||
|
{
|
||||||
|
private const int MaximumLogCount = 10000;
|
||||||
|
private static readonly DiagnosticLogStore instance = new DiagnosticLogStore();
|
||||||
|
private readonly object syncRoot = new object();
|
||||||
|
private readonly List<DiagnosticLogEntry> entries = new List<DiagnosticLogEntry>();
|
||||||
|
private long totalReceived;
|
||||||
|
private long version;
|
||||||
|
|
||||||
|
private DiagnosticLogStore()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public static DiagnosticLogStore Instance => instance;
|
||||||
|
|
||||||
|
public long TotalReceived
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
lock (syncRoot)
|
||||||
|
{
|
||||||
|
return totalReceived;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public long Version
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
lock (syncRoot)
|
||||||
|
{
|
||||||
|
return version;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Add(DiagnosticLogEntry entry)
|
||||||
|
{
|
||||||
|
if (entry == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
lock (syncRoot)
|
||||||
|
{
|
||||||
|
entries.Add(entry);
|
||||||
|
totalReceived++;
|
||||||
|
version++;
|
||||||
|
|
||||||
|
int excessCount = entries.Count - MaximumLogCount;
|
||||||
|
if (excessCount > 0)
|
||||||
|
{
|
||||||
|
entries.RemoveRange(0, excessCount);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<DiagnosticLogEntry> GetSnapshot()
|
||||||
|
{
|
||||||
|
lock (syncRoot)
|
||||||
|
{
|
||||||
|
return entries.ToList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Clear()
|
||||||
|
{
|
||||||
|
lock (syncRoot)
|
||||||
|
{
|
||||||
|
entries.Clear();
|
||||||
|
version++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,164 @@
|
|||||||
|
using AppDiagnostic.Logging;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.IO.Pipes;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace AppDiagnostic
|
||||||
|
{
|
||||||
|
public sealed class DiagnosticPipeServer : IDisposable
|
||||||
|
{
|
||||||
|
private readonly Action<DiagnosticLogEntry> messageReceived;
|
||||||
|
private readonly CancellationTokenSource cancellation = new CancellationTokenSource();
|
||||||
|
private readonly object syncRoot = new object();
|
||||||
|
private readonly List<NamedPipeServerStream> connectedClients = new List<NamedPipeServerStream>();
|
||||||
|
private NamedPipeServerStream waitingServer;
|
||||||
|
private Task serverTask;
|
||||||
|
|
||||||
|
public DiagnosticPipeServer(Action<DiagnosticLogEntry> messageReceived)
|
||||||
|
{
|
||||||
|
this.messageReceived = messageReceived ?? throw new ArgumentNullException(nameof(messageReceived));
|
||||||
|
}
|
||||||
|
|
||||||
|
public int ConnectedClientCount
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
lock (syncRoot)
|
||||||
|
{
|
||||||
|
return connectedClients.Count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Start()
|
||||||
|
{
|
||||||
|
if (serverTask != null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
serverTask = Task.Run((Action)AcceptConnections);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AcceptConnections()
|
||||||
|
{
|
||||||
|
while (!cancellation.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
NamedPipeServerStream server = null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
server = new NamedPipeServerStream(DiagnosticProtocol.DefaultPipeName, PipeDirection.In, NamedPipeServerStream.MaxAllowedServerInstances, PipeTransmissionMode.Byte, PipeOptions.Asynchronous);
|
||||||
|
|
||||||
|
lock (syncRoot)
|
||||||
|
{
|
||||||
|
waitingServer = server;
|
||||||
|
}
|
||||||
|
|
||||||
|
server.WaitForConnection();
|
||||||
|
|
||||||
|
lock (syncRoot)
|
||||||
|
{
|
||||||
|
waitingServer = null;
|
||||||
|
connectedClients.Add(server);
|
||||||
|
}
|
||||||
|
|
||||||
|
NamedPipeServerStream connectedServer = server;
|
||||||
|
server = null;
|
||||||
|
Task.Run(() => ReadClient(connectedServer));
|
||||||
|
}
|
||||||
|
catch (ObjectDisposedException)
|
||||||
|
{
|
||||||
|
if (!cancellation.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (IOException)
|
||||||
|
{
|
||||||
|
if (!cancellation.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
Thread.Sleep(250);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
lock (syncRoot)
|
||||||
|
{
|
||||||
|
if (ReferenceEquals(waitingServer, server))
|
||||||
|
{
|
||||||
|
waitingServer = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
server?.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ReadClient(NamedPipeServerStream client)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
while (client.IsConnected && !cancellation.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
DiagnosticLogEntry entry = DiagnosticMessageSerializer.ReadFramed(client);
|
||||||
|
messageReceived(entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (EndOfStreamException)
|
||||||
|
{
|
||||||
|
// The producer application was closed.
|
||||||
|
}
|
||||||
|
catch (IOException)
|
||||||
|
{
|
||||||
|
// The producer application disconnected.
|
||||||
|
}
|
||||||
|
catch (ObjectDisposedException)
|
||||||
|
{
|
||||||
|
// The diagnostic application is shutting down.
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
lock (syncRoot)
|
||||||
|
{
|
||||||
|
connectedClients.Remove(client);
|
||||||
|
}
|
||||||
|
|
||||||
|
client.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
cancellation.Cancel();
|
||||||
|
|
||||||
|
lock (syncRoot)
|
||||||
|
{
|
||||||
|
waitingServer?.Dispose();
|
||||||
|
waitingServer = null;
|
||||||
|
|
||||||
|
foreach (NamedPipeServerStream client in connectedClients.ToArray())
|
||||||
|
{
|
||||||
|
client.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
connectedClients.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
serverTask?.Wait(2000);
|
||||||
|
}
|
||||||
|
catch (AggregateException)
|
||||||
|
{
|
||||||
|
// Cancellation during shutdown is expected.
|
||||||
|
}
|
||||||
|
|
||||||
|
cancellation.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,174 @@
|
|||||||
|
using SharedComponents;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace AppDiagnostic
|
||||||
|
{
|
||||||
|
public class LogAdapter
|
||||||
|
{
|
||||||
|
private ListView _listView;
|
||||||
|
public string _filterText = string.Empty;
|
||||||
|
private bool _isUserScrolling = false; // Indikátor, že používateľ manuálne scrolluje
|
||||||
|
private bool _autoScrollEnabled = true; // Indikátor, že automatické scrollovanie je povolené
|
||||||
|
private Timer _refreshTimer;
|
||||||
|
private const int RefreshInterval = 1000;
|
||||||
|
|
||||||
|
public LogAdapter(ListView listView)
|
||||||
|
{
|
||||||
|
_listView = listView;
|
||||||
|
|
||||||
|
// Nastavenie ListView
|
||||||
|
_listView.View = View.Details;
|
||||||
|
_listView.Columns.Clear();
|
||||||
|
_listView.Columns.Add("Logs");
|
||||||
|
|
||||||
|
_listView.Scrollable = true;
|
||||||
|
|
||||||
|
// Nastavenie šírky stĺpca na celú šírku ListView
|
||||||
|
AdjustColumnWidth();
|
||||||
|
|
||||||
|
// Udalosť pre dynamickú zmenu veľkosti stĺpca pri zmene veľkosti ListView
|
||||||
|
_listView.Resize += (sender, args) => AdjustColumnWidth();
|
||||||
|
|
||||||
|
// Pridanie udalosti pre manuálne skrolovanie
|
||||||
|
_listView.MouseWheel += ListView_MouseWheel;
|
||||||
|
|
||||||
|
// Inicializácia časovača na pravidelný refresh
|
||||||
|
_refreshTimer = new Timer { Interval = RefreshInterval };
|
||||||
|
_refreshTimer.Tick += (sender, args) => RefreshListView();
|
||||||
|
_refreshTimer.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ListView_MouseWheel(object sender, MouseEventArgs e)
|
||||||
|
{
|
||||||
|
_isUserScrolling = true;
|
||||||
|
|
||||||
|
// Ak sa manuálnym scrollovaním používateľ dostane na koniec, obnovíme automatické scrollovanie
|
||||||
|
if (IsOnLastItem())
|
||||||
|
{
|
||||||
|
_isUserScrolling = false;
|
||||||
|
_autoScrollEnabled = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_autoScrollEnabled = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RefreshListView()
|
||||||
|
{
|
||||||
|
//LiveLogCache.Instance.AddLog(string.Format("-------------------------------RunDeviceAfter()-------------------------------"));
|
||||||
|
|
||||||
|
if (_listView.InvokeRequired)
|
||||||
|
{
|
||||||
|
_listView.Invoke(new Action(RefreshListView));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_listView.BeginUpdate();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Získanie pozície prvého viditeľného prvku pre stabilizáciu scrollovania
|
||||||
|
int topIndexBeforeRefresh = _listView.TopItem?.Index ?? 0;
|
||||||
|
|
||||||
|
// Pred pridaním nových položiek si pamätáme, či bol používateľ na poslednej položke
|
||||||
|
bool wasOnLastItem = IsOnLastItem();
|
||||||
|
|
||||||
|
// Uchovanie aktuálne označených položiek (indexov)
|
||||||
|
var selectedIndices = _listView.SelectedIndices.Cast<int>().ToList();
|
||||||
|
|
||||||
|
// Načítanie logov
|
||||||
|
var logs = LiveLogCache.Instance.GetLogs(0, LiveLogCache.Instance.GetCount())
|
||||||
|
.Where(log => string.IsNullOrEmpty(_filterText) ||
|
||||||
|
log.IndexOf(_filterText, StringComparison.OrdinalIgnoreCase) >= 0)
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
// Vymazanie existujúcich položiek a pridanie nových
|
||||||
|
_listView.Items.Clear();
|
||||||
|
|
||||||
|
foreach (var log in logs)
|
||||||
|
{
|
||||||
|
var item = new ListViewItem(log)
|
||||||
|
{
|
||||||
|
BackColor = _listView.Items.Count % 2 == 0 ? Color.White : Color.FromArgb(240, 240, 240)
|
||||||
|
};
|
||||||
|
_listView.Items.Add(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Obnovenie označených položiek
|
||||||
|
foreach (var index in selectedIndices)
|
||||||
|
{
|
||||||
|
if (index < _listView.Items.Count)
|
||||||
|
{
|
||||||
|
_listView.Items[index].Selected = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ak bol používateľ na poslednom prvku, nastavíme focus a scroll na posledný prvok
|
||||||
|
if (_autoScrollEnabled && wasOnLastItem && _listView.Items.Count > 0)
|
||||||
|
{
|
||||||
|
var lastItemIndex = _listView.Items.Count - 1;
|
||||||
|
_listView.EnsureVisible(lastItemIndex);
|
||||||
|
_listView.Items[lastItemIndex].Focused = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Ak používateľ nebol na spodku, vrátime sa na predchádzajúcu pozíciu scrollu
|
||||||
|
if (topIndexBeforeRefresh < _listView.Items.Count)
|
||||||
|
{
|
||||||
|
_listView.TopItem = _listView.Items[topIndexBeforeRefresh];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
_listView.EndUpdate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public void ApplyFilter(string filterText)
|
||||||
|
{
|
||||||
|
_filterText = filterText?.Trim() ?? string.Empty;
|
||||||
|
RefreshListView();
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool IsOnLastItem()
|
||||||
|
{
|
||||||
|
if (_listView.Items.Count == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Získame poslednú položku
|
||||||
|
int lastItemIndex = _listView.Items.Count - 1;
|
||||||
|
var lastItem = _listView.Items[lastItemIndex];
|
||||||
|
|
||||||
|
// Overíme, či je posledná položka úplne viditeľná
|
||||||
|
return lastItem.Bounds.Bottom <= _listView.ClientRectangle.Bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void EnableAutoScroll()
|
||||||
|
{
|
||||||
|
_autoScrollEnabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DisableAutoScroll()
|
||||||
|
{
|
||||||
|
_autoScrollEnabled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AdjustColumnWidth()
|
||||||
|
{
|
||||||
|
if (_listView.Columns.Count > 0)
|
||||||
|
{
|
||||||
|
_listView.Columns[0].Width = _listView.ClientSize.Width;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Drawing;
|
||||||
|
|
||||||
|
namespace AppDiagnostic
|
||||||
|
{
|
||||||
|
[Serializable]
|
||||||
|
public sealed class LogColorRule
|
||||||
|
{
|
||||||
|
public bool Enabled { get; set; } = true;
|
||||||
|
public string Pattern { get; set; } = string.Empty;
|
||||||
|
public int ForeColorArgb { get; set; } = Color.Black.ToArgb();
|
||||||
|
public int BackColorArgb { get; set; }
|
||||||
|
public bool UseBackColor { get; set; }
|
||||||
|
public bool Bold { get; set; }
|
||||||
|
|
||||||
|
public Color ForeColor => Color.FromArgb(ForeColorArgb);
|
||||||
|
public Color BackColor => Color.FromArgb(BackColorArgb);
|
||||||
|
|
||||||
|
public LogColorRule Clone()
|
||||||
|
{
|
||||||
|
return new LogColorRule
|
||||||
|
{
|
||||||
|
Enabled = Enabled,
|
||||||
|
Pattern = Pattern,
|
||||||
|
ForeColorArgb = ForeColorArgb,
|
||||||
|
BackColorArgb = BackColorArgb,
|
||||||
|
UseBackColor = UseBackColor,
|
||||||
|
Bold = Bold
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
string state = Enabled ? string.Empty : "[disabled] ";
|
||||||
|
return state + Pattern;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<LogColorRule> CreateDefaults()
|
||||||
|
{
|
||||||
|
return new List<LogColorRule>
|
||||||
|
{
|
||||||
|
Create("|TRACE|", Color.DimGray, false),
|
||||||
|
Create("|DEBUG|", Color.RoyalBlue, false),
|
||||||
|
Create("|INFO |", Color.ForestGreen, false),
|
||||||
|
Create("|WARN |", Color.DarkOrange, true),
|
||||||
|
Create("|ERROR|", Color.Crimson, true),
|
||||||
|
Create("|FATAL|", Color.White, true, Color.DarkRed)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static LogColorRule Create(string pattern, Color foreground, bool bold, Color? background = null)
|
||||||
|
{
|
||||||
|
return new LogColorRule
|
||||||
|
{
|
||||||
|
Enabled = true,
|
||||||
|
Pattern = pattern,
|
||||||
|
ForeColorArgb = foreground.ToArgb(),
|
||||||
|
BackColorArgb = background?.ToArgb() ?? Color.Empty.ToArgb(),
|
||||||
|
UseBackColor = background.HasValue,
|
||||||
|
Bold = bold
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Xml.Serialization;
|
||||||
|
|
||||||
|
namespace AppDiagnostic
|
||||||
|
{
|
||||||
|
public static class LogColorRuleRepository
|
||||||
|
{
|
||||||
|
private static readonly string settingsFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Sensus", "AppDiagnostic");
|
||||||
|
private static readonly string settingsPath = Path.Combine(settingsFolder, "color-rules.xml");
|
||||||
|
|
||||||
|
public static List<LogColorRule> Load()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!File.Exists(settingsPath))
|
||||||
|
{
|
||||||
|
return LogColorRule.CreateDefaults();
|
||||||
|
}
|
||||||
|
|
||||||
|
var serializer = new XmlSerializer(typeof(List<LogColorRule>));
|
||||||
|
using (FileStream stream = File.OpenRead(settingsPath))
|
||||||
|
{
|
||||||
|
var rules = serializer.Deserialize(stream) as List<LogColorRule>;
|
||||||
|
return rules == null || rules.Count == 0 ? LogColorRule.CreateDefaults() : rules;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return LogColorRule.CreateDefaults();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Save(IEnumerable<LogColorRule> rules)
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(settingsFolder);
|
||||||
|
|
||||||
|
var serializer = new XmlSerializer(typeof(List<LogColorRule>));
|
||||||
|
using (FileStream stream = File.Create(settingsPath))
|
||||||
|
{
|
||||||
|
serializer.Serialize(stream, new List<LogColorRule>(rules));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace AppDiagnostic
|
||||||
|
{
|
||||||
|
public static class LogColorizer
|
||||||
|
{
|
||||||
|
public static void Apply(RichTextBox target, int startIndex, int length, string text, IEnumerable<LogColorRule> rules, Font regularFont, Font boldFont)
|
||||||
|
{
|
||||||
|
if (target == null || length <= 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
target.Select(startIndex, length);
|
||||||
|
target.SelectionColor = target.ForeColor;
|
||||||
|
target.SelectionBackColor = target.BackColor;
|
||||||
|
target.SelectionFont = regularFont;
|
||||||
|
|
||||||
|
foreach (LogColorRule rule in rules)
|
||||||
|
{
|
||||||
|
if (rule == null || !rule.Enabled || string.IsNullOrEmpty(rule.Pattern))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
int searchIndex = 0;
|
||||||
|
while (searchIndex < text.Length)
|
||||||
|
{
|
||||||
|
int matchIndex = text.IndexOf(rule.Pattern, searchIndex, StringComparison.OrdinalIgnoreCase);
|
||||||
|
if (matchIndex < 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
target.Select(startIndex + matchIndex, rule.Pattern.Length);
|
||||||
|
target.SelectionColor = rule.ForeColor;
|
||||||
|
target.SelectionBackColor = rule.UseBackColor ? rule.BackColor : target.BackColor;
|
||||||
|
target.SelectionFont = rule.Bold ? boldFont : regularFont;
|
||||||
|
searchIndex = matchIndex + rule.Pattern.Length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,91 @@
|
|||||||
|
using SharedComponents;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace AppDiagnostic
|
||||||
|
{
|
||||||
|
public class LogFilter
|
||||||
|
{
|
||||||
|
private ListView _listView;
|
||||||
|
private string _filterText = string.Empty; // Pre uloženie aktuálneho filtrovaného reťazca
|
||||||
|
|
||||||
|
// Konstruktor
|
||||||
|
public LogFilter(ListView listView)
|
||||||
|
{
|
||||||
|
_listView = listView;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Metóda na aplikovanie filtra na ListView
|
||||||
|
public void ApplyFilter(string filterText)
|
||||||
|
{
|
||||||
|
_filterText = filterText.ToLower(); // Ukladáme text filtra bez ohľadu na veľkosť písmen
|
||||||
|
|
||||||
|
// Po aplikovaní filtra obnovíme zobrazenie
|
||||||
|
RefreshListView();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RefreshListView()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Skontrolujeme, či sme na hlavnom vlákne a v prípade potreby použijeme Invoke
|
||||||
|
if (_listView.InvokeRequired)
|
||||||
|
{
|
||||||
|
// Použijeme Invoke, ak nie sme na hlavnom vlákne
|
||||||
|
_listView.Invoke(new Action(RefreshListView));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Vymazanie existujúcich položiek
|
||||||
|
_listView.Items.Clear();
|
||||||
|
|
||||||
|
// Načítame všetky logy (ideálne z cache alebo databázy)
|
||||||
|
var logs = LiveLogCache.Instance.GetLogs(0, LiveLogCache.Instance.Logs.Count);
|
||||||
|
|
||||||
|
// Pridáme len tie logy, ktoré spĺňajú filter
|
||||||
|
foreach (var log in logs)
|
||||||
|
{
|
||||||
|
if (log.ToLower().Contains(_filterText)) // Kontrola, či log obsahuje filter text
|
||||||
|
{
|
||||||
|
var listViewItem = new ListViewItem(log);
|
||||||
|
|
||||||
|
// Striedanie farieb riadkov
|
||||||
|
if (_listView.Items.Count % 2 == 0) // Párny index => biela
|
||||||
|
{
|
||||||
|
listViewItem.BackColor = Color.White;
|
||||||
|
}
|
||||||
|
else // Nepárny index => svetlá sivá
|
||||||
|
{
|
||||||
|
listViewItem.BackColor = Color.FromArgb(240, 240, 240); // Veľmi svetlá sivá
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pridanie efektu pre novú položku
|
||||||
|
ApplyNewItemEffect(listViewItem);
|
||||||
|
|
||||||
|
// Pridanie položky do ListView
|
||||||
|
_listView.Items.Add(listViewItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
// Zachytíme výnimku, ak sa niečo pokazí, a zobrazíme ju užívateľovi
|
||||||
|
MessageBox.Show($"An error occurred while refreshing the log view: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Môžete pridať ďalšie metódy na zobrazenie alebo efekt pre nové položky, ak je to potrebné
|
||||||
|
private void ApplyNewItemEffect(ListViewItem item)
|
||||||
|
{
|
||||||
|
// Prípadný efekt pre nový pridaný log
|
||||||
|
// Môžete pridať animáciu alebo zmenu farby atď.
|
||||||
|
item.ForeColor = Color.Green; // Napríklad zmeníme farbu písma na zelenú
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Generated
+309
@@ -0,0 +1,309 @@
|
|||||||
|
namespace AppDiagnostic
|
||||||
|
{
|
||||||
|
partial class MainForm
|
||||||
|
{
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
private System.Windows.Forms.ToolStrip mainToolStrip;
|
||||||
|
private System.Windows.Forms.ToolStripButton pauseButton;
|
||||||
|
private System.Windows.Forms.ToolStripButton refreshButton;
|
||||||
|
private System.Windows.Forms.ToolStripButton clearButton;
|
||||||
|
private System.Windows.Forms.ToolStripButton saveButton;
|
||||||
|
private System.Windows.Forms.ToolStripButton copyButton;
|
||||||
|
private System.Windows.Forms.ToolStripButton copyAllButton;
|
||||||
|
private System.Windows.Forms.ToolStripButton wrapButton;
|
||||||
|
private System.Windows.Forms.ToolStripButton autoScrollButton;
|
||||||
|
private System.Windows.Forms.ToolStripButton alwaysOnTopButton;
|
||||||
|
private System.Windows.Forms.ToolStripButton colorRulesButton;
|
||||||
|
private System.Windows.Forms.ToolStripButton closeButton;
|
||||||
|
private System.Windows.Forms.TableLayoutPanel filterPanel;
|
||||||
|
private System.Windows.Forms.Label filterLabel;
|
||||||
|
private System.Windows.Forms.TextBox filterTextBox;
|
||||||
|
private System.Windows.Forms.Label levelLabel;
|
||||||
|
private System.Windows.Forms.ComboBox levelComboBox;
|
||||||
|
private System.Windows.Forms.Label applicationLabel;
|
||||||
|
private System.Windows.Forms.ComboBox applicationComboBox;
|
||||||
|
private System.Windows.Forms.Button applyFilterButton;
|
||||||
|
private System.Windows.Forms.Button clearFilterButton;
|
||||||
|
private System.Windows.Forms.RichTextBox logView;
|
||||||
|
private System.Windows.Forms.StatusStrip statusStrip;
|
||||||
|
private System.Windows.Forms.ToolStripStatusLabel receiverStatusLabel;
|
||||||
|
private System.Windows.Forms.ToolStripStatusLabel statusSpacer;
|
||||||
|
private System.Windows.Forms.ToolStripStatusLabel countStatusLabel;
|
||||||
|
private System.Windows.Forms.ContextMenuStrip logContextMenu;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem copySelectionMenuItem;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem copyLineMenuItem;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem copyAllMenuItem;
|
||||||
|
|
||||||
|
protected override void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
if (disposing && components != null)
|
||||||
|
{
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void InitializeComponent()
|
||||||
|
{
|
||||||
|
this.components = new System.ComponentModel.Container();
|
||||||
|
this.mainToolStrip = new System.Windows.Forms.ToolStrip();
|
||||||
|
this.pauseButton = new System.Windows.Forms.ToolStripButton();
|
||||||
|
this.refreshButton = new System.Windows.Forms.ToolStripButton();
|
||||||
|
this.clearButton = new System.Windows.Forms.ToolStripButton();
|
||||||
|
this.saveButton = new System.Windows.Forms.ToolStripButton();
|
||||||
|
this.copyButton = new System.Windows.Forms.ToolStripButton();
|
||||||
|
this.copyAllButton = new System.Windows.Forms.ToolStripButton();
|
||||||
|
this.wrapButton = new System.Windows.Forms.ToolStripButton();
|
||||||
|
this.autoScrollButton = new System.Windows.Forms.ToolStripButton();
|
||||||
|
this.alwaysOnTopButton = new System.Windows.Forms.ToolStripButton();
|
||||||
|
this.colorRulesButton = new System.Windows.Forms.ToolStripButton();
|
||||||
|
this.closeButton = new System.Windows.Forms.ToolStripButton();
|
||||||
|
this.filterPanel = new System.Windows.Forms.TableLayoutPanel();
|
||||||
|
this.filterLabel = new System.Windows.Forms.Label();
|
||||||
|
this.filterTextBox = new System.Windows.Forms.TextBox();
|
||||||
|
this.levelLabel = new System.Windows.Forms.Label();
|
||||||
|
this.levelComboBox = new System.Windows.Forms.ComboBox();
|
||||||
|
this.applicationLabel = new System.Windows.Forms.Label();
|
||||||
|
this.applicationComboBox = new System.Windows.Forms.ComboBox();
|
||||||
|
this.applyFilterButton = new System.Windows.Forms.Button();
|
||||||
|
this.clearFilterButton = new System.Windows.Forms.Button();
|
||||||
|
this.logContextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);
|
||||||
|
this.copySelectionMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.copyLineMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.copyAllMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.logView = new System.Windows.Forms.RichTextBox();
|
||||||
|
this.statusStrip = new System.Windows.Forms.StatusStrip();
|
||||||
|
this.receiverStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
|
||||||
|
this.statusSpacer = new System.Windows.Forms.ToolStripStatusLabel();
|
||||||
|
this.countStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
|
||||||
|
this.mainToolStrip.SuspendLayout();
|
||||||
|
this.filterPanel.SuspendLayout();
|
||||||
|
this.logContextMenu.SuspendLayout();
|
||||||
|
this.statusStrip.SuspendLayout();
|
||||||
|
this.SuspendLayout();
|
||||||
|
//
|
||||||
|
// mainToolStrip
|
||||||
|
//
|
||||||
|
this.mainToolStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;
|
||||||
|
this.mainToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||||
|
this.pauseButton,
|
||||||
|
this.refreshButton,
|
||||||
|
this.clearButton,
|
||||||
|
this.saveButton,
|
||||||
|
new System.Windows.Forms.ToolStripSeparator(),
|
||||||
|
this.copyButton,
|
||||||
|
this.copyAllButton,
|
||||||
|
new System.Windows.Forms.ToolStripSeparator(),
|
||||||
|
this.wrapButton,
|
||||||
|
this.autoScrollButton,
|
||||||
|
this.alwaysOnTopButton,
|
||||||
|
this.colorRulesButton,
|
||||||
|
this.closeButton});
|
||||||
|
this.mainToolStrip.Location = new System.Drawing.Point(0, 0);
|
||||||
|
this.mainToolStrip.Name = "mainToolStrip";
|
||||||
|
this.mainToolStrip.Padding = new System.Windows.Forms.Padding(6, 3, 6, 3);
|
||||||
|
this.mainToolStrip.Size = new System.Drawing.Size(1184, 31);
|
||||||
|
this.mainToolStrip.TabIndex = 0;
|
||||||
|
//
|
||||||
|
// pauseButton
|
||||||
|
//
|
||||||
|
this.pauseButton.CheckOnClick = true;
|
||||||
|
this.pauseButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
|
||||||
|
this.pauseButton.Text = "Pause";
|
||||||
|
this.pauseButton.ToolTipText = "Pause screen updates while continuing to receive logs";
|
||||||
|
this.pauseButton.Click += new System.EventHandler(this.pauseButton_Click);
|
||||||
|
//
|
||||||
|
// refreshButton
|
||||||
|
//
|
||||||
|
this.refreshButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
|
||||||
|
this.refreshButton.Text = "Refresh";
|
||||||
|
this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click);
|
||||||
|
//
|
||||||
|
// clearButton
|
||||||
|
//
|
||||||
|
this.clearButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
|
||||||
|
this.clearButton.Text = "Clear";
|
||||||
|
this.clearButton.Click += new System.EventHandler(this.clearButton_Click);
|
||||||
|
//
|
||||||
|
// saveButton
|
||||||
|
//
|
||||||
|
this.saveButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
|
||||||
|
this.saveButton.Text = "Save...";
|
||||||
|
this.saveButton.Click += new System.EventHandler(this.saveButton_Click);
|
||||||
|
//
|
||||||
|
// copyButton
|
||||||
|
//
|
||||||
|
this.copyButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
|
||||||
|
this.copyButton.Text = "Copy";
|
||||||
|
this.copyButton.ToolTipText = "Copy selected text or the current log line";
|
||||||
|
this.copyButton.Click += new System.EventHandler(this.copyButton_Click);
|
||||||
|
//
|
||||||
|
// copyAllButton
|
||||||
|
//
|
||||||
|
this.copyAllButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
|
||||||
|
this.copyAllButton.Text = "Copy all";
|
||||||
|
this.copyAllButton.Click += new System.EventHandler(this.copyAllButton_Click);
|
||||||
|
//
|
||||||
|
// wrapButton
|
||||||
|
//
|
||||||
|
this.wrapButton.Checked = true;
|
||||||
|
this.wrapButton.CheckOnClick = true;
|
||||||
|
this.wrapButton.CheckState = System.Windows.Forms.CheckState.Checked;
|
||||||
|
this.wrapButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
|
||||||
|
this.wrapButton.Text = "Wrap lines";
|
||||||
|
this.wrapButton.Click += new System.EventHandler(this.wrapButton_Click);
|
||||||
|
//
|
||||||
|
// autoScrollButton
|
||||||
|
//
|
||||||
|
this.autoScrollButton.Checked = true;
|
||||||
|
this.autoScrollButton.CheckOnClick = true;
|
||||||
|
this.autoScrollButton.CheckState = System.Windows.Forms.CheckState.Checked;
|
||||||
|
this.autoScrollButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
|
||||||
|
this.autoScrollButton.Text = "Auto-scroll";
|
||||||
|
//
|
||||||
|
// alwaysOnTopButton
|
||||||
|
//
|
||||||
|
this.alwaysOnTopButton.CheckOnClick = true;
|
||||||
|
this.alwaysOnTopButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
|
||||||
|
this.alwaysOnTopButton.Text = "Always on top";
|
||||||
|
this.alwaysOnTopButton.Click += new System.EventHandler(this.alwaysOnTopButton_Click);
|
||||||
|
//
|
||||||
|
// colorRulesButton
|
||||||
|
//
|
||||||
|
this.colorRulesButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
|
||||||
|
this.colorRulesButton.Text = "Color rules...";
|
||||||
|
this.colorRulesButton.Click += new System.EventHandler(this.colorRulesButton_Click);
|
||||||
|
//
|
||||||
|
// closeButton
|
||||||
|
//
|
||||||
|
this.closeButton.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
|
||||||
|
this.closeButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
|
||||||
|
this.closeButton.Text = "Close";
|
||||||
|
this.closeButton.Click += new System.EventHandler(this.closeButton_Click);
|
||||||
|
//
|
||||||
|
// filterPanel
|
||||||
|
//
|
||||||
|
this.filterPanel.ColumnCount = 8;
|
||||||
|
this.filterPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 42F));
|
||||||
|
this.filterPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
|
||||||
|
this.filterPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 42F));
|
||||||
|
this.filterPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 105F));
|
||||||
|
this.filterPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 72F));
|
||||||
|
this.filterPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 180F));
|
||||||
|
this.filterPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 66F));
|
||||||
|
this.filterPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 66F));
|
||||||
|
this.filterPanel.Controls.Add(this.filterLabel, 0, 0);
|
||||||
|
this.filterPanel.Controls.Add(this.filterTextBox, 1, 0);
|
||||||
|
this.filterPanel.Controls.Add(this.levelLabel, 2, 0);
|
||||||
|
this.filterPanel.Controls.Add(this.levelComboBox, 3, 0);
|
||||||
|
this.filterPanel.Controls.Add(this.applicationLabel, 4, 0);
|
||||||
|
this.filterPanel.Controls.Add(this.applicationComboBox, 5, 0);
|
||||||
|
this.filterPanel.Controls.Add(this.applyFilterButton, 6, 0);
|
||||||
|
this.filterPanel.Controls.Add(this.clearFilterButton, 7, 0);
|
||||||
|
this.filterPanel.Dock = System.Windows.Forms.DockStyle.Top;
|
||||||
|
this.filterPanel.Location = new System.Drawing.Point(0, 31);
|
||||||
|
this.filterPanel.Name = "filterPanel";
|
||||||
|
this.filterPanel.Padding = new System.Windows.Forms.Padding(6, 5, 6, 5);
|
||||||
|
this.filterPanel.RowCount = 1;
|
||||||
|
this.filterPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
|
||||||
|
this.filterPanel.Size = new System.Drawing.Size(1184, 38);
|
||||||
|
this.filterPanel.TabIndex = 1;
|
||||||
|
//
|
||||||
|
// filter controls
|
||||||
|
//
|
||||||
|
this.filterLabel.Anchor = System.Windows.Forms.AnchorStyles.Left;
|
||||||
|
this.filterLabel.AutoSize = true;
|
||||||
|
this.filterLabel.Text = "Filter";
|
||||||
|
this.filterTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.filterTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.filterTextBox_KeyDown);
|
||||||
|
this.levelLabel.Anchor = System.Windows.Forms.AnchorStyles.Left;
|
||||||
|
this.levelLabel.AutoSize = true;
|
||||||
|
this.levelLabel.Text = "Level";
|
||||||
|
this.levelComboBox.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.levelComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||||
|
this.levelComboBox.SelectedIndexChanged += new System.EventHandler(this.filterValueChanged);
|
||||||
|
this.applicationLabel.Anchor = System.Windows.Forms.AnchorStyles.Left;
|
||||||
|
this.applicationLabel.AutoSize = true;
|
||||||
|
this.applicationLabel.Text = "Application";
|
||||||
|
this.applicationComboBox.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.applicationComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||||
|
this.applicationComboBox.SelectedIndexChanged += new System.EventHandler(this.filterValueChanged);
|
||||||
|
this.applyFilterButton.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.applyFilterButton.Text = "Apply";
|
||||||
|
this.applyFilterButton.Click += new System.EventHandler(this.applyFilterButton_Click);
|
||||||
|
this.clearFilterButton.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.clearFilterButton.Text = "Reset";
|
||||||
|
this.clearFilterButton.Click += new System.EventHandler(this.clearFilterButton_Click);
|
||||||
|
//
|
||||||
|
// logContextMenu
|
||||||
|
//
|
||||||
|
this.logContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||||
|
this.copySelectionMenuItem,
|
||||||
|
this.copyLineMenuItem,
|
||||||
|
this.copyAllMenuItem});
|
||||||
|
this.copySelectionMenuItem.Text = "Copy selection";
|
||||||
|
this.copySelectionMenuItem.Click += new System.EventHandler(this.copySelectionMenuItem_Click);
|
||||||
|
this.copyLineMenuItem.Text = "Copy current line";
|
||||||
|
this.copyLineMenuItem.Click += new System.EventHandler(this.copyLineMenuItem_Click);
|
||||||
|
this.copyAllMenuItem.Text = "Copy all visible logs";
|
||||||
|
this.copyAllMenuItem.Click += new System.EventHandler(this.copyAllButton_Click);
|
||||||
|
//
|
||||||
|
// logView
|
||||||
|
//
|
||||||
|
this.logView.BackColor = System.Drawing.SystemColors.Window;
|
||||||
|
this.logView.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||||
|
this.logView.ContextMenuStrip = this.logContextMenu;
|
||||||
|
this.logView.DetectUrls = false;
|
||||||
|
this.logView.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.logView.Font = new System.Drawing.Font("Consolas", 9F);
|
||||||
|
this.logView.HideSelection = false;
|
||||||
|
this.logView.Location = new System.Drawing.Point(0, 69);
|
||||||
|
this.logView.Name = "logView";
|
||||||
|
this.logView.ReadOnly = true;
|
||||||
|
this.logView.Size = new System.Drawing.Size(1184, 554);
|
||||||
|
this.logView.TabIndex = 2;
|
||||||
|
this.logView.Text = "";
|
||||||
|
this.logView.WordWrap = true;
|
||||||
|
//
|
||||||
|
// statusStrip
|
||||||
|
//
|
||||||
|
this.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||||
|
this.receiverStatusLabel,
|
||||||
|
this.statusSpacer,
|
||||||
|
this.countStatusLabel});
|
||||||
|
this.statusStrip.Location = new System.Drawing.Point(0, 623);
|
||||||
|
this.statusStrip.Name = "statusStrip";
|
||||||
|
this.statusStrip.Size = new System.Drawing.Size(1184, 22);
|
||||||
|
this.statusStrip.TabIndex = 3;
|
||||||
|
this.receiverStatusLabel.Text = "Listening";
|
||||||
|
this.statusSpacer.Spring = true;
|
||||||
|
this.countStatusLabel.Text = "Received: 0 | Visible: 0";
|
||||||
|
//
|
||||||
|
// MainForm
|
||||||
|
//
|
||||||
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
|
this.ClientSize = new System.Drawing.Size(1184, 645);
|
||||||
|
this.Controls.Add(this.logView);
|
||||||
|
this.Controls.Add(this.filterPanel);
|
||||||
|
this.Controls.Add(this.mainToolStrip);
|
||||||
|
this.Controls.Add(this.statusStrip);
|
||||||
|
this.KeyPreview = true;
|
||||||
|
this.MinimumSize = new System.Drawing.Size(860, 480);
|
||||||
|
this.Name = "MainForm";
|
||||||
|
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
|
||||||
|
this.Text = "Application live diagnostic";
|
||||||
|
this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MainForm_KeyDown);
|
||||||
|
this.mainToolStrip.ResumeLayout(false);
|
||||||
|
this.mainToolStrip.PerformLayout();
|
||||||
|
this.filterPanel.ResumeLayout(false);
|
||||||
|
this.filterPanel.PerformLayout();
|
||||||
|
this.logContextMenu.ResumeLayout(false);
|
||||||
|
this.statusStrip.ResumeLayout(false);
|
||||||
|
this.statusStrip.PerformLayout();
|
||||||
|
this.ResumeLayout(false);
|
||||||
|
this.PerformLayout();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,446 @@
|
|||||||
|
using AppDiagnostic.Logging;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace AppDiagnostic
|
||||||
|
{
|
||||||
|
public partial class MainForm : Form
|
||||||
|
{
|
||||||
|
private readonly Func<int> connectedClientCountProvider;
|
||||||
|
private readonly Func<bool> activationRequestProvider;
|
||||||
|
private readonly Timer refreshTimer;
|
||||||
|
private readonly Font regularLogFont;
|
||||||
|
private readonly Font boldLogFont;
|
||||||
|
private List<LogColorRule> colorRules;
|
||||||
|
private long lastRenderedVersion = -1;
|
||||||
|
private int observedEntryCount;
|
||||||
|
private int visibleEntryCount;
|
||||||
|
private bool loadingFilters;
|
||||||
|
|
||||||
|
public MainForm() : this(null, null)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public MainForm(Func<int> connectedClientCountProvider, Func<bool> activationRequestProvider)
|
||||||
|
{
|
||||||
|
this.connectedClientCountProvider = connectedClientCountProvider;
|
||||||
|
this.activationRequestProvider = activationRequestProvider;
|
||||||
|
InitializeComponent();
|
||||||
|
Icon = Properties.Resources.TBF_icon;
|
||||||
|
|
||||||
|
regularLogFont = new Font(logView.Font, FontStyle.Regular);
|
||||||
|
boldLogFont = new Font(logView.Font, FontStyle.Bold);
|
||||||
|
colorRules = LogColorRuleRepository.Load();
|
||||||
|
|
||||||
|
InitializeFilters();
|
||||||
|
|
||||||
|
refreshTimer = new Timer { Interval = 250 };
|
||||||
|
refreshTimer.Tick += refreshTimer_Tick;
|
||||||
|
refreshTimer.Start();
|
||||||
|
|
||||||
|
RefreshView(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnFormClosing(FormClosingEventArgs e)
|
||||||
|
{
|
||||||
|
refreshTimer.Stop();
|
||||||
|
refreshTimer.Dispose();
|
||||||
|
regularLogFont.Dispose();
|
||||||
|
boldLogFont.Dispose();
|
||||||
|
base.OnFormClosing(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void InitializeFilters()
|
||||||
|
{
|
||||||
|
loadingFilters = true;
|
||||||
|
levelComboBox.Items.AddRange(new object[] { "All levels", "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FATAL" });
|
||||||
|
levelComboBox.SelectedIndex = 0;
|
||||||
|
applicationComboBox.Items.Add("All applications");
|
||||||
|
applicationComboBox.SelectedIndex = 0;
|
||||||
|
loadingFilters = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void refreshTimer_Tick(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
ProcessActivationRequest();
|
||||||
|
RefreshView(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ProcessActivationRequest()
|
||||||
|
{
|
||||||
|
if (activationRequestProvider == null || !activationRequestProvider())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (WindowState == FormWindowState.Minimized)
|
||||||
|
{
|
||||||
|
WindowState = FormWindowState.Normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
Show();
|
||||||
|
BringToFront();
|
||||||
|
Activate();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RefreshView(bool forceFullRefresh)
|
||||||
|
{
|
||||||
|
List<DiagnosticLogEntry> snapshot = DiagnosticLogStore.Instance.GetSnapshot();
|
||||||
|
UpdateApplicationFilter(snapshot);
|
||||||
|
|
||||||
|
if (pauseButton.Checked)
|
||||||
|
{
|
||||||
|
UpdateStatus(snapshot.Count);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
long currentVersion = DiagnosticLogStore.Instance.Version;
|
||||||
|
if (!forceFullRefresh && currentVersion == lastRenderedVersion)
|
||||||
|
{
|
||||||
|
UpdateStatus(snapshot.Count);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool canAppend = !forceFullRefresh && snapshot.Count > observedEntryCount;
|
||||||
|
if (canAppend)
|
||||||
|
{
|
||||||
|
AppendEntries(snapshot.Skip(observedEntryCount));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
RebuildView(snapshot);
|
||||||
|
}
|
||||||
|
|
||||||
|
observedEntryCount = snapshot.Count;
|
||||||
|
lastRenderedVersion = currentVersion;
|
||||||
|
UpdateStatus(snapshot.Count);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RebuildView(IEnumerable<DiagnosticLogEntry> entries)
|
||||||
|
{
|
||||||
|
logView.SuspendLayout();
|
||||||
|
logView.Clear();
|
||||||
|
visibleEntryCount = 0;
|
||||||
|
AppendEntries(entries, false);
|
||||||
|
logView.ResumeLayout();
|
||||||
|
|
||||||
|
if (autoScrollButton.Checked)
|
||||||
|
{
|
||||||
|
ScrollToEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AppendEntries(IEnumerable<DiagnosticLogEntry> entries, bool scrollAfterAppend = true)
|
||||||
|
{
|
||||||
|
int originalSelectionStart = logView.SelectionStart;
|
||||||
|
int originalSelectionLength = logView.SelectionLength;
|
||||||
|
|
||||||
|
foreach (DiagnosticLogEntry entry in entries)
|
||||||
|
{
|
||||||
|
if (!MatchesFilter(entry))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
AppendEntry(entry);
|
||||||
|
visibleEntryCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (scrollAfterAppend && autoScrollButton.Checked)
|
||||||
|
{
|
||||||
|
ScrollToEnd();
|
||||||
|
}
|
||||||
|
else if (!autoScrollButton.Checked)
|
||||||
|
{
|
||||||
|
int safeStart = Math.Min(originalSelectionStart, logView.TextLength);
|
||||||
|
int safeLength = Math.Min(originalSelectionLength, logView.TextLength - safeStart);
|
||||||
|
logView.Select(safeStart, safeLength);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AppendEntry(DiagnosticLogEntry entry)
|
||||||
|
{
|
||||||
|
string text = DiagnosticLogFormatter.Format(entry);
|
||||||
|
|
||||||
|
if (logView.TextLength > 0)
|
||||||
|
{
|
||||||
|
logView.AppendText(Environment.NewLine);
|
||||||
|
}
|
||||||
|
|
||||||
|
int startIndex = logView.TextLength;
|
||||||
|
logView.AppendText(text);
|
||||||
|
LogColorizer.Apply(logView, startIndex, text.Length, text, colorRules, regularLogFont, boldLogFont);
|
||||||
|
logView.Select(logView.TextLength, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool MatchesFilter(DiagnosticLogEntry entry)
|
||||||
|
{
|
||||||
|
string selectedLevel = levelComboBox.SelectedItem as string;
|
||||||
|
if (!string.IsNullOrEmpty(selectedLevel) && selectedLevel != "All levels" && !string.Equals(entry.Level, selectedLevel, StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
string selectedApplication = applicationComboBox.SelectedItem as string;
|
||||||
|
if (!string.IsNullOrEmpty(selectedApplication) && selectedApplication != "All applications" && !string.Equals(entry.ApplicationName, selectedApplication, StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
string filter = filterTextBox.Text.Trim();
|
||||||
|
return filter.Length == 0 || DiagnosticLogFormatter.Format(entry).IndexOf(filter, StringComparison.OrdinalIgnoreCase) >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateApplicationFilter(IEnumerable<DiagnosticLogEntry> entries)
|
||||||
|
{
|
||||||
|
string selectedApplication = applicationComboBox.SelectedItem as string ?? "All applications";
|
||||||
|
List<string> applications = entries.Select(entry => entry.ApplicationName).Where(name => !string.IsNullOrWhiteSpace(name)).Distinct(StringComparer.OrdinalIgnoreCase).OrderBy(name => name).ToList();
|
||||||
|
List<string> currentApplications = applicationComboBox.Items.Cast<string>().Skip(1).ToList();
|
||||||
|
|
||||||
|
if (applications.SequenceEqual(currentApplications, StringComparer.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
loadingFilters = true;
|
||||||
|
applicationComboBox.BeginUpdate();
|
||||||
|
applicationComboBox.Items.Clear();
|
||||||
|
applicationComboBox.Items.Add("All applications");
|
||||||
|
applicationComboBox.Items.AddRange(applications.Cast<object>().ToArray());
|
||||||
|
applicationComboBox.SelectedItem = applicationComboBox.Items.Cast<string>().FirstOrDefault(item => string.Equals(item, selectedApplication, StringComparison.OrdinalIgnoreCase)) ?? "All applications";
|
||||||
|
applicationComboBox.EndUpdate();
|
||||||
|
loadingFilters = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateStatus(int storedCount)
|
||||||
|
{
|
||||||
|
int clients = connectedClientCountProvider?.Invoke() ?? 0;
|
||||||
|
receiverStatusLabel.Text = pauseButton.Checked ? $"Paused | Connected sources: {clients}" : $"Listening | Connected sources: {clients}";
|
||||||
|
countStatusLabel.Text = $"Received: {DiagnosticLogStore.Instance.TotalReceived:N0} | Stored: {storedCount:N0} | Visible: {visibleEntryCount:N0}";
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ScrollToEnd()
|
||||||
|
{
|
||||||
|
logView.Select(logView.TextLength, 0);
|
||||||
|
logView.ScrollToCaret();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void pauseButton_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
pauseButton.Text = pauseButton.Checked ? "Resume" : "Pause";
|
||||||
|
|
||||||
|
if (!pauseButton.Checked)
|
||||||
|
{
|
||||||
|
RefreshView(true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UpdateStatus(DiagnosticLogStore.Instance.GetSnapshot().Count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void refreshButton_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
RefreshView(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void clearButton_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
DiagnosticLogStore.Instance.Clear();
|
||||||
|
observedEntryCount = 0;
|
||||||
|
visibleEntryCount = 0;
|
||||||
|
RefreshView(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void saveButton_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
using (var dialog = new SaveFileDialog())
|
||||||
|
{
|
||||||
|
dialog.Filter = "Text files (*.txt)|*.txt|Log files (*.log)|*.log|All files (*.*)|*.*";
|
||||||
|
dialog.Title = "Save visible diagnostic logs";
|
||||||
|
dialog.DefaultExt = "log";
|
||||||
|
dialog.FileName = $"AppDiagnostic_{DateTime.Now:yyyyMMdd_HHmmss}.log";
|
||||||
|
|
||||||
|
if (dialog.ShowDialog(this) != DialogResult.OK)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
File.WriteAllText(dialog.FileName, logView.Text);
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
MessageBox.Show(this, $"Unable to save diagnostic logs: {exception.Message}", "Save error", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void copyButton_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
CopySelectionOrCurrentLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void copySelectionMenuItem_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (logView.SelectionLength > 0)
|
||||||
|
{
|
||||||
|
CopyText(logView.SelectedText);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void copyLineMenuItem_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
CopyCurrentLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void copyAllButton_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
CopyText(logView.Text);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CopySelectionOrCurrentLine()
|
||||||
|
{
|
||||||
|
if (logView.SelectionLength > 0)
|
||||||
|
{
|
||||||
|
CopyText(logView.SelectedText);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CopyCurrentLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CopyCurrentLine()
|
||||||
|
{
|
||||||
|
if (logView.Lines.Length == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int lineIndex = logView.GetLineFromCharIndex(logView.SelectionStart);
|
||||||
|
if (lineIndex >= 0 && lineIndex < logView.Lines.Length)
|
||||||
|
{
|
||||||
|
CopyText(logView.Lines[lineIndex]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CopyText(string text)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(text))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Clipboard.SetText(text);
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
MessageBox.Show(this, $"Unable to copy text: {exception.Message}", "Clipboard error", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void wrapButton_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
logView.WordWrap = wrapButton.Checked;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void alwaysOnTopButton_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
TopMost = alwaysOnTopButton.Checked;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void colorRulesButton_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
using (var editor = new ColorRuleEditorForm(colorRules))
|
||||||
|
{
|
||||||
|
if (editor.ShowDialog(this) != DialogResult.OK)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
colorRules = editor.Rules;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
LogColorRuleRepository.Save(colorRules);
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
MessageBox.Show(this, $"Unable to save color rules: {exception.Message}", "Settings error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
||||||
|
}
|
||||||
|
|
||||||
|
RefreshView(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void applyFilterButton_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
RefreshView(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void clearFilterButton_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
loadingFilters = true;
|
||||||
|
filterTextBox.Clear();
|
||||||
|
levelComboBox.SelectedIndex = 0;
|
||||||
|
applicationComboBox.SelectedIndex = 0;
|
||||||
|
loadingFilters = false;
|
||||||
|
RefreshView(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void filterValueChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (!loadingFilters)
|
||||||
|
{
|
||||||
|
RefreshView(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void filterTextBox_KeyDown(object sender, KeyEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.KeyCode == Keys.Enter)
|
||||||
|
{
|
||||||
|
RefreshView(true);
|
||||||
|
e.SuppressKeyPress = true;
|
||||||
|
}
|
||||||
|
else if (e.KeyCode == Keys.Escape)
|
||||||
|
{
|
||||||
|
clearFilterButton_Click(sender, EventArgs.Empty);
|
||||||
|
e.SuppressKeyPress = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void closeButton_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void MainForm_KeyDown(object sender, KeyEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.Control && e.KeyCode == Keys.F)
|
||||||
|
{
|
||||||
|
filterTextBox.Focus();
|
||||||
|
filterTextBox.SelectAll();
|
||||||
|
e.SuppressKeyPress = true;
|
||||||
|
}
|
||||||
|
else if (e.Control && e.KeyCode == Keys.S)
|
||||||
|
{
|
||||||
|
saveButton_Click(sender, EventArgs.Empty);
|
||||||
|
e.SuppressKeyPress = true;
|
||||||
|
}
|
||||||
|
else if (e.KeyCode == Keys.F5)
|
||||||
|
{
|
||||||
|
RefreshView(true);
|
||||||
|
e.SuppressKeyPress = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,120 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
</root>
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace AppDiagnostic
|
||||||
|
{
|
||||||
|
internal static class Program
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The main entry point for the application.
|
||||||
|
/// </summary>
|
||||||
|
[STAThread]
|
||||||
|
static void Main()
|
||||||
|
{
|
||||||
|
bool isFirstInstance;
|
||||||
|
|
||||||
|
using (var instanceMutex = new Mutex(true, "Sensus.AppDiagnostic.SingleInstance", out isFirstInstance))
|
||||||
|
using (var activationEvent = new EventWaitHandle(false, EventResetMode.AutoReset, "Sensus.AppDiagnostic.Activate"))
|
||||||
|
{
|
||||||
|
if (!isFirstInstance)
|
||||||
|
{
|
||||||
|
activationEvent.Set();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Application.EnableVisualStyles();
|
||||||
|
Application.SetCompatibleTextRenderingDefault(false);
|
||||||
|
|
||||||
|
using (var diagnosticServer = new DiagnosticPipeServer(DiagnosticLogStore.Instance.Add))
|
||||||
|
{
|
||||||
|
diagnosticServer.Start();
|
||||||
|
Application.Run(new MainForm(() => diagnosticServer.ConnectedClientCount, () => activationEvent.WaitOne(0)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// General Information about an assembly is controlled through the following
|
||||||
|
// set of attributes. Change these attribute values to modify the information
|
||||||
|
// associated with an assembly.
|
||||||
|
[assembly: AssemblyTitle("AppDiagnostic")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("AppDiagnostic")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © 2024")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// Setting ComVisible to false makes the types in this assembly not visible
|
||||||
|
// to COM components. If you need to access a type in this assembly from
|
||||||
|
// COM, set the ComVisible attribute to true on that type.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||||
|
[assembly: Guid("fa9abad1-7184-4295-ade8-d44f2e3de6b2")]
|
||||||
|
|
||||||
|
// Version information for an assembly consists of the following four values:
|
||||||
|
//
|
||||||
|
// Major Version
|
||||||
|
// Minor Version
|
||||||
|
// Build Number
|
||||||
|
// Revision
|
||||||
|
//
|
||||||
|
[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||||
+73
@@ -0,0 +1,73 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <auto-generated>
|
||||||
|
// This code was generated by a tool.
|
||||||
|
// Runtime Version:4.0.30319.42000
|
||||||
|
//
|
||||||
|
// Changes to this file may cause incorrect behavior and will be lost if
|
||||||
|
// the code is regenerated.
|
||||||
|
// </auto-generated>
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
namespace AppDiagnostic.Properties {
|
||||||
|
using System;
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||||
|
/// </summary>
|
||||||
|
// This class was auto-generated by the StronglyTypedResourceBuilder
|
||||||
|
// class via a tool like ResGen or Visual Studio.
|
||||||
|
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||||
|
// with the /str option, or rebuild your VS project.
|
||||||
|
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||||
|
internal class Resources {
|
||||||
|
|
||||||
|
private static global::System.Resources.ResourceManager resourceMan;
|
||||||
|
|
||||||
|
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||||
|
|
||||||
|
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||||
|
internal Resources() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the cached ResourceManager instance used by this class.
|
||||||
|
/// </summary>
|
||||||
|
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||||
|
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||||
|
get {
|
||||||
|
if (object.ReferenceEquals(resourceMan, null)) {
|
||||||
|
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AppDiagnostic.Properties.Resources", typeof(Resources).Assembly);
|
||||||
|
resourceMan = temp;
|
||||||
|
}
|
||||||
|
return resourceMan;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Overrides the current thread's CurrentUICulture property for all
|
||||||
|
/// resource lookups using this strongly typed resource class.
|
||||||
|
/// </summary>
|
||||||
|
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||||
|
internal static global::System.Globalization.CultureInfo Culture {
|
||||||
|
get {
|
||||||
|
return resourceCulture;
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
resourceCulture = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Icon TBF_icon {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("TBF_icon", resourceCulture);
|
||||||
|
return ((System.Drawing.Icon)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,124 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||||
|
<data name="TBF_icon" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\TBF_icon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
|
</root>
|
||||||
+30
@@ -0,0 +1,30 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <auto-generated>
|
||||||
|
// This code was generated by a tool.
|
||||||
|
// Runtime Version:4.0.30319.42000
|
||||||
|
//
|
||||||
|
// Changes to this file may cause incorrect behavior and will be lost if
|
||||||
|
// the code is regenerated.
|
||||||
|
// </auto-generated>
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
namespace AppDiagnostic.Properties
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||||
|
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
|
||||||
|
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
|
||||||
|
{
|
||||||
|
|
||||||
|
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
||||||
|
|
||||||
|
public static Settings Default
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return defaultInstance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
|
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
|
||||||
|
<Profiles>
|
||||||
|
<Profile Name="(Default)" />
|
||||||
|
</Profiles>
|
||||||
|
<Settings />
|
||||||
|
</SettingsFile>
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 64 KiB |
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<packages>
|
||||||
|
<package id="log4net" version="3.0.3" targetFramework="net472" />
|
||||||
|
</packages>
|
||||||
+17
-4
@@ -17,7 +17,7 @@
|
|||||||
<DebugType>full</DebugType>
|
<DebugType>full</DebugType>
|
||||||
<Optimize>false</Optimize>
|
<Optimize>false</Optimize>
|
||||||
<OutputPath>bin\Debug\</OutputPath>
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
<DefineConstants>TRACE;DEBUG</DefineConstants>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<WarningLevel>4</WarningLevel>
|
<WarningLevel>4</WarningLevel>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
@@ -30,9 +30,17 @@
|
|||||||
<WarningLevel>4</WarningLevel>
|
<WarningLevel>4</WarningLevel>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Reference Include="log4net, Version=2.0.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\log4net.2.0.15\lib\net45\log4net.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\NLog.5.2.2\lib\net46\NLog.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Configuration" />
|
||||||
<Reference Include="System.Core" />
|
<Reference Include="System.Core" />
|
||||||
<Reference Include="System.Drawing" />
|
<Reference Include="System.Drawing" />
|
||||||
|
<Reference Include="System.IO.Compression" />
|
||||||
<Reference Include="System.Windows.Forms" />
|
<Reference Include="System.Windows.Forms" />
|
||||||
<Reference Include="System.Xml.Linq" />
|
<Reference Include="System.Xml.Linq" />
|
||||||
<Reference Include="System.Data.DataSetExtensions" />
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
@@ -60,18 +68,21 @@
|
|||||||
<Compile Include="Forms\ModelessForm.designer.cs">
|
<Compile Include="Forms\ModelessForm.designer.cs">
|
||||||
<DependentUpon>ModelessForm.cs</DependentUpon>
|
<DependentUpon>ModelessForm.cs</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="Formulas.cs" />
|
||||||
|
<Compile Include="CurrentUser.cs" />
|
||||||
|
<Compile Include="GlobalData.cs" />
|
||||||
<Compile Include="IMeasurementCorrection.cs" />
|
<Compile Include="IMeasurementCorrection.cs" />
|
||||||
<Compile Include="IOrderInfo.cs" />
|
<Compile Include="IOrderInfo.cs" />
|
||||||
<Compile Include="IParamsProvider.cs" />
|
<Compile Include="IParamsProvider.cs" />
|
||||||
|
<Compile Include="Iperl\OptoTelegramRaw.cs" />
|
||||||
<Compile Include="IUncertainty.cs" />
|
<Compile Include="IUncertainty.cs" />
|
||||||
<Compile Include="IUser.cs" />
|
<Compile Include="IUser.cs" />
|
||||||
<Compile Include="Printers\PrintersCommon.cs">
|
<Compile Include="Printers\PrintersCommon.cs">
|
||||||
<SubType>Component</SubType>
|
<SubType>Component</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="QuitAppException.cs" />
|
<Compile Include="QuitAppException.cs" />
|
||||||
<Compile Include="StatisticalMetrics.cs" />
|
|
||||||
<Compile Include="Iperl\OptoTelegramRaw.cs" />
|
|
||||||
<Compile Include="SerializableDictionary.cs" />
|
<Compile Include="SerializableDictionary.cs" />
|
||||||
|
<Compile Include="StatisticalMetrics.cs" />
|
||||||
<Compile Include="Telegram.cs" />
|
<Compile Include="Telegram.cs" />
|
||||||
<Compile Include="UIControls\CoolButtonCtrl.cs">
|
<Compile Include="UIControls\CoolButtonCtrl.cs">
|
||||||
<SubType>UserControl</SubType>
|
<SubType>UserControl</SubType>
|
||||||
@@ -84,6 +95,9 @@
|
|||||||
<Compile Include="Utils.cs" />
|
<Compile Include="Utils.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="packages.config" />
|
||||||
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<EmbeddedResource Include="Forms\ListViewEx.resx">
|
<EmbeddedResource Include="Forms\ListViewEx.resx">
|
||||||
<DependentUpon>ListViewEx.cs</DependentUpon>
|
<DependentUpon>ListViewEx.cs</DependentUpon>
|
||||||
@@ -92,7 +106,6 @@
|
|||||||
<DependentUpon>ModelessForm.cs</DependentUpon>
|
<DependentUpon>ModelessForm.cs</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup />
|
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
Other similar extension points exist, see Microsoft.Common.targets.
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
|||||||
@@ -0,0 +1,132 @@
|
|||||||
|
///
|
||||||
|
/// Copyright (c) 2021-2022 Sensus Slovensko a.s.
|
||||||
|
///
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace Common
|
||||||
|
{
|
||||||
|
class UserAndForm
|
||||||
|
{
|
||||||
|
public readonly IUser User;
|
||||||
|
public readonly Form Form;
|
||||||
|
|
||||||
|
public UserAndForm(IUser user, Form form)
|
||||||
|
{
|
||||||
|
User = user;
|
||||||
|
Form = form;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class CurrentUser
|
||||||
|
{
|
||||||
|
public const string AdminUsername = "admin";
|
||||||
|
public const string AdminPassword = "staratura";
|
||||||
|
|
||||||
|
public static int MinPasswdLength = 0;
|
||||||
|
public static int PasswdExpirationPeriodDays = 0;
|
||||||
|
|
||||||
|
public static DBSettings RemoteUsersDB = null;
|
||||||
|
public static DBSettings LocalUsersDB = null;
|
||||||
|
|
||||||
|
|
||||||
|
static readonly Stack<UserAndForm> userStack = new Stack<UserAndForm>();
|
||||||
|
|
||||||
|
public static Common.AuthorizedAs AuthorizedAs;
|
||||||
|
public static DateTime LastAuthorization = DateTime.Now;
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Push a new user into the stack of users and form references.
|
||||||
|
/// Prevent double user stack entry for the same Windows form.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="newUser">New user</param>
|
||||||
|
/// <param name="currentForm">Reference to the current form</param>
|
||||||
|
public static void Change(IUser newUser, Form currentForm)
|
||||||
|
{
|
||||||
|
if (userStack.Count > 0 && userStack.Peek().Form == currentForm)
|
||||||
|
{
|
||||||
|
userStack.Pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
userStack.Push(new UserAndForm(newUser, currentForm));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Restore an original user from the stack of users - remove user at the top of the stack.
|
||||||
|
/// Prevent restoring when there is no entry for the form currently being closed.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="formBeingClosed">Reference to the form currently being closed</param>
|
||||||
|
/// <returns>true = current user was restored, false = no current user change</returns>
|
||||||
|
public static bool Restore(Form formBeingClosed)
|
||||||
|
{
|
||||||
|
if (userStack.Count > 0 && userStack.Peek().Form == formBeingClosed)
|
||||||
|
{
|
||||||
|
userStack.Pop();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return the user currenty at the top of the stack of users.
|
||||||
|
/// </summary>
|
||||||
|
public static IUser User()
|
||||||
|
{
|
||||||
|
return (userStack.Count > 0) ? userStack.Peek().User : null; /// TODO: Return default user when stack is empty
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IUser User2;
|
||||||
|
public static IUser User3;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return the current user name or an empty string
|
||||||
|
/// </summary>
|
||||||
|
public static string UserName()
|
||||||
|
{
|
||||||
|
if (User() == null || User().UserName == null)
|
||||||
|
return string.Empty;
|
||||||
|
else if (User2 == null || User2.UserName == null)
|
||||||
|
return User().UserName;
|
||||||
|
else if (User3 == null || User3.UserName == null)
|
||||||
|
return string.Format("{0},{1}", User().UserName, User2.UserName);
|
||||||
|
else
|
||||||
|
return string.Format("{0},{1},{2}", User().UserName, User2.UserName, User3.UserName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string GetEncodedString(string legalizator)
|
||||||
|
{
|
||||||
|
if (User() == null || User().UserName == null) return string.Empty;
|
||||||
|
return string.Format("{0}~{1}~{2}",
|
||||||
|
User().UserName,
|
||||||
|
User().FullName == null ? string.Empty : User().FullName,
|
||||||
|
legalizator == null ? string.Empty : legalizator);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return the current user number or 0
|
||||||
|
/// </summary>
|
||||||
|
public static int Number()
|
||||||
|
{
|
||||||
|
return (User() != null) ? User().Number : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool IsPowerUser()
|
||||||
|
{
|
||||||
|
return (User() != null) ? User().IsPowerUser() : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool IsMemberOf(GID groupId)
|
||||||
|
{
|
||||||
|
return (User() != null) ? User().IsMemberOf(groupId) : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool IsMemberOf(GID[] groupIds)
|
||||||
|
{
|
||||||
|
return (User() != null) ? User().IsMemberOf(groupIds) : (groupIds == null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+85
-40
@@ -1,9 +1,10 @@
|
|||||||
///
|
///
|
||||||
/// Copyright (c) 2013-2022 Sensus Slovensko a.s.
|
/// Copyright (c) 2013-2023 Sensus Slovensko a.s.
|
||||||
///
|
///
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
namespace Common
|
namespace Common
|
||||||
{
|
{
|
||||||
@@ -76,44 +77,6 @@ namespace Common
|
|||||||
Count
|
Count
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Obsolete - replaced by enum ProcedureSelection (above) in 3.1 and newer
|
|
||||||
/// </summary>
|
|
||||||
public enum RemoteDBUse
|
|
||||||
{
|
|
||||||
[Description("Local DB only")] LocalDBOnly,
|
|
||||||
[Description("Remote DB only")] RemoteDBOnly,
|
|
||||||
[Description("Both DB-s, local 1st")] BothDBsLocalFirst,
|
|
||||||
[Description("Both DB-s, remote 1st")] BothDBsRemoteFirst,
|
|
||||||
Count
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Obsolete - Contains a procedure name and a database specification (local/remote).
|
|
||||||
/// </summary>
|
|
||||||
public class ProcedureInfo
|
|
||||||
{
|
|
||||||
public readonly string Name;
|
|
||||||
public readonly bool IsRemote;
|
|
||||||
|
|
||||||
public ProcedureInfo(string name, bool isRemote)
|
|
||||||
{
|
|
||||||
Name = name;
|
|
||||||
IsRemote = isRemote;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Test designation mode for IperlLogger and IperlHead opto data files
|
|
||||||
/// </summary>
|
|
||||||
public enum DesigMode
|
|
||||||
{
|
|
||||||
Auto,
|
|
||||||
Based_on_procedure,
|
|
||||||
As_specified,
|
|
||||||
Count
|
|
||||||
}
|
|
||||||
|
|
||||||
public enum LoginMethod
|
public enum LoginMethod
|
||||||
{
|
{
|
||||||
UserName, /// = alias, abbreviation
|
UserName, /// = alias, abbreviation
|
||||||
@@ -223,16 +186,70 @@ namespace Common
|
|||||||
Count,
|
Count,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum FlowNames
|
||||||
|
{
|
||||||
|
QnQtQmin = 0,
|
||||||
|
Q3Q2Q1 = 1,
|
||||||
|
QpQi = 2,
|
||||||
|
Count,
|
||||||
|
}
|
||||||
|
|
||||||
public enum ProfileType
|
public enum ProfileType
|
||||||
{
|
{
|
||||||
Q3R,
|
Q3R,
|
||||||
QnClassColdWater,
|
QnClassColdWater,
|
||||||
QnClassHotWater,
|
QnClassHotWater,
|
||||||
QpQi,
|
QpQi,
|
||||||
|
CompoundQ3RQ3R,
|
||||||
|
CompoundQnClassQnClass,
|
||||||
|
CompoundQ3RQnClass,
|
||||||
|
CompoundQnClassQ3R,
|
||||||
|
CompoundQpQiQpQi,
|
||||||
Manual,
|
Manual,
|
||||||
Count,
|
Count,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum FlowId
|
||||||
|
{
|
||||||
|
Any,
|
||||||
|
Q4,
|
||||||
|
Q3,
|
||||||
|
Q2,
|
||||||
|
Q1,
|
||||||
|
Q4Main,
|
||||||
|
Q3Main,
|
||||||
|
Q2Main,
|
||||||
|
Q1Main,
|
||||||
|
Q4Aux,
|
||||||
|
Q3Aux,
|
||||||
|
Q2Aux,
|
||||||
|
Q1Aux,
|
||||||
|
Qmax,
|
||||||
|
Qn,
|
||||||
|
Qt,
|
||||||
|
Qmin,
|
||||||
|
QmaxMain,
|
||||||
|
QnMain,
|
||||||
|
QtMain,
|
||||||
|
QminMain,
|
||||||
|
QmaxAux,
|
||||||
|
QnAux,
|
||||||
|
QtAux,
|
||||||
|
QminAux,
|
||||||
|
Qp,
|
||||||
|
Qp10,
|
||||||
|
Qi,
|
||||||
|
QpMain,
|
||||||
|
Qp10Main,
|
||||||
|
QiMain,
|
||||||
|
QpAux,
|
||||||
|
Qp10Aux,
|
||||||
|
QiAux,
|
||||||
|
Qdetected,
|
||||||
|
Qfall,
|
||||||
|
Qrise,
|
||||||
|
}
|
||||||
|
|
||||||
public enum ErrorLimitType
|
public enum ErrorLimitType
|
||||||
{
|
{
|
||||||
Manual,
|
Manual,
|
||||||
@@ -273,10 +290,19 @@ namespace Common
|
|||||||
CompoundAux,
|
CompoundAux,
|
||||||
Compound,
|
Compound,
|
||||||
HeatMeterVolume,
|
HeatMeterVolume,
|
||||||
|
HeatMeterMass,//...MF
|
||||||
HeatMeterEnergy,
|
HeatMeterEnergy,
|
||||||
SingleOrCompound, /// Only used when querying results
|
SingleOrCompound, /// Only used when querying results
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum PulsesTypeByQuantity : short
|
||||||
|
{
|
||||||
|
[Description("dm3")] Volume_dm3,
|
||||||
|
[Description("kg")] Mass_kg,
|
||||||
|
|
||||||
|
Count
|
||||||
|
}
|
||||||
|
|
||||||
public enum Medium
|
public enum Medium
|
||||||
{
|
{
|
||||||
[Description("")] NotSpecified,
|
[Description("")] NotSpecified,
|
||||||
@@ -342,7 +368,6 @@ namespace Common
|
|||||||
[Description("")] NotSpecified,
|
[Description("")] NotSpecified,
|
||||||
[Description("U0")] U0, /// ?
|
[Description("U0")] U0, /// ?
|
||||||
[Description("D0")] D0, /// ?
|
[Description("D0")] D0, /// ?
|
||||||
///
|
|
||||||
Count
|
Count
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -505,8 +530,10 @@ namespace Common
|
|||||||
public enum TestProfile
|
public enum TestProfile
|
||||||
{
|
{
|
||||||
UserDefined,
|
UserDefined,
|
||||||
|
UserDefinedCompound,
|
||||||
UserDefinedHeatMeter,
|
UserDefinedHeatMeter,
|
||||||
Protected, /// The first protected one
|
Protected, /// The first protected one
|
||||||
|
ProtectedCompound,
|
||||||
ProtectedHeatMeter,
|
ProtectedHeatMeter,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -681,6 +708,15 @@ namespace Common
|
|||||||
Count,
|
Count,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum DivResolution : int
|
||||||
|
{
|
||||||
|
[Description("1 ms (0.25 s)")] _1ms = 0,
|
||||||
|
[Description("2 ms (0.5 s)")] _2ms = 1,
|
||||||
|
[Description("4 ms (1 s)")] _4ms = 2,
|
||||||
|
[Description("8 ms (2 s)")] _8ms = 3,
|
||||||
|
Count,
|
||||||
|
}
|
||||||
|
|
||||||
public enum ImageRotation
|
public enum ImageRotation
|
||||||
{
|
{
|
||||||
[Description("0 deg")] None,
|
[Description("0 deg")] None,
|
||||||
@@ -803,6 +839,15 @@ namespace Common
|
|||||||
E63 = (1L << 62),
|
E63 = (1L << 62),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//...MF
|
||||||
|
public enum FlowType : int
|
||||||
|
{
|
||||||
|
none,
|
||||||
|
volume,
|
||||||
|
mass,
|
||||||
|
Count,
|
||||||
|
}
|
||||||
|
|
||||||
#region iPERL enums
|
#region iPERL enums
|
||||||
|
|
||||||
public enum Side
|
public enum Side
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
using System;
|
///
|
||||||
|
/// Copyright (c) 2021-2023 Sensus Slovensko a.s.
|
||||||
|
///
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace Common.Forms
|
namespace Common.Forms
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
using System;
|
///
|
||||||
|
/// Copyright (c) 2021-2023 Sensus Slovensko a.s.
|
||||||
|
///
|
||||||
|
using System;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
|
||||||
@@ -53,20 +56,20 @@ namespace Common.Forms
|
|||||||
public event EventHandler<MessageEventArgs> UpdateMessageHandler;
|
public event EventHandler<MessageEventArgs> UpdateMessageHandler;
|
||||||
void OnUpdateMessage(object sender, MessageEventArgs args)
|
void OnUpdateMessage(object sender, MessageEventArgs args)
|
||||||
{
|
{
|
||||||
if (args.Message != null) label1.Text = args.Message;
|
if (args != null && args.Message != null) label1.Text = args.Message;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Called from the state machine when an operation forces a modeless dialog close.
|
/// Called from the state machine when an operation forces a modeless dialog close.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static void CloseForm()
|
public void CloseForm()
|
||||||
{
|
{
|
||||||
if (CloseFormHandler == null) return;
|
if (CloseFormHandler == null) return;
|
||||||
try { CloseFormHandler(null, null); }
|
try { CloseFormHandler(null, null); }
|
||||||
catch (Exception) { }
|
catch (Exception) { }
|
||||||
}
|
}
|
||||||
static public event EventHandler<EventArgs> CloseFormHandler;
|
public event EventHandler<EventArgs> CloseFormHandler;
|
||||||
void OnCloseForm(object sender, EventArgs args)
|
void OnCloseForm(object sender, EventArgs args)
|
||||||
{
|
{
|
||||||
DialogResult = DialogResult.Cancel;
|
DialogResult = DialogResult.Cancel;
|
||||||
|
|||||||
+2
-2
@@ -213,9 +213,9 @@ namespace Common
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static double ErrorFromVolumes(double measuredVolume, double trueVolume)
|
public static double ErrorFromVolumes(double measuredVolume, double trueVolume)
|
||||||
{
|
{
|
||||||
if (trueVolume <= float.Epsilon)
|
if (Math.Abs(trueVolume) <= float.Epsilon)
|
||||||
{
|
{
|
||||||
if (measuredVolume <= float.Epsilon)
|
if (Math.Abs(measuredVolume) <= float.Epsilon)
|
||||||
{
|
{
|
||||||
log.WarnFormat("ErrorFromVolumes({0},{1}) returns {2}", measuredVolume, trueVolume, -100.0);
|
log.WarnFormat("ErrorFromVolumes({0},{1}) returns {2}", measuredVolume, trueVolume, -100.0);
|
||||||
return -100.0;
|
return -100.0;
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
///
|
||||||
|
/// Copyright (c) 2021 Sensus Slovensko a.s.
|
||||||
|
///
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Common
|
||||||
|
{
|
||||||
|
public static class GlobalData
|
||||||
|
{
|
||||||
|
public static double SampleDensity = 0; /// sample water density measured in an accredited labo [kg/m3]
|
||||||
|
public static double SampleTemp = 0; /// sample temperature when density measured in an accredited labo [°C]
|
||||||
|
public static double Buoyancy = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,6 +10,7 @@ namespace Common
|
|||||||
int Number { get; }
|
int Number { get; }
|
||||||
|
|
||||||
/// Access rights
|
/// Access rights
|
||||||
|
bool IsPowerUser();
|
||||||
bool IsMemberOf(GID group);
|
bool IsMemberOf(GID group);
|
||||||
bool IsMemberOf(GID[] groups);
|
bool IsMemberOf(GID[] groups);
|
||||||
bool IsCorrectPassword(string password);
|
bool IsCorrectPassword(string password);
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ namespace Common.Iperl
|
|||||||
public double Flow(double scalingFactor) { return 0.225 * scalingFactor * (double)FlowRaw; }
|
public double Flow(double scalingFactor) { return 0.225 * scalingFactor * (double)FlowRaw; }
|
||||||
public double Volume(double scalingFactor) { return 0.0000625 * scalingFactor * (double)VolumeRawExt; }
|
public double Volume(double scalingFactor) { return 0.0000625 * scalingFactor * (double)VolumeRawExt; }
|
||||||
public Int32 FlipTime() { return Impedance; }
|
public Int32 FlipTime() { return Impedance; }
|
||||||
public decimal TimestampDec() { return (decimal)TimestampExt / (decimal)8192; }
|
public decimal TimestampDec() { return (decimal)TimestampExt; }
|
||||||
public double VolumeDelta(double scalingFactor, OptoTelegramRaw previous) { return (previous == null) ? 0 : Volume(scalingFactor) - previous.Volume(scalingFactor); }
|
public double VolumeDelta(double scalingFactor, OptoTelegramRaw previous) { return (previous == null) ? 0 : Volume(scalingFactor) - previous.Volume(scalingFactor); }
|
||||||
public decimal TimeDelta() { return TimestampDec() - TestStartTimestampDec; }
|
public decimal TimeDelta() { return TimestampDec() - TestStartTimestampDec; }
|
||||||
public string Label()
|
public string Label()
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ using System.Runtime.InteropServices;
|
|||||||
[assembly: AssemblyConfiguration("")]
|
[assembly: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("")]
|
[assembly: AssemblyCompany("")]
|
||||||
[assembly: AssemblyProduct("Common")]
|
[assembly: AssemblyProduct("Common")]
|
||||||
[assembly: AssemblyCopyright("Copyright © 2020-2022")]
|
[assembly: AssemblyCopyright("Copyright © 2020")]
|
||||||
[assembly: AssemblyTrademark("")]
|
[assembly: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
|||||||
+127
-19
@@ -2,6 +2,7 @@
|
|||||||
/// Copyright (c) 2016-2021 Sensus Slovensko a.s.
|
/// Copyright (c) 2016-2021 Sensus Slovensko a.s.
|
||||||
///
|
///
|
||||||
using System;
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
namespace Common
|
namespace Common
|
||||||
{
|
{
|
||||||
@@ -33,6 +34,20 @@ namespace Common
|
|||||||
[Description("m3/m")] m3pm, /// 1 m3/m = 60 m3/h
|
[Description("m3/m")] m3pm, /// 1 m3/m = 60 m3/h
|
||||||
[Description("cf/s")] cfs, /// 1 cubic foot per second = 101.9406477312 m3/h
|
[Description("cf/s")] cfs, /// 1 cubic foot per second = 101.9406477312 m3/h
|
||||||
|
|
||||||
|
|
||||||
|
[Description("g/s")] gps, /// 1 g/s = 0.0036 t/h
|
||||||
|
[Description("g/min")] gpm, /// 1 g/min = 0.00006 t/h
|
||||||
|
[Description("g/h")] gph, /// 1 g/h = 0.000001 t/h
|
||||||
|
[Description("kg/s")] kgps, /// 1 kg/s = 3.6 t/h
|
||||||
|
[Description("kg/min")] kgpm, /// 1 kg/min = 0.06 t/h
|
||||||
|
[Description("kg/h")] kgph, /// 1 kg/h = 0.001 t/h
|
||||||
|
[Description("t/s")] tps, /// 1 t/s = 3600 t/h
|
||||||
|
[Description("t/min")] tpm, /// 1 t/min = 60 t/h
|
||||||
|
[Description("t/h")] tph, /// 1 t/h = 1 t/h
|
||||||
|
[Description("lb/s")] lbps, /// 1 lb/s ≈ 1.633 t/h
|
||||||
|
[Description("lb/min")] lbpm, /// 1 lb/min ≈ 0.027216 t/h
|
||||||
|
[Description("lb/h")] lbph, /// 1 lb/h ≈ 0.0004536 t/h
|
||||||
|
|
||||||
[Description("g")] g, /// 0.001 kg
|
[Description("g")] g, /// 0.001 kg
|
||||||
[Description("oz")] oz, /// 0.0283495231 kg
|
[Description("oz")] oz, /// 0.0283495231 kg
|
||||||
[Description("lb")] lb, /// 0.45359237 kg
|
[Description("lb")] lb, /// 0.45359237 kg
|
||||||
@@ -106,6 +121,14 @@ namespace Common
|
|||||||
[Description("pulse/kWh")] ppkWh, /// * 1 pulse/kWh
|
[Description("pulse/kWh")] ppkWh, /// * 1 pulse/kWh
|
||||||
[Description("kWh/pulse")] kWhpp, /// 1 kWh/pulse
|
[Description("kWh/pulse")] kWhpp, /// 1 kWh/pulse
|
||||||
|
|
||||||
|
///
|
||||||
|
[Description("A")] A, /// *1 A
|
||||||
|
[Description("mA")] mA, /// 1 mA = 0.001 A
|
||||||
|
///
|
||||||
|
[Description("V")] V, /// *1 V
|
||||||
|
[Description("mV")] mV, /// 1 mV = 0.001 V
|
||||||
|
|
||||||
|
|
||||||
Count
|
Count
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -135,6 +158,8 @@ namespace Common
|
|||||||
[Description("Boolean")] Boolean,
|
[Description("Boolean")] Boolean,
|
||||||
[Description("Datum und Uhrzeit")] DateTime,
|
[Description("Datum und Uhrzeit")] DateTime,
|
||||||
[Description("Aufgezählt")] Enumerated,
|
[Description("Aufgezählt")] Enumerated,
|
||||||
|
[Description("Strom")] Current,
|
||||||
|
[Description("Spannung")] Voltage,
|
||||||
#elif LANG_PL
|
#elif LANG_PL
|
||||||
[Description("Objętość")] Volume,
|
[Description("Objętość")] Volume,
|
||||||
[Description("Przepływ")] Flow,
|
[Description("Przepływ")] Flow,
|
||||||
@@ -158,6 +183,8 @@ namespace Common
|
|||||||
[Description("Boolean")] Boolean,
|
[Description("Boolean")] Boolean,
|
||||||
[Description("Data i czas")] DateTime,
|
[Description("Data i czas")] DateTime,
|
||||||
[Description("Wyliczone")] Enumerated,
|
[Description("Wyliczone")] Enumerated,
|
||||||
|
[Description("Prąd")] Current,
|
||||||
|
[Description("Napięcie")] Voltage,
|
||||||
#elif LANG_CS
|
#elif LANG_CS
|
||||||
[Description("Objem")] Volume,
|
[Description("Objem")] Volume,
|
||||||
[Description("Průtok")] Flow,
|
[Description("Průtok")] Flow,
|
||||||
@@ -181,6 +208,8 @@ namespace Common
|
|||||||
[Description("Boolean")] Boolean,
|
[Description("Boolean")] Boolean,
|
||||||
[Description("Datum a čas")] DateTime,
|
[Description("Datum a čas")] DateTime,
|
||||||
[Description("Vyjmenované")] Enumerated,
|
[Description("Vyjmenované")] Enumerated,
|
||||||
|
[Description("Proud")] Current,
|
||||||
|
[Description("Napětí")] Voltage,
|
||||||
#elif LANG_IT
|
#elif LANG_IT
|
||||||
[Description("Volume")] Volume,
|
[Description("Volume")] Volume,
|
||||||
[Description("Flusso")] Flow,
|
[Description("Flusso")] Flow,
|
||||||
@@ -204,9 +233,15 @@ namespace Common
|
|||||||
[Description("Boolean")] Boolean,
|
[Description("Boolean")] Boolean,
|
||||||
[Description("Data e ora")] DateTime,
|
[Description("Data e ora")] DateTime,
|
||||||
[Description("Enumerato")] Enumerated,
|
[Description("Enumerato")] Enumerated,
|
||||||
|
[Description("Corrente")] Current,
|
||||||
|
[Description("Voltaggio")] Voltage,
|
||||||
#else
|
#else
|
||||||
|
[Description("RegisterReader")] RegisterReader,
|
||||||
|
[Description("MultiFunctionalVariables")] MultiFunctionalVariables,
|
||||||
|
[Description("VolumeFlow")] VolumeFlow,
|
||||||
[Description("Volume")] Volume,
|
[Description("Volume")] Volume,
|
||||||
[Description("Flow")] Flow,
|
[Description("Flow")] Flow,
|
||||||
|
[Description("MassFlow")] MassFlow,
|
||||||
[Description("Mass")] Mass,
|
[Description("Mass")] Mass,
|
||||||
[Description("Time")] Time,
|
[Description("Time")] Time,
|
||||||
[Description("Temperature")] Temperature,
|
[Description("Temperature")] Temperature,
|
||||||
@@ -218,6 +253,8 @@ namespace Common
|
|||||||
[Description("Energy")] Energy,
|
[Description("Energy")] Energy,
|
||||||
[Description("Pulses")] Pulses,
|
[Description("Pulses")] Pulses,
|
||||||
[Description("Pulses/liter")] PulsePerLtr,
|
[Description("Pulses/liter")] PulsePerLtr,
|
||||||
|
[Description("Pulses/kg")] PulsePerKilogram, //...MF
|
||||||
|
[Description("Pulses/Unit")] PulsePerUnit,//...MF
|
||||||
[Description("Pulses/kWh")] PulsePerKWh,
|
[Description("Pulses/kWh")] PulsePerKWh,
|
||||||
[Description("Conductivity")] Conductivity,
|
[Description("Conductivity")] Conductivity,
|
||||||
|
|
||||||
@@ -227,6 +264,8 @@ namespace Common
|
|||||||
[Description("Boolean")] Boolean,
|
[Description("Boolean")] Boolean,
|
||||||
[Description("Date and time")] DateTime,
|
[Description("Date and time")] DateTime,
|
||||||
[Description("Enumerated")] Enumerated,
|
[Description("Enumerated")] Enumerated,
|
||||||
|
[Description("Current")] Current,
|
||||||
|
[Description("Voltage")] Voltage,
|
||||||
#endif
|
#endif
|
||||||
Count,
|
Count,
|
||||||
}
|
}
|
||||||
@@ -242,59 +281,103 @@ namespace Common
|
|||||||
{
|
{
|
||||||
return unit == Unit.l || unit == Unit.m3ph || unit == Unit.kg || unit == Unit.s || unit == Unit.C ||
|
return unit == Unit.l || unit == Unit.m3ph || unit == Unit.kg || unit == Unit.s || unit == Unit.C ||
|
||||||
unit == Unit.bar || unit == Unit.RPct || unit == Unit.Pct || unit == Unit.mm || unit == Unit.kgpm3 ||
|
unit == Unit.bar || unit == Unit.RPct || unit == Unit.Pct || unit == Unit.mm || unit == Unit.kgpm3 ||
|
||||||
unit == Unit.J || unit == Unit.uSpcm || unit == Unit.ppl || unit == Unit.ppkWh;
|
unit == Unit.J || unit == Unit.uSpcm || unit == Unit.ppl || unit == Unit.ppkWh || unit == Unit.A ||
|
||||||
|
unit == Unit.V;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool IsQuantity(Unit unit, Quantity quantity)
|
public static bool IsQuantity(Unit unit, Quantity quantity)
|
||||||
{
|
{
|
||||||
return (quantity == GetQuantity(unit));
|
return GetQuantity(unit).Contains(quantity);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Quantity GetQuantity(Unit unit)
|
public static Quantity[] GetQuantity(Unit unit)
|
||||||
{
|
{
|
||||||
switch (unit)
|
switch (unit)
|
||||||
{
|
{
|
||||||
case Unit.pulse:
|
case Unit.pulse:
|
||||||
case Unit.degree:
|
case Unit.degree:
|
||||||
return Quantity.Pulses;
|
return new[] { Quantity.Pulses };
|
||||||
|
|
||||||
case Unit.ml:
|
case Unit.ml:
|
||||||
|
return new[] { Quantity.Volume, Quantity.MultiFunctionalVariables };
|
||||||
case Unit.l:
|
case Unit.l:
|
||||||
|
return new[] { Quantity.Volume, Quantity.MultiFunctionalVariables };
|
||||||
case Unit.dm3:
|
case Unit.dm3:
|
||||||
|
return new[] { Quantity.Volume, Quantity.MultiFunctionalVariables };
|
||||||
case Unit.USgal:
|
case Unit.USgal:
|
||||||
|
return new[] { Quantity.Volume, Quantity.MultiFunctionalVariables };
|
||||||
case Unit.UKgal:
|
case Unit.UKgal:
|
||||||
|
return new[] { Quantity.Volume, Quantity.MultiFunctionalVariables };
|
||||||
case Unit.cf:
|
case Unit.cf:
|
||||||
|
return new[] { Quantity.Volume, Quantity.MultiFunctionalVariables };
|
||||||
case Unit.m3:
|
case Unit.m3:
|
||||||
return Quantity.Volume;
|
return new[] { Quantity.Volume, Quantity.MultiFunctionalVariables };
|
||||||
|
|
||||||
case Unit.lph:
|
case Unit.lph:
|
||||||
|
return new[] { Quantity.Flow };
|
||||||
case Unit.cfph:
|
case Unit.cfph:
|
||||||
|
return new[] { Quantity.Flow };
|
||||||
case Unit.lpm:
|
case Unit.lpm:
|
||||||
|
return new[] { Quantity.Flow };
|
||||||
case Unit.USgalpm:
|
case Unit.USgalpm:
|
||||||
|
return new[] { Quantity.Flow };
|
||||||
case Unit.m3ph:
|
case Unit.m3ph:
|
||||||
|
return new[] { Quantity.Flow };
|
||||||
case Unit.lps:
|
case Unit.lps:
|
||||||
|
return new[] { Quantity.Flow };
|
||||||
case Unit.USgalps:
|
case Unit.USgalps:
|
||||||
|
return new[] { Quantity.Flow };
|
||||||
case Unit.m3pm:
|
case Unit.m3pm:
|
||||||
|
return new[] { Quantity.Flow };
|
||||||
case Unit.cfs:
|
case Unit.cfs:
|
||||||
return Quantity.Flow;
|
return new[] { Quantity.Flow };
|
||||||
|
|
||||||
|
case Unit.gps:
|
||||||
|
return new[] { Quantity.MassFlow};
|
||||||
|
case Unit.gpm:
|
||||||
|
return new[] { Quantity.MassFlow};
|
||||||
|
case Unit.gph:
|
||||||
|
return new[] { Quantity.MassFlow};
|
||||||
|
case Unit.kgps:
|
||||||
|
return new[] { Quantity.MassFlow};
|
||||||
|
case Unit.kgpm:
|
||||||
|
return new[] { Quantity.MassFlow};
|
||||||
|
case Unit.kgph:
|
||||||
|
return new[] { Quantity.MassFlow};
|
||||||
|
case Unit.tps:
|
||||||
|
return new[] { Quantity.MassFlow};
|
||||||
|
case Unit.tpm:
|
||||||
|
return new[] { Quantity.MassFlow};
|
||||||
|
case Unit.tph:
|
||||||
|
return new[] { Quantity.MassFlow};
|
||||||
|
case Unit.lbps:
|
||||||
|
return new[] { Quantity.MassFlow};
|
||||||
|
case Unit.lbpm:
|
||||||
|
return new[] { Quantity.MassFlow};
|
||||||
|
case Unit.lbph:
|
||||||
|
return new[] { Quantity.MassFlow};
|
||||||
|
|
||||||
case Unit.g:
|
case Unit.g:
|
||||||
|
return new[] { Quantity.Mass, Quantity.MultiFunctionalVariables };
|
||||||
case Unit.oz:
|
case Unit.oz:
|
||||||
|
return new[] { Quantity.Mass, Quantity.MultiFunctionalVariables };
|
||||||
case Unit.lb:
|
case Unit.lb:
|
||||||
|
return new[] { Quantity.Mass, Quantity.MultiFunctionalVariables };
|
||||||
case Unit.kg:
|
case Unit.kg:
|
||||||
|
return new[] { Quantity.Mass, Quantity.MultiFunctionalVariables };
|
||||||
case Unit.t:
|
case Unit.t:
|
||||||
return Quantity.Mass;
|
return new[] { Quantity.Mass, Quantity.MultiFunctionalVariables };
|
||||||
|
|
||||||
case Unit.ms:
|
case Unit.ms:
|
||||||
case Unit.s:
|
case Unit.s:
|
||||||
case Unit.min:
|
case Unit.min:
|
||||||
case Unit.hour:
|
case Unit.hour:
|
||||||
return Quantity.Time;
|
return new[] { Quantity.Time };
|
||||||
|
|
||||||
case Unit.C:
|
case Unit.C:
|
||||||
case Unit.F:
|
case Unit.F:
|
||||||
case Unit.K:
|
case Unit.K:
|
||||||
return Quantity.Temperature;
|
return new[] { Quantity.Temperature };
|
||||||
|
|
||||||
case Unit.Pa:
|
case Unit.Pa:
|
||||||
case Unit.hPa:
|
case Unit.hPa:
|
||||||
@@ -304,14 +387,14 @@ namespace Common
|
|||||||
case Unit.psi:
|
case Unit.psi:
|
||||||
case Unit.bar:
|
case Unit.bar:
|
||||||
case Unit.MPa:
|
case Unit.MPa:
|
||||||
return Quantity.Pressure;
|
return new[] { Quantity.Pressure };
|
||||||
|
|
||||||
case Unit.RPct:
|
case Unit.RPct:
|
||||||
return Quantity.Humidity;
|
return new[] { Quantity.Humidity };
|
||||||
|
|
||||||
case Unit.Promile:
|
case Unit.Promile:
|
||||||
case Unit.Pct:
|
case Unit.Pct:
|
||||||
return Quantity.Error;
|
return new[] { Quantity.Error };
|
||||||
|
|
||||||
case Unit.mm:
|
case Unit.mm:
|
||||||
case Unit.cm:
|
case Unit.cm:
|
||||||
@@ -320,11 +403,11 @@ namespace Common
|
|||||||
case Unit.foot:
|
case Unit.foot:
|
||||||
case Unit.yard:
|
case Unit.yard:
|
||||||
case Unit.m:
|
case Unit.m:
|
||||||
return Quantity.Length;
|
return new[] { Quantity.Length };
|
||||||
|
|
||||||
case Unit.kgpm3:
|
case Unit.kgpm3:
|
||||||
case Unit.kgpl:
|
case Unit.kgpl:
|
||||||
return Quantity.Density;
|
return new[] { Quantity.Density };
|
||||||
|
|
||||||
case Unit.J:
|
case Unit.J:
|
||||||
case Unit.kJ:
|
case Unit.kJ:
|
||||||
@@ -332,11 +415,11 @@ namespace Common
|
|||||||
case Unit.Wh:
|
case Unit.Wh:
|
||||||
case Unit.kWh:
|
case Unit.kWh:
|
||||||
case Unit.MWh:
|
case Unit.MWh:
|
||||||
return Quantity.Energy;
|
return new[] { Quantity.Energy };
|
||||||
|
|
||||||
case Unit.uSpcm:
|
case Unit.uSpcm:
|
||||||
case Unit.mSpm:
|
case Unit.mSpm:
|
||||||
return Quantity.Conductivity;
|
return new[] { Quantity.Conductivity };
|
||||||
|
|
||||||
case Unit.ppl:
|
case Unit.ppl:
|
||||||
case Unit.ppdm3:
|
case Unit.ppdm3:
|
||||||
@@ -346,19 +429,29 @@ namespace Common
|
|||||||
case Unit.dm3pp:
|
case Unit.dm3pp:
|
||||||
case Unit.lpdeg:
|
case Unit.lpdeg:
|
||||||
case Unit.dm3pdeg:
|
case Unit.dm3pdeg:
|
||||||
return Quantity.PulsePerLtr;
|
return new[] { Quantity.PulsePerLtr };
|
||||||
|
|
||||||
case Unit.ppkWh:
|
case Unit.ppkWh:
|
||||||
case Unit.kWhpp:
|
case Unit.kWhpp:
|
||||||
return Quantity.PulsePerKWh;
|
return new[] { Quantity.PulsePerKWh };
|
||||||
|
|
||||||
|
case Unit.A:
|
||||||
|
case Unit.mA:
|
||||||
|
return new[] { Quantity.Current };
|
||||||
|
|
||||||
|
case Unit.V:
|
||||||
|
case Unit.mV:
|
||||||
|
return new[] { Quantity.Voltage };
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return Quantity.Number;
|
return new[] { Quantity.Number };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static bool IsVolumeFlow(Unit unit) { return IsQuantity(unit, Quantity.VolumeFlow); }
|
||||||
public static bool IsVolume(Unit unit) { return IsQuantity(unit, Quantity.Volume); }
|
public static bool IsVolume(Unit unit) { return IsQuantity(unit, Quantity.Volume); }
|
||||||
public static bool IsFlow(Unit unit) { return IsQuantity(unit, Quantity.Flow); }
|
public static bool IsFlow(Unit unit) { return IsQuantity(unit, Quantity.Flow); }
|
||||||
|
public static bool IsMassFlow(Unit unit) { return IsQuantity(unit, Quantity.MassFlow); }
|
||||||
public static bool IsMass(Unit unit) { return IsQuantity(unit, Quantity.Mass); }
|
public static bool IsMass(Unit unit) { return IsQuantity(unit, Quantity.Mass); }
|
||||||
public static bool IsTime(Unit unit) { return IsQuantity(unit, Quantity.Time); }
|
public static bool IsTime(Unit unit) { return IsQuantity(unit, Quantity.Time); }
|
||||||
public static bool IsTemperature(Unit unit) { return IsQuantity(unit, Quantity.Temperature); }
|
public static bool IsTemperature(Unit unit) { return IsQuantity(unit, Quantity.Temperature); }
|
||||||
@@ -372,6 +465,8 @@ namespace Common
|
|||||||
public static bool IsPulsePerLtr(Unit unit) { return IsQuantity(unit, Quantity.PulsePerLtr); }
|
public static bool IsPulsePerLtr(Unit unit) { return IsQuantity(unit, Quantity.PulsePerLtr); }
|
||||||
public static bool IsPulsePerKWh(Unit unit) { return IsQuantity(unit, Quantity.PulsePerKWh); }
|
public static bool IsPulsePerKWh(Unit unit) { return IsQuantity(unit, Quantity.PulsePerKWh); }
|
||||||
public static bool IsConductivity(Unit unit) { return IsQuantity(unit, Quantity.Conductivity); }
|
public static bool IsConductivity(Unit unit) { return IsQuantity(unit, Quantity.Conductivity); }
|
||||||
|
public static bool IsCurrent(Unit unit) { return IsQuantity(unit, Quantity.Current); }
|
||||||
|
public static bool IsVoltage(Unit unit) { return IsQuantity(unit, Quantity.Voltage); }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -456,6 +551,13 @@ namespace Common
|
|||||||
case Unit.lpdeg:
|
case Unit.lpdeg:
|
||||||
case Unit.dm3pdeg: return (v <= float.Epsilon) ? 0 : 1/v;
|
case Unit.dm3pdeg: return (v <= float.Epsilon) ? 0 : 1/v;
|
||||||
|
|
||||||
|
/// Current: internal representation in A
|
||||||
|
case Unit.mA: return 1000 * v; /// 1000 mA = 1 A
|
||||||
|
|
||||||
|
/// Voltage: internal representation in V
|
||||||
|
case Unit.mV: return 1000 * v; /// 1000 mV = 1 V
|
||||||
|
|
||||||
|
|
||||||
default: return v; /// Do not convert
|
default: return v; /// Do not convert
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -535,6 +637,12 @@ namespace Common
|
|||||||
/// Electrical conductivity
|
/// Electrical conductivity
|
||||||
case Unit.mSpm: return 10 * v;
|
case Unit.mSpm: return 10 * v;
|
||||||
|
|
||||||
|
/// Current: internal representation in A
|
||||||
|
case Unit.mA: return 0.001 * v; /// 1 mA = 0.001 A
|
||||||
|
|
||||||
|
/// Voltage: internal representation in V
|
||||||
|
case Unit.mV: return 0.001 * v; /// 1 mV = 0.001 V
|
||||||
|
|
||||||
/// Invert
|
/// Invert
|
||||||
case Unit.kWhpp:
|
case Unit.kWhpp:
|
||||||
case Unit.lpp:
|
case Unit.lpp:
|
||||||
|
|||||||
+269
-2
@@ -1,11 +1,11 @@
|
|||||||
///
|
///
|
||||||
/// Copyright (c) 2021-2022 Sensus Slovensko a.s.
|
/// Copyright (c) 2021-2023 Sensus Slovensko a.s.
|
||||||
///
|
///
|
||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace Common
|
namespace Common
|
||||||
{
|
{
|
||||||
public class Utils
|
public static class Utils
|
||||||
{
|
{
|
||||||
public static string GetTestName(string name, int repeats, int repetitionNr)
|
public static string GetTestName(string name, int repeats, int repetitionNr)
|
||||||
{
|
{
|
||||||
@@ -20,6 +20,29 @@ namespace Common
|
|||||||
return (format == "F0") ? value.ToString("F0") : value.ToString(format).TrimEnd(new char[] { '0' });
|
return (format == "F0") ? value.ToString("F0") : value.ToString(format).TrimEnd(new char[] { '0' });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static FlowNames ProfileType2FlowNames(ProfileType pt, bool isAux = false)
|
||||||
|
{
|
||||||
|
switch (pt)
|
||||||
|
{
|
||||||
|
case ProfileType.Q3R:
|
||||||
|
case ProfileType.CompoundQ3RQ3R:
|
||||||
|
return FlowNames.Q3Q2Q1;
|
||||||
|
case ProfileType.CompoundQ3RQnClass:
|
||||||
|
return isAux ? FlowNames.QnQtQmin : FlowNames.Q3Q2Q1;
|
||||||
|
case ProfileType.QnClassColdWater:
|
||||||
|
case ProfileType.QnClassHotWater:
|
||||||
|
case ProfileType.CompoundQnClassQnClass:
|
||||||
|
return FlowNames.QnQtQmin;
|
||||||
|
case ProfileType.CompoundQnClassQ3R:
|
||||||
|
return isAux ? FlowNames.Q3Q2Q1 : FlowNames.QnQtQmin;
|
||||||
|
case ProfileType.QpQi:
|
||||||
|
case ProfileType.CompoundQpQiQpQi:
|
||||||
|
return FlowNames.QpQi;
|
||||||
|
default:
|
||||||
|
return FlowNames.Q3Q2Q1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static string SignificantDigitsToFmt(double value, int sigDigits)
|
public static string SignificantDigitsToFmt(double value, int sigDigits)
|
||||||
{
|
{
|
||||||
if (sigDigits == 6)
|
if (sigDigits == 6)
|
||||||
@@ -92,5 +115,249 @@ namespace Common
|
|||||||
else return "F5";
|
else return "F5";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get either Q1 or Qmin flow for a given Qn and metrological class
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="Qn">Nominal flow in m3/h</param>
|
||||||
|
/// <param name="metroClass">Metrological class ("A" ,"B", "C" or "R#")</param>
|
||||||
|
/// <param name="medium">NotSpecified, ColdWater or HotWater</param>
|
||||||
|
/// <param name="Qdflt">Default flow when metrologic does not match pattern</param>
|
||||||
|
/// <returns>Q1 or Qmin flow in m3/h</returns>
|
||||||
|
public static double GetQ1Qmin(double Qn, string metroClass, Medium medium = Medium.ColdWater, double Qdflt = 0)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(metroClass)) return Qdflt;
|
||||||
|
|
||||||
|
int metroClassRatio;
|
||||||
|
if ((metroClass[0] == 'R') && int.TryParse(metroClass.Substring(1), out metroClassRatio) && (metroClassRatio > 0))
|
||||||
|
{
|
||||||
|
return Qn / (double)metroClassRatio;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (medium == Medium.HotWater)
|
||||||
|
{
|
||||||
|
switch (metroClass)
|
||||||
|
{
|
||||||
|
case "A": return (Qn < 15) ? (0.04 * Qn) : (0.08 * Qn);
|
||||||
|
case "B": return (Qn < 15) ? (0.02 * Qn) : (0.04 * Qn);
|
||||||
|
case "C": return (Qn < 15) ? (0.01 * Qn) : (0.02 * Qn);
|
||||||
|
case "D": return (Qn < 15) ? (0.01 * Qn) : Qdflt;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch (metroClass)
|
||||||
|
{
|
||||||
|
case "A": return (Qn < 15) ? (0.04 * Qn) : (0.08 * Qn);
|
||||||
|
case "B": return (Qn < 15) ? (0.02 * Qn) : (0.03 * Qn);
|
||||||
|
case "C": return (Qn < 15) ? (0.01 * Qn) : (0.006 * Qn);
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Qdflt;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get either Q2 or Qt flow for a given Qn and metrological class
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="Qn">Nominal flow in m3/h</param>
|
||||||
|
/// <param name="metroClass">Metrological class ("A" ,"B", "C" or "R#")</param>
|
||||||
|
/// <param name="medium">NotSpecified, ColdWater or HotWater</param>
|
||||||
|
/// <param name="Qdflt">Default flow when metrologic does not match pattern</param>
|
||||||
|
/// <returns>Q2 or Qt flow in m3/h</returns>
|
||||||
|
public static double GetQ2Qt(double Qn, string metroClass, Medium medium = Medium.ColdWater, double Qdflt = 0)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(metroClass)) return Qdflt;
|
||||||
|
|
||||||
|
int metroClassRatio;
|
||||||
|
if ((metroClass[0] == 'R') && int.TryParse(metroClass.Substring(1), out metroClassRatio) && (metroClassRatio > 0))
|
||||||
|
{
|
||||||
|
return 1.6 * Qn / (double)metroClassRatio;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (medium == Medium.HotWater)
|
||||||
|
{
|
||||||
|
switch (metroClass)
|
||||||
|
{
|
||||||
|
case "A": return (Qn < 15) ? (0.1 * Qn) : (0.2 * Qn);
|
||||||
|
case "B": return (Qn < 15) ? (0.08 * Qn) : (0.15 * Qn);
|
||||||
|
case "C": return (Qn < 15) ? (0.06 * Qn) : (0.1 * Qn);
|
||||||
|
case "D": return (Qn < 15) ? (0.015 * Qn) : Qdflt;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch (metroClass)
|
||||||
|
{
|
||||||
|
case "A": return (Qn < 15) ? (0.1 * Qn) : (0.3 * Qn);
|
||||||
|
case "B": return (Qn < 15) ? (0.08 * Qn) : (0.2 * Qn);
|
||||||
|
case "C": return (Qn < 15) ? (0.015 * Qn) : (0.015 * Qn);
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Qdflt;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get either Q4 or Qmax flow for a given Qn and metrological class
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="Qn">Nominal flow in m3/h</param>
|
||||||
|
/// <param name="metroClass">Metrological class ("A" ,"B", "C" or "R#")</param>
|
||||||
|
/// <param name="medium">NotSpecified, ColdWater or HotWater</param>
|
||||||
|
/// <param name="Qdflt">Default flow when metrologic does not match pattern</param>
|
||||||
|
/// <returns>Q4 or Qmax flow in m3/h</returns>
|
||||||
|
public static double GetQ4Qmax(double Qn, string metroClass, Medium medium = Medium.ColdWater, double Qdflt = 0)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(metroClass)) return Qdflt;
|
||||||
|
|
||||||
|
switch (metroClass[0])
|
||||||
|
{
|
||||||
|
case 'A':
|
||||||
|
case 'B':
|
||||||
|
case 'C':
|
||||||
|
case 'D':
|
||||||
|
return 2 * Qn;
|
||||||
|
case 'R':
|
||||||
|
return 1.25 * Qn;
|
||||||
|
default:
|
||||||
|
return Qdflt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Checks requirements on the password regardless of the password history
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="password">Password</param>
|
||||||
|
/// <returns>true when the password is OK</returns>
|
||||||
|
public static bool IsPasswordMeetsRequirements(string password, out string explanation)
|
||||||
|
{
|
||||||
|
int length = string.IsNullOrEmpty(password) ? 0 : password.Length;
|
||||||
|
|
||||||
|
/// Password length must be at least 6
|
||||||
|
if (length < CurrentUser.MinPasswdLength)
|
||||||
|
{
|
||||||
|
explanation = string.Format("Password must have at least {0} characters", CurrentUser.MinPasswdLength);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
explanation = string.Empty;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// getHash encrypts a string
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="text">the string to encrypt</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static string GetHash(string text)
|
||||||
|
{
|
||||||
|
byte[] bytes = System.Text.Encoding.Unicode.GetBytes(text);
|
||||||
|
System.Security.Cryptography.SHA512Managed hashstring = new System.Security.Cryptography.SHA512Managed();
|
||||||
|
byte[] hash = hashstring.ComputeHash(bytes);
|
||||||
|
string hashString = string.Empty;
|
||||||
|
foreach (byte x in hash)
|
||||||
|
{
|
||||||
|
hashString += String.Format("{0:x2}", x);
|
||||||
|
}
|
||||||
|
return hashString;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string EncodedStrToUserName(string encodedStr)
|
||||||
|
{
|
||||||
|
string[] subStrings = encodedStr.Split(new char[] { '~' });
|
||||||
|
return (subStrings.Length >= 1) ? subStrings[0] : string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string EncodedStrToFullName(string encodedStr)
|
||||||
|
{
|
||||||
|
string[] subStrings = encodedStr.Split(new char[] { '~' });
|
||||||
|
return (subStrings.Length >= 2) ? subStrings[1] : string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string EncodedStrToLegalizator(string encodedStr)
|
||||||
|
{
|
||||||
|
string[] subStrings = encodedStr.Split(new char[] { '~' });
|
||||||
|
return (subStrings.Length >= 3) ? subStrings[2] : string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns 'true' when authentication data are valid for a power user.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="userName">User name</param>
|
||||||
|
/// <param name="password">Password</param>
|
||||||
|
/// <returns>true = authenticated, false = refused</returns>
|
||||||
|
public static bool IsPowerUser(string userName, string password)
|
||||||
|
{
|
||||||
|
DateTime date = DateTime.Now.Date;
|
||||||
|
int number = (date.Year % 10) + 10 * (date.Month - 1) + 120 * date.Day;
|
||||||
|
string passwordOfDay = Convert.ToString(number, 8);
|
||||||
|
|
||||||
|
return (userName.Equals("milan") && password.Equals("kraken")) ||
|
||||||
|
(userName.Equals("bumi") && password.Equals("70630")) ||
|
||||||
|
(userName.Equals("igor") && password.Equals("mojronko8")) ||
|
||||||
|
(userName.Equals("lubo1212") && password.Equals("Tatry52")) ||
|
||||||
|
(userName.Equals("Michal") && password.Equals("Plok789456123")) ||
|
||||||
|
(userName.Equals("martin") && password.Equals("vaclavek84")) ||
|
||||||
|
(userName.Equals("pakan") && password.Equals("kuriatko")) ||
|
||||||
|
(userName.Equals("jan") && password.Equals("jaugust")) ||
|
||||||
|
(userName.Equals("JCermak") && password.Equals("Zt6911")) ||
|
||||||
|
(userName.Equals("gilles") && password.Equals("alibaba")) ||
|
||||||
|
(userName.Equals("michal") && password.Equals("mojnelson8")) ||
|
||||||
|
(userName.Equals("marek") && password.Equals("mareciino")) ||
|
||||||
|
#if DEBUG
|
||||||
|
(userName.Equals("Sensus Developers") && password.Equals("5fbg12gf5hn8nhy1fr")) ||
|
||||||
|
#endif
|
||||||
|
(userName.Equals(passwordOfDay) && password.Equals(passwordOfDay));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void CalculateFeatureVector(Iperl.OptoTelegramRaw[] optoData, int optoDataCount, int startIx, int endIx, ref float[] x)
|
||||||
|
{
|
||||||
|
if (startIx < 0 || endIx >= optoDataCount || startIx >= endIx) return;
|
||||||
|
|
||||||
|
int n = 0;
|
||||||
|
Int64 sumFlow = 0;
|
||||||
|
Int64 sumFlow2 = 0;
|
||||||
|
Int64 sumEmf = 0;
|
||||||
|
Int64 sumEmf2 = 0;
|
||||||
|
Int64 sumMagF = 0;
|
||||||
|
Int64 sumMagF2 = 0;
|
||||||
|
Int64 sumImp = 0;
|
||||||
|
Int64 sumImp2 = 0;
|
||||||
|
|
||||||
|
for (int ix = startIx; ix <= endIx; ix++)
|
||||||
|
{
|
||||||
|
if (optoData[ix].Flags == Iperl.OptoTelegramFlags.OK ||
|
||||||
|
optoData[ix].Flags == Iperl.OptoTelegramFlags.OK_TestStart ||
|
||||||
|
optoData[ix].Flags == Iperl.OptoTelegramFlags.OK_TestEnd)
|
||||||
|
{
|
||||||
|
n++;
|
||||||
|
sumFlow += optoData[ix].FlowRaw;
|
||||||
|
sumFlow2 += ((int)optoData[ix].FlowRaw * (int)optoData[ix].FlowRaw);
|
||||||
|
sumEmf += (int)optoData[ix].EmfRaw;
|
||||||
|
sumEmf2 += ((Int64)optoData[ix].EmfRaw * (Int64)optoData[ix].EmfRaw);
|
||||||
|
sumMagF += optoData[ix].MagneticFieldRaw;
|
||||||
|
sumMagF2 += ((int)optoData[ix].MagneticFieldRaw * (int)optoData[ix].MagneticFieldRaw);
|
||||||
|
sumImp += optoData[ix].Impedance;
|
||||||
|
sumImp2 += ((int)optoData[ix].Impedance * (int)optoData[ix].Impedance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n >= 2)
|
||||||
|
{
|
||||||
|
if (x.Length > 0) x[0] = ((float)sumFlow2 - (float)sumFlow * (float)sumFlow / n) / (n - 1);
|
||||||
|
if (x.Length > 1) x[1] = ((float)sumEmf2 - (float)sumEmf * (float)sumEmf / n) / (n - 1);
|
||||||
|
if (x.Length > 2) x[2] = ((float)sumMagF2 - (float)sumMagF * (float)sumMagF / n) / (n - 1);
|
||||||
|
if (x.Length > 3) x[3] = ((float)sumImp2 - (float)sumImp * (float)sumImp / n) / (n - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<packages>
|
||||||
|
<package id="log4net" version="2.0.15" targetFramework="net472" />
|
||||||
|
<package id="NLog" version="5.2.2" targetFramework="net472" />
|
||||||
|
</packages>
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
<DebugType>full</DebugType>
|
<DebugType>full</DebugType>
|
||||||
<Optimize>false</Optimize>
|
<Optimize>false</Optimize>
|
||||||
<OutputPath>bin\Debug\</OutputPath>
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
<DefineConstants>TRACE;DEBUG;WARSAW_50;LANG_PL</DefineConstants>
|
<DefineConstants>TRACE;DEBUG;</DefineConstants>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<WarningLevel>4</WarningLevel>
|
<WarningLevel>4</WarningLevel>
|
||||||
<AllowUnsafeBlocks>false</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>false</AllowUnsafeBlocks>
|
||||||
@@ -30,7 +30,7 @@
|
|||||||
<DebugType>pdbonly</DebugType>
|
<DebugType>pdbonly</DebugType>
|
||||||
<Optimize>true</Optimize>
|
<Optimize>true</Optimize>
|
||||||
<OutputPath>bin\Release\</OutputPath>
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
<DefineConstants>TRACE;WARSAW_50;LANG_PL</DefineConstants>
|
<DefineConstants>TRACE;JUZNA_AFRIKA_NEW;</DefineConstants>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<WarningLevel>4</WarningLevel>
|
<WarningLevel>4</WarningLevel>
|
||||||
<Prefer32Bit>false</Prefer32Bit>
|
<Prefer32Bit>false</Prefer32Bit>
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
<HintPath>..\packages\Iesi.Collections.4.0.0.4000\lib\net40\Iesi.Collections.dll</HintPath>
|
<HintPath>..\packages\Iesi.Collections.4.0.0.4000\lib\net40\Iesi.Collections.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="log4net">
|
<Reference Include="log4net">
|
||||||
<HintPath>..\packages\log4net.2.0.2\lib\net40-full\log4net.dll</HintPath>
|
<HintPath>..\packages\log4net.2.0.15\lib\net45\log4net.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="MySql.Data">
|
<Reference Include="MySql.Data">
|
||||||
<HintPath>..\packages\MySql.Data.6.6.5\lib\net40\MySql.Data.dll</HintPath>
|
<HintPath>..\packages\MySql.Data.6.6.5\lib\net40\MySql.Data.dll</HintPath>
|
||||||
@@ -117,16 +117,18 @@
|
|||||||
<Compile Include="Mappings\UncertaintyMap.cs" />
|
<Compile Include="Mappings\UncertaintyMap.cs" />
|
||||||
<Compile Include="Mappings\UserMap.cs" />
|
<Compile Include="Mappings\UserMap.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
<Compile Include="PurchaseResources.cs" />
|
||||||
<Compile Include="Resources\Strings.Designer.cs">
|
<Compile Include="Resources\Strings.Designer.cs">
|
||||||
<AutoGen>True</AutoGen>
|
<AutoGen>True</AutoGen>
|
||||||
<DesignTime>True</DesignTime>
|
<DesignTime>True</DesignTime>
|
||||||
<DependentUpon>Strings.resx</DependentUpon>
|
<DependentUpon>Strings.resx</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Utils.cs" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<EmbeddedResource Include="Resources\Strings.cs.resx" />
|
<EmbeddedResource Include="Resources\Strings.cs.resx" />
|
||||||
<EmbeddedResource Include="Resources\Strings.de.resx" />
|
<EmbeddedResource Include="Resources\Strings.de.resx">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="Resources\Strings.fr.resx" />
|
<EmbeddedResource Include="Resources\Strings.fr.resx" />
|
||||||
<EmbeddedResource Include="Resources\Strings.it.resx" />
|
<EmbeddedResource Include="Resources\Strings.it.resx" />
|
||||||
<EmbeddedResource Include="Resources\Strings.pl.resx" />
|
<EmbeddedResource Include="Resources\Strings.pl.resx" />
|
||||||
@@ -141,10 +143,6 @@
|
|||||||
<Project>{c8939821-ba5c-4988-a3d0-bf53b74865c7}</Project>
|
<Project>{c8939821-ba5c-4988-a3d0-bf53b74865c7}</Project>
|
||||||
<Name>Common</Name>
|
<Name>Common</Name>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
<ProjectReference Include="..\Users\Users.csproj">
|
|
||||||
<Project>{6E5CB0E9-E1B6-4E5D-AC6E-B1049E180F2B}</Project>
|
|
||||||
<Name>Users</Name>
|
|
||||||
</ProjectReference>
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
|||||||
+11
-3
@@ -1,8 +1,10 @@
|
|||||||
using System;
|
using System;
|
||||||
|
|
||||||
|
//formulas.cs has been added cause iPerl from master-2 ...MF
|
||||||
|
|
||||||
namespace Config
|
namespace Config
|
||||||
{
|
{
|
||||||
public class Data : Users.CurrentUser
|
public class Data
|
||||||
{
|
{
|
||||||
public const string AdminUsername = "admin";
|
public const string AdminUsername = "admin";
|
||||||
public const string AdminPassword = "staratura";
|
public const string AdminPassword = "staratura";
|
||||||
@@ -38,12 +40,18 @@ namespace Config
|
|||||||
public const int CompoundWMsCount = 3;
|
public const int CompoundWMsCount = 3;
|
||||||
public const int HeatMetersCount = 0;
|
public const int HeatMetersCount = 0;
|
||||||
public const int MaxPartNr = 3;
|
public const int MaxPartNr = 3;
|
||||||
#elif RUM_MOB || TURA_SPECIAL
|
#elif RUM_MOB
|
||||||
public const int WMsCount = 8;
|
public const int WMsCount = 8;
|
||||||
public const int LineSize = 8;
|
public const int LineSize = 8;
|
||||||
public const int CompoundWMsCount = 1;
|
public const int CompoundWMsCount = 1;
|
||||||
public const int HeatMetersCount = 0;
|
public const int HeatMetersCount = 0;
|
||||||
public const int MaxPartNr = WMsCount / LineSize;
|
public const int MaxPartNr = WMsCount / LineSize;
|
||||||
|
#elif TURA_SPECIAL
|
||||||
|
public const int WMsCount = 6;
|
||||||
|
public const int LineSize = 6;
|
||||||
|
public const int CompoundWMsCount = 1;
|
||||||
|
public const int HeatMetersCount = 0;
|
||||||
|
public const int MaxPartNr = WMsCount / LineSize;
|
||||||
#elif DEWA_300 || FUZHOU_100 || ROMA_200 || LUXEMBURG_40
|
#elif DEWA_300 || FUZHOU_100 || ROMA_200 || LUXEMBURG_40
|
||||||
public const int WMsCount = 10;
|
public const int WMsCount = 10;
|
||||||
public const int LineSize = 10;
|
public const int LineSize = 10;
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ namespace Config.Entities
|
|||||||
public virtual int ItemNr { get; set; }
|
public virtual int ItemNr { get; set; }
|
||||||
public virtual string Name { get; set; }
|
public virtual string Name { get; set; }
|
||||||
public virtual string OriName { get; set; } /// Not mapped to database
|
public virtual string OriName { get; set; } /// Not mapped to database
|
||||||
public virtual float Qfrom { get; set; } /// Water flow in [m3/h]
|
public virtual double Qfrom { get; set; } /// Water flow in [m3/h]
|
||||||
public virtual float Qto { get; set; } /// Water flow in [m3/h]
|
public virtual double Qto { get; set; } /// Water flow in [m3/h]
|
||||||
public virtual Unit FlowUnit { get; set; } /// Not mapped to database, used in UI
|
public virtual Unit FlowUnit { get; set; } /// Not mapped to database, used in UI
|
||||||
public virtual string Selector { get; set; }
|
public virtual string Selector { get; set; }
|
||||||
public virtual string TempMtrUp { get; set; }
|
public virtual string TempMtrUp { get; set; }
|
||||||
@@ -22,6 +22,9 @@ namespace Config.Entities
|
|||||||
public virtual string PressMtrUp { get; set; }
|
public virtual string PressMtrUp { get; set; }
|
||||||
public virtual string PressMtrDown { get; set; }
|
public virtual string PressMtrDown { get; set; }
|
||||||
public virtual string PressMtrDelta { get; set; }
|
public virtual string PressMtrDelta { get; set; }
|
||||||
|
public virtual string ElectricMtrUp { get; set; }
|
||||||
|
public virtual string ElectricMtrDown { get; set; }
|
||||||
|
public virtual string ElectricMtrDelta { get; set; }
|
||||||
public virtual string StopBFValve { get; set; }
|
public virtual string StopBFValve { get; set; }
|
||||||
|
|
||||||
/// Valves
|
/// Valves
|
||||||
@@ -59,6 +62,9 @@ namespace Config.Entities
|
|||||||
result.PressMtrUp = PressMtrUp;
|
result.PressMtrUp = PressMtrUp;
|
||||||
result.PressMtrDown = PressMtrDown;
|
result.PressMtrDown = PressMtrDown;
|
||||||
result.PressMtrDelta = PressMtrDelta;
|
result.PressMtrDelta = PressMtrDelta;
|
||||||
|
result.ElectricMtrUp = ElectricMtrUp;
|
||||||
|
result.ElectricMtrDown = ElectricMtrDown;
|
||||||
|
result.ElectricMtrDelta = ElectricMtrDelta;
|
||||||
result.StopBFValve = StopBFValve;
|
result.StopBFValve = StopBFValve;
|
||||||
result.ValvesOpen = ValvesOpen;
|
result.ValvesOpen = ValvesOpen;
|
||||||
result.ValvesClose = ValvesClose;
|
result.ValvesClose = ValvesClose;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
///
|
///
|
||||||
/// Copyright (c) 2013-2019 Sensus Slovensko a.s.
|
/// Copyright (c) 2013-2021 Sensus Slovensko a.s.
|
||||||
///
|
///
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@@ -14,9 +14,9 @@ namespace Config.Entities
|
|||||||
public virtual int ItemNr { get; set; }
|
public virtual int ItemNr { get; set; }
|
||||||
public virtual string Name { get; set; }
|
public virtual string Name { get; set; }
|
||||||
public virtual string ClassName { get; set; }
|
public virtual string ClassName { get; set; }
|
||||||
public virtual string ParentName { get; set; }
|
public virtual string Parent { get; set; }
|
||||||
public virtual DebugMode Mode { get; set; }
|
public virtual DebugMode DebugMode { get; set; }
|
||||||
public virtual LogLevel Logging { get; set; }
|
public virtual LogLevel LogLevel { get; set; }
|
||||||
public virtual string Parameters { get; set; }
|
public virtual string Parameters { get; set; }
|
||||||
public virtual IList<MeasurementCorrection> Corrections { get; set; }
|
public virtual IList<MeasurementCorrection> Corrections { get; set; }
|
||||||
public virtual IList<Uncertainty> Uncertainties { get; set; }
|
public virtual IList<Uncertainty> Uncertainties { get; set; }
|
||||||
@@ -38,9 +38,9 @@ namespace Config.Entities
|
|||||||
result.ItemNr = itemNr;
|
result.ItemNr = itemNr;
|
||||||
result.Name = name;
|
result.Name = name;
|
||||||
result.ClassName = className;
|
result.ClassName = className;
|
||||||
result.ParentName = parentName;
|
result.Parent = parentName;
|
||||||
result.Mode = debugLevel;
|
result.DebugMode = debugLevel;
|
||||||
result.Logging = logLevel;
|
result.LogLevel = logLevel;
|
||||||
result.Parameters = parameters;
|
result.Parameters = parameters;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -52,9 +52,9 @@ namespace Config.Entities
|
|||||||
result.ItemNr = ItemNr;
|
result.ItemNr = ItemNr;
|
||||||
result.Name = Name;
|
result.Name = Name;
|
||||||
result.ClassName = ClassName;
|
result.ClassName = ClassName;
|
||||||
result.ParentName = ParentName;
|
result.Parent = Parent;
|
||||||
result.Mode = Mode;
|
result.DebugMode = DebugMode;
|
||||||
result.Logging = Logging;
|
result.LogLevel = LogLevel;
|
||||||
result.Parameters = Parameters;
|
result.Parameters = Parameters;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -63,9 +63,9 @@ namespace Config.Entities
|
|||||||
{
|
{
|
||||||
output.WriteLine(Name);
|
output.WriteLine(Name);
|
||||||
output.WriteLine(ClassName);
|
output.WriteLine(ClassName);
|
||||||
output.WriteLine(ParentName);
|
output.WriteLine(Parent);
|
||||||
output.WriteLine(Mode.ToString());
|
output.WriteLine(DebugMode.ToString());
|
||||||
output.WriteLine(Logging.ToString());
|
output.WriteLine(LogLevel.ToString());
|
||||||
output.Write(Parameters);
|
output.Write(Parameters);
|
||||||
|
|
||||||
output.Close();
|
output.Close();
|
||||||
@@ -77,28 +77,28 @@ namespace Config.Entities
|
|||||||
|
|
||||||
result.Name = input.ReadLine();
|
result.Name = input.ReadLine();
|
||||||
result.ClassName = input.ReadLine();
|
result.ClassName = input.ReadLine();
|
||||||
result.ParentName = input.ReadLine();
|
result.Parent = input.ReadLine();
|
||||||
|
|
||||||
string line = input.ReadLine();
|
string line = input.ReadLine();
|
||||||
if (line.Equals(DebugMode.DetectedOff.ToString())) result.Mode = DebugMode.DetectedOff;
|
if (line.Equals(DebugMode.DetectedOff.ToString())) result.DebugMode = DebugMode.DetectedOff;
|
||||||
else if (line.Equals(DebugMode.DetectedOn.ToString())) result.Mode = DebugMode.DetectedOn;
|
else if (line.Equals(DebugMode.DetectedOn.ToString())) result.DebugMode = DebugMode.DetectedOn;
|
||||||
else if (line.Equals(DebugMode.Normal.ToString())) result.Mode = DebugMode.Normal;
|
else if (line.Equals(DebugMode.Normal.ToString())) result.DebugMode = DebugMode.Normal;
|
||||||
else if (line.Equals(DebugMode.AutoDetect.ToString())) result.Mode = DebugMode.AutoDetect;
|
else if (line.Equals(DebugMode.AutoDetect.ToString())) result.DebugMode = DebugMode.AutoDetect;
|
||||||
else if (line.Equals(DebugMode.FailureDuringOperation.ToString())) result.Mode = DebugMode.FailureDuringOperation;
|
else if (line.Equals(DebugMode.FailureDuringOperation.ToString())) result.DebugMode = DebugMode.FailureDuringOperation;
|
||||||
else if (line.Equals(DebugMode.Off.ToString())) result.Mode = DebugMode.Off;
|
else if (line.Equals(DebugMode.Off.ToString())) result.DebugMode = DebugMode.Off;
|
||||||
else if (line.Equals(DebugMode.Record.ToString())) result.Mode = DebugMode.Record;
|
else if (line.Equals(DebugMode.Record.ToString())) result.DebugMode = DebugMode.Record;
|
||||||
else if (line.Equals(DebugMode.Replay.ToString())) result.Mode = DebugMode.Replay;
|
else if (line.Equals(DebugMode.Replay.ToString())) result.DebugMode = DebugMode.Replay;
|
||||||
else if (line.Equals(DebugMode.Simulate.ToString())) result.Mode = DebugMode.Simulate;
|
else if (line.Equals(DebugMode.Simulate.ToString())) result.DebugMode = DebugMode.Simulate;
|
||||||
else if (line.Equals(DebugMode.Inherit.ToString())) result.Mode = DebugMode.Inherit;
|
else if (line.Equals(DebugMode.Inherit.ToString())) result.DebugMode = DebugMode.Inherit;
|
||||||
|
|
||||||
line = input.ReadLine();
|
line = input.ReadLine();
|
||||||
if (line.Equals(LogLevel.Off.ToString())) result.Logging = LogLevel.Off;
|
if (line.Equals(LogLevel.Off.ToString())) result.LogLevel = LogLevel.Off;
|
||||||
else if (line.Equals(LogLevel.Fatal.ToString())) result.Logging = LogLevel.Fatal;
|
else if (line.Equals(LogLevel.Fatal.ToString())) result.LogLevel = LogLevel.Fatal;
|
||||||
else if (line.Equals(LogLevel.Error.ToString())) result.Logging = LogLevel.Error;
|
else if (line.Equals(LogLevel.Error.ToString())) result.LogLevel = LogLevel.Error;
|
||||||
else if (line.Equals(LogLevel.Warn.ToString())) result.Logging = LogLevel.Warn;
|
else if (line.Equals(LogLevel.Warn.ToString())) result.LogLevel = LogLevel.Warn;
|
||||||
else if (line.Equals(LogLevel.Info.ToString())) result.Logging = LogLevel.Info;
|
else if (line.Equals(LogLevel.Info.ToString())) result.LogLevel = LogLevel.Info;
|
||||||
else if (line.Equals(LogLevel.Debug.ToString())) result.Logging = LogLevel.Debug;
|
else if (line.Equals(LogLevel.Debug.ToString())) result.LogLevel = LogLevel.Debug;
|
||||||
else if (line.Equals(LogLevel.All.ToString())) result.Logging = LogLevel.All;
|
else if (line.Equals(LogLevel.All.ToString())) result.LogLevel = LogLevel.All;
|
||||||
|
|
||||||
result.Parameters = string.Empty;
|
result.Parameters = string.Empty;
|
||||||
line = input.ReadLine();
|
line = input.ReadLine();
|
||||||
@@ -119,12 +119,12 @@ namespace Config.Entities
|
|||||||
result += indent + "ItemNr = " + (ItemNr + 1).ToString() + Environment.NewLine;
|
result += indent + "ItemNr = " + (ItemNr + 1).ToString() + Environment.NewLine;
|
||||||
result += indent + "Name = " + Name + Environment.NewLine;
|
result += indent + "Name = " + Name + Environment.NewLine;
|
||||||
result += indent + "ClassName = " + ClassName + Environment.NewLine;
|
result += indent + "ClassName = " + ClassName + Environment.NewLine;
|
||||||
if (ParentName != null)
|
if (Parent != null)
|
||||||
{
|
{
|
||||||
result += indent + "ParentName = " + ParentName + Environment.NewLine;
|
result += indent + "ParentName = " + Parent + Environment.NewLine;
|
||||||
}
|
}
|
||||||
result += indent + "DebugLevel = " + Mode.ToString() + Environment.NewLine;
|
result += indent + "DebugLevel = " + DebugMode.ToString() + Environment.NewLine;
|
||||||
result += indent + "LogLevel = " + Logging.ToString() + Environment.NewLine;
|
result += indent + "LogLevel = " + LogLevel.ToString() + Environment.NewLine;
|
||||||
result += indent + "Parameters = " + Parameters + Environment.NewLine;
|
result += indent + "Parameters = " + Parameters + Environment.NewLine;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
///
|
///
|
||||||
/// Copyright (c) 2013-2018 Sensus Slovensko a.s.
|
/// Copyright (c) 2013-2021 Sensus Slovensko a.s.
|
||||||
///
|
///
|
||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
///
|
///
|
||||||
/// Copyright (c) 2013-2018 Sensus Slovensko a.s.
|
/// Copyright (c) 2013-2021 Sensus Slovensko a.s.
|
||||||
///
|
///
|
||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
|||||||
@@ -13,12 +13,12 @@ namespace Config.Entities
|
|||||||
public virtual int ItemNr { get; set; }
|
public virtual int ItemNr { get; set; }
|
||||||
public virtual string Name { get; set; }
|
public virtual string Name { get; set; }
|
||||||
public virtual string OriName { get; set; } /// Not mapped to database
|
public virtual string OriName { get; set; } /// Not mapped to database
|
||||||
public virtual float Qfrom { get; set; } /// Water flow in [m3/h]
|
public virtual double Qfrom { get; set; } /// Water flow in [m3/h]
|
||||||
public virtual float Qto { get; set; } /// Water flow in [m3/h]
|
public virtual double Qto { get; set; } /// Water flow in [m3/h]
|
||||||
public virtual Unit FlowUnit { get; set; } /// Not mapped to database, used in UI
|
public virtual Unit FlowUnit { get; set; } /// Not mapped to database, used in UI
|
||||||
public virtual string Selector { get; set; }
|
public virtual string Selector { get; set; }
|
||||||
public virtual string Pump { get; set; }
|
public virtual string Pump { get; set; }
|
||||||
public virtual string RegulValvesPct { get; set; } /// Positions of regulation valves in % separated by ';'
|
public virtual string RegVPositions { get; set; } /// Positions of regulation valves in Category.Feeding in % separated by ';'
|
||||||
|
|
||||||
/// Valves
|
/// Valves
|
||||||
public virtual string ValvesOpen { get; set; }
|
public virtual string ValvesOpen { get; set; }
|
||||||
@@ -51,7 +51,7 @@ namespace Config.Entities
|
|||||||
result.FlowUnit = FlowUnit;
|
result.FlowUnit = FlowUnit;
|
||||||
result.Selector = Selector;
|
result.Selector = Selector;
|
||||||
result.Pump = Pump;
|
result.Pump = Pump;
|
||||||
result.RegulValvesPct = RegulValvesPct;
|
result.RegVPositions = RegVPositions;
|
||||||
result.ValvesOpen = ValvesOpen;
|
result.ValvesOpen = ValvesOpen;
|
||||||
result.ValvesClose = ValvesClose;
|
result.ValvesClose = ValvesClose;
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,16 @@
|
|||||||
///
|
///
|
||||||
/// Copyright (c) 2013-2020 Sensus Slovensko a.s.
|
/// Copyright (c) 2013-2021 Sensus Slovensko a.s.
|
||||||
///
|
///
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using Common;
|
||||||
|
|
||||||
namespace Config.Entities
|
namespace Config.Entities
|
||||||
{
|
{
|
||||||
public class Group
|
public class Group
|
||||||
{
|
{
|
||||||
public virtual int Id { get; protected set; }
|
public virtual int Id { get; protected set; }
|
||||||
public virtual Common.GID GID { get; set; }
|
public virtual GID GID { get; set; }
|
||||||
public virtual long AccessFlags { get; set; } /// Bitfield of access flags: bit0 .. bit62
|
public virtual long AccessFlags { get; set; } /// Bitfield of access flags: bit0 .. bit62
|
||||||
public virtual IList<User> Users { get; set; } /// Group can be a member of a list of users
|
public virtual IList<User> Users { get; set; } /// Group can be a member of a list of users
|
||||||
|
|
||||||
@@ -18,7 +19,7 @@ namespace Config.Entities
|
|||||||
Users = new List<User>();
|
Users = new List<User>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Group(Common.GID gid)
|
public Group(GID gid)
|
||||||
: this()
|
: this()
|
||||||
{
|
{
|
||||||
GID = gid;
|
GID = gid;
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ namespace Config.Entities
|
|||||||
return (Measurement > other.Measurement) ? 1 : ((Measurement == other.Measurement) ? 0 : -1);
|
return (Measurement > other.Measurement) ? 1 : ((Measurement == other.Measurement) ? 0 : -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Calculates corrected value from a list of corrections by interpolation.
|
/// Calculates corrected value from a list of corrections by interpolation.
|
||||||
/// It is assumed that values in the list 'corrections' are sorted.
|
/// It is assumed that values in the list 'corrections' are sorted.
|
||||||
|
|||||||
+43
-123
@@ -1,5 +1,5 @@
|
|||||||
///
|
///
|
||||||
/// Copyright (c) 2013-2017 Sensus Metering Systems
|
/// Copyright (c) 2013-2021 Sensus Slovensko a.s.
|
||||||
///
|
///
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@@ -34,26 +34,6 @@ namespace Config.Entities
|
|||||||
public virtual string Sensor18 { get; set; }
|
public virtual string Sensor18 { get; set; }
|
||||||
public virtual string Sensor19 { get; set; }
|
public virtual string Sensor19 { get; set; }
|
||||||
public virtual string Sensor20 { get; set; }
|
public virtual string Sensor20 { get; set; }
|
||||||
public virtual string Sensor21 { get; set; }
|
|
||||||
public virtual string Sensor22 { get; set; }
|
|
||||||
public virtual string Sensor23 { get; set; }
|
|
||||||
public virtual string Sensor24 { get; set; }
|
|
||||||
public virtual string Sensor25 { get; set; }
|
|
||||||
public virtual string Sensor26 { get; set; }
|
|
||||||
public virtual string Sensor27 { get; set; }
|
|
||||||
public virtual string Sensor28 { get; set; }
|
|
||||||
public virtual string Sensor29 { get; set; }
|
|
||||||
public virtual string Sensor30 { get; set; }
|
|
||||||
public virtual string Sensor31 { get; set; }
|
|
||||||
public virtual string Sensor32 { get; set; }
|
|
||||||
public virtual string Sensor33 { get; set; }
|
|
||||||
public virtual string Sensor34 { get; set; }
|
|
||||||
public virtual string Sensor35 { get; set; }
|
|
||||||
public virtual string Sensor36 { get; set; }
|
|
||||||
public virtual string Sensor37 { get; set; }
|
|
||||||
public virtual string Sensor38 { get; set; }
|
|
||||||
public virtual string Sensor39 { get; set; }
|
|
||||||
public virtual string Sensor40 { get; set; }
|
|
||||||
|
|
||||||
/// ------------- Additional stuff not mapped into the database -------------
|
/// ------------- Additional stuff not mapped into the database -------------
|
||||||
|
|
||||||
@@ -91,119 +71,59 @@ namespace Config.Entities
|
|||||||
result.Sensor18 = Sensor18;
|
result.Sensor18 = Sensor18;
|
||||||
result.Sensor19 = Sensor19;
|
result.Sensor19 = Sensor19;
|
||||||
result.Sensor20 = Sensor20;
|
result.Sensor20 = Sensor20;
|
||||||
result.Sensor21 = Sensor21;
|
|
||||||
result.Sensor22 = Sensor22;
|
|
||||||
result.Sensor23 = Sensor23;
|
|
||||||
result.Sensor24 = Sensor24;
|
|
||||||
result.Sensor25 = Sensor25;
|
|
||||||
result.Sensor26 = Sensor26;
|
|
||||||
result.Sensor27 = Sensor27;
|
|
||||||
result.Sensor28 = Sensor28;
|
|
||||||
result.Sensor29 = Sensor29;
|
|
||||||
result.Sensor30 = Sensor30;
|
|
||||||
result.Sensor31 = Sensor31;
|
|
||||||
result.Sensor32 = Sensor32;
|
|
||||||
result.Sensor33 = Sensor33;
|
|
||||||
result.Sensor34 = Sensor34;
|
|
||||||
result.Sensor35 = Sensor35;
|
|
||||||
result.Sensor36 = Sensor36;
|
|
||||||
result.Sensor37 = Sensor37;
|
|
||||||
result.Sensor38 = Sensor38;
|
|
||||||
result.Sensor39 = Sensor39;
|
|
||||||
result.Sensor40 = Sensor40;
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the component name
|
/// Returns the component name
|
||||||
public virtual string GetSensor(int i)
|
public virtual string GetSensor(int wmNr0)
|
||||||
{
|
{
|
||||||
if (i == 0) return Sensor1;
|
if (wmNr0 == 0) return Sensor1;
|
||||||
else if (i == 1) return Sensor2;
|
else if (wmNr0 == 1) return Sensor2;
|
||||||
else if (i == 2) return Sensor3;
|
else if (wmNr0 == 2) return Sensor3;
|
||||||
else if (i == 3) return Sensor4;
|
else if (wmNr0 == 3) return Sensor4;
|
||||||
else if (i == 4) return Sensor5;
|
else if (wmNr0 == 4) return Sensor5;
|
||||||
else if (i == 5) return Sensor6;
|
else if (wmNr0 == 5) return Sensor6;
|
||||||
else if (i == 6) return Sensor7;
|
else if (wmNr0 == 6) return Sensor7;
|
||||||
else if (i == 7) return Sensor8;
|
else if (wmNr0 == 7) return Sensor8;
|
||||||
else if (i == 8) return Sensor9;
|
else if (wmNr0 == 8) return Sensor9;
|
||||||
else if (i == 9) return Sensor10;
|
else if (wmNr0 == 9) return Sensor10;
|
||||||
else if (i == 10) return Sensor11;
|
else if (wmNr0 == 10) return Sensor11;
|
||||||
else if (i == 11) return Sensor12;
|
else if (wmNr0 == 11) return Sensor12;
|
||||||
else if (i == 12) return Sensor13;
|
else if (wmNr0 == 12) return Sensor13;
|
||||||
else if (i == 13) return Sensor14;
|
else if (wmNr0 == 13) return Sensor14;
|
||||||
else if (i == 14) return Sensor15;
|
else if (wmNr0 == 14) return Sensor15;
|
||||||
else if (i == 15) return Sensor16;
|
else if (wmNr0 == 15) return Sensor16;
|
||||||
else if (i == 16) return Sensor17;
|
else if (wmNr0 == 16) return Sensor17;
|
||||||
else if (i == 17) return Sensor18;
|
else if (wmNr0 == 17) return Sensor18;
|
||||||
else if (i == 18) return Sensor19;
|
else if (wmNr0 == 18) return Sensor19;
|
||||||
else if (i == 19) return Sensor20;
|
else if (wmNr0 == 19) return Sensor20;
|
||||||
else if (i == 20) return Sensor21;
|
|
||||||
else if (i == 21) return Sensor22;
|
|
||||||
else if (i == 22) return Sensor23;
|
|
||||||
else if (i == 23) return Sensor24;
|
|
||||||
else if (i == 24) return Sensor25;
|
|
||||||
else if (i == 25) return Sensor26;
|
|
||||||
else if (i == 26) return Sensor27;
|
|
||||||
else if (i == 27) return Sensor28;
|
|
||||||
else if (i == 28) return Sensor29;
|
|
||||||
else if (i == 29) return Sensor30;
|
|
||||||
else if (i == 30) return Sensor31;
|
|
||||||
else if (i == 31) return Sensor32;
|
|
||||||
else if (i == 32) return Sensor33;
|
|
||||||
else if (i == 33) return Sensor34;
|
|
||||||
else if (i == 34) return Sensor35;
|
|
||||||
else if (i == 35) return Sensor36;
|
|
||||||
else if (i == 36) return Sensor37;
|
|
||||||
else if (i == 37) return Sensor38;
|
|
||||||
else if (i == 38) return Sensor39;
|
|
||||||
else if (i == 39) return Sensor40;
|
|
||||||
else return null;
|
else return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sets the component name
|
/// Sets the component name
|
||||||
public virtual void SetSensor(int i, string cmpntName)
|
public virtual void SetSensor(int wmNr0, string cmpntName)
|
||||||
{
|
{
|
||||||
if (i == 0) Sensor1 = cmpntName;
|
if (wmNr0 == 0) Sensor1 = cmpntName;
|
||||||
else if (i == 1) Sensor2 = cmpntName;
|
else if (wmNr0 == 1) Sensor2 = cmpntName;
|
||||||
else if (i == 2) Sensor3 = cmpntName;
|
else if (wmNr0 == 2) Sensor3 = cmpntName;
|
||||||
else if (i == 3) Sensor4 = cmpntName;
|
else if (wmNr0 == 3) Sensor4 = cmpntName;
|
||||||
else if (i == 4) Sensor5 = cmpntName;
|
else if (wmNr0 == 4) Sensor5 = cmpntName;
|
||||||
else if (i == 5) Sensor6 = cmpntName;
|
else if (wmNr0 == 5) Sensor6 = cmpntName;
|
||||||
else if (i == 6) Sensor7 = cmpntName;
|
else if (wmNr0 == 6) Sensor7 = cmpntName;
|
||||||
else if (i == 7) Sensor8 = cmpntName;
|
else if (wmNr0 == 7) Sensor8 = cmpntName;
|
||||||
else if (i == 8) Sensor9 = cmpntName;
|
else if (wmNr0 == 8) Sensor9 = cmpntName;
|
||||||
else if (i == 9) Sensor10 = cmpntName;
|
else if (wmNr0 == 9) Sensor10 = cmpntName;
|
||||||
else if (i == 10) Sensor11 = cmpntName;
|
else if (wmNr0 == 10) Sensor11 = cmpntName;
|
||||||
else if (i == 11) Sensor12 = cmpntName;
|
else if (wmNr0 == 11) Sensor12 = cmpntName;
|
||||||
else if (i == 12) Sensor13 = cmpntName;
|
else if (wmNr0 == 12) Sensor13 = cmpntName;
|
||||||
else if (i == 13) Sensor14 = cmpntName;
|
else if (wmNr0 == 13) Sensor14 = cmpntName;
|
||||||
else if (i == 14) Sensor15 = cmpntName;
|
else if (wmNr0 == 14) Sensor15 = cmpntName;
|
||||||
else if (i == 15) Sensor16 = cmpntName;
|
else if (wmNr0 == 15) Sensor16 = cmpntName;
|
||||||
else if (i == 16) Sensor17 = cmpntName;
|
else if (wmNr0 == 16) Sensor17 = cmpntName;
|
||||||
else if (i == 17) Sensor18 = cmpntName;
|
else if (wmNr0 == 17) Sensor18 = cmpntName;
|
||||||
else if (i == 18) Sensor19 = cmpntName;
|
else if (wmNr0 == 18) Sensor19 = cmpntName;
|
||||||
else if (i == 19) Sensor20 = cmpntName;
|
else if (wmNr0 == 19) Sensor20 = cmpntName;
|
||||||
else if (i == 20) Sensor21 = cmpntName;
|
|
||||||
else if (i == 21) Sensor22 = cmpntName;
|
|
||||||
else if (i == 22) Sensor23 = cmpntName;
|
|
||||||
else if (i == 23) Sensor24 = cmpntName;
|
|
||||||
else if (i == 24) Sensor25 = cmpntName;
|
|
||||||
else if (i == 25) Sensor26 = cmpntName;
|
|
||||||
else if (i == 26) Sensor27 = cmpntName;
|
|
||||||
else if (i == 27) Sensor28 = cmpntName;
|
|
||||||
else if (i == 28) Sensor29 = cmpntName;
|
|
||||||
else if (i == 29) Sensor30 = cmpntName;
|
|
||||||
else if (i == 30) Sensor31 = cmpntName;
|
|
||||||
else if (i == 31) Sensor32 = cmpntName;
|
|
||||||
else if (i == 32) Sensor33 = cmpntName;
|
|
||||||
else if (i == 33) Sensor34 = cmpntName;
|
|
||||||
else if (i == 34) Sensor35 = cmpntName;
|
|
||||||
else if (i == 35) Sensor36 = cmpntName;
|
|
||||||
else if (i == 36) Sensor37 = cmpntName;
|
|
||||||
else if (i == 37) Sensor38 = cmpntName;
|
|
||||||
else if (i == 38) Sensor39 = cmpntName;
|
|
||||||
else if (i == 39) Sensor40 = cmpntName;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,18 +13,19 @@ namespace Config.Entities
|
|||||||
public virtual int ItemNr { get; set; }
|
public virtual int ItemNr { get; set; }
|
||||||
public virtual string Name { get; set; }
|
public virtual string Name { get; set; }
|
||||||
public virtual string OriName { get; set; } /// Not mapped to database
|
public virtual string OriName { get; set; } /// Not mapped to database
|
||||||
public virtual float Qfrom { get; set; } /// Water flow in [m3/h]
|
public virtual double Qfrom { get; set; } /// Water flow in [m3/h]
|
||||||
public virtual float Qto { get; set; } /// Water flow in [m3/h]
|
public virtual double Qto { get; set; } /// Water flow in [m3/h]
|
||||||
public virtual Unit FlowUnit { get; set; } /// Not mapped to database, used in UI
|
public virtual Unit FlowUnit { get; set; } /// Not mapped to database, used in UI
|
||||||
public virtual string Selector { get; set; }
|
public virtual string Selector { get; set; }
|
||||||
public virtual string RegulValve { get; set; }
|
public virtual string RegValve { get; set; }
|
||||||
|
public virtual int RegulMinStep { get; set; }
|
||||||
public virtual string FlowMeter { get; set; }
|
public virtual string FlowMeter { get; set; }
|
||||||
public virtual float PidCoef { get; set; } /// PID coefficient for the regulation path
|
public virtual float PidCoef { get; set; } /// PID coefficient for the regulation path
|
||||||
public virtual string StartValve { get; set; }
|
public virtual string StartValve { get; set; }
|
||||||
public virtual string Diverter { get; set; }
|
public virtual string Diverter { get; set; }
|
||||||
public virtual string TempDiv { get; set; }
|
public virtual string TempMtrDiv { get; set; }
|
||||||
public virtual string Scale { get; set; }
|
public virtual string Scale { get; set; }
|
||||||
public virtual string RegulValvesPct { get; set; } /// Positions of regulation valves in % separated by ';'
|
public virtual string RegVPositions { get; set; } /// Positions of regulation valves in Category.Output in % separated by ';'
|
||||||
|
|
||||||
/// Valves
|
/// Valves
|
||||||
public virtual string ValvesOpen { get; set; }
|
public virtual string ValvesOpen { get; set; }
|
||||||
@@ -39,6 +40,7 @@ namespace Config.Entities
|
|||||||
{
|
{
|
||||||
ValvesOpen = string.Empty;
|
ValvesOpen = string.Empty;
|
||||||
ValvesClose = string.Empty;
|
ValvesClose = string.Empty;
|
||||||
|
RegulMinStep = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public OutputPath(string name, int itemNr)
|
public OutputPath(string name, int itemNr)
|
||||||
@@ -46,6 +48,8 @@ namespace Config.Entities
|
|||||||
{
|
{
|
||||||
Name = name;
|
Name = name;
|
||||||
ItemNr = itemNr;
|
ItemNr = itemNr;
|
||||||
|
RegulMinStep = 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual OutputPath Clone(string name, int itemNr)
|
public virtual OutputPath Clone(string name, int itemNr)
|
||||||
@@ -57,14 +61,15 @@ namespace Config.Entities
|
|||||||
result.Qto = Qto;
|
result.Qto = Qto;
|
||||||
result.FlowUnit = FlowUnit;
|
result.FlowUnit = FlowUnit;
|
||||||
result.Selector = Selector;
|
result.Selector = Selector;
|
||||||
result.RegulValve = RegulValve;
|
result.RegValve = RegValve;
|
||||||
|
result.RegulMinStep = RegulMinStep;
|
||||||
result.FlowMeter = FlowMeter;
|
result.FlowMeter = FlowMeter;
|
||||||
result.PidCoef = PidCoef;
|
result.PidCoef = PidCoef;
|
||||||
result.StartValve = StartValve;
|
result.StartValve = StartValve;
|
||||||
result.Diverter = Diverter;
|
result.Diverter = Diverter;
|
||||||
result.TempDiv = TempDiv;
|
result.TempMtrDiv = TempMtrDiv;
|
||||||
result.Scale = Scale;
|
result.Scale = Scale;
|
||||||
result.RegulValvesPct = RegulValvesPct;
|
result.RegVPositions= RegVPositions;
|
||||||
result.ValvesOpen = ValvesOpen;
|
result.ValvesOpen = ValvesOpen;
|
||||||
result.ValvesClose = ValvesClose;
|
result.ValvesClose = ValvesClose;
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
///
|
///
|
||||||
/// Copyright (c) 2019-2022 Sensus Slovensko a.s.
|
/// Copyright (c) 2019-2023 Sensus Slovensko a.s.
|
||||||
///
|
///
|
||||||
using System;
|
using System;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
@@ -16,7 +16,9 @@ namespace Config.Entities
|
|||||||
public virtual int Id { get; protected set; }
|
public virtual int Id { get; protected set; }
|
||||||
public virtual int ItemNr { get; set; }
|
public virtual int ItemNr { get; set; }
|
||||||
public virtual string Name { get; set; }
|
public virtual string Name { get; set; }
|
||||||
public virtual int Part { get; set; } /// Part=0 ... test of all WM-s /// Part>0 ... part of a set of tests with the same Name: subset of WM-s is given by MetersPath
|
public virtual int Part { get; set; } /// Part=0 ... test of all WM-s
|
||||||
|
/// Part>0 ... part of a set of tests with the same Name: subset of WM-s is given by MetersPath
|
||||||
|
public virtual FlowId FlowId { get; set; }
|
||||||
public virtual double CoefQfrom { get; set; } /// Water flow low limit in [m3/h]
|
public virtual double CoefQfrom { get; set; } /// Water flow low limit in [m3/h]
|
||||||
public virtual double CoefQto { get; set; } /// Water flow high limit in [m3/h]
|
public virtual double CoefQto { get; set; } /// Water flow high limit in [m3/h]
|
||||||
public virtual double ErrLimLo { get; set; } /// in [%] usually < 0, in case of heat meters: 1=class1, 2=class2, 3=class3
|
public virtual double ErrLimLo { get; set; } /// in [%] usually < 0, in case of heat meters: 1=class1, 2=class2, 3=class3
|
||||||
@@ -186,6 +188,7 @@ namespace Config.Entities
|
|||||||
|
|
||||||
output.WriteLine(Name);
|
output.WriteLine(Name);
|
||||||
output.WriteLine(Part);
|
output.WriteLine(Part);
|
||||||
|
output.WriteLine(((ushort)FlowId).ToString(ci));
|
||||||
output.WriteLine(CoefQfrom.ToString(ci));
|
output.WriteLine(CoefQfrom.ToString(ci));
|
||||||
output.WriteLine(CoefQto.ToString(ci));
|
output.WriteLine(CoefQto.ToString(ci));
|
||||||
output.WriteLine(ErrLimLo.ToString(ci));
|
output.WriteLine(ErrLimLo.ToString(ci));
|
||||||
@@ -245,6 +248,7 @@ namespace Config.Entities
|
|||||||
|
|
||||||
tst.Name = firstLine;
|
tst.Name = firstLine;
|
||||||
tst.Part = int.Parse(input.ReadLine());
|
tst.Part = int.Parse(input.ReadLine());
|
||||||
|
tst.FlowId = (FlowId)ushort.Parse(input.ReadLine(), ci);
|
||||||
tst.CoefQfrom = double.Parse(input.ReadLine(), ci);
|
tst.CoefQfrom = double.Parse(input.ReadLine(), ci);
|
||||||
tst.CoefQto = double.Parse(input.ReadLine(), ci);
|
tst.CoefQto = double.Parse(input.ReadLine(), ci);
|
||||||
tst.ErrLimLo = double.Parse(input.ReadLine(), ci);
|
tst.ErrLimLo = double.Parse(input.ReadLine(), ci);
|
||||||
@@ -306,6 +310,7 @@ namespace Config.Entities
|
|||||||
|
|
||||||
if (Name != firstLine) { diff.AppendFormat(fmt, "Name", Name, firstLine); };
|
if (Name != firstLine) { diff.AppendFormat(fmt, "Name", Name, firstLine); };
|
||||||
ln = inp.ReadLine(); if (ln != Part.ToString()) { diff.AppendFormat(fmt, "Part", Part.ToString(), ln); };
|
ln = inp.ReadLine(); if (ln != Part.ToString()) { diff.AppendFormat(fmt, "Part", Part.ToString(), ln); };
|
||||||
|
ln = inp.ReadLine(); if (ln != ((ushort)FlowId).ToString()){diff.AppendFormat(fmt, "FlowId", ((ushort)FlowId).ToString(), ln); };
|
||||||
ln = inp.ReadLine(); if (ln != CoefQfrom.ToString(ci)) { diff.AppendFormat(fmt, "CoefQfrom", CoefQfrom.ToString(ci), ln); };
|
ln = inp.ReadLine(); if (ln != CoefQfrom.ToString(ci)) { diff.AppendFormat(fmt, "CoefQfrom", CoefQfrom.ToString(ci), ln); };
|
||||||
ln = inp.ReadLine(); if (ln != CoefQto.ToString(ci)) { diff.AppendFormat(fmt, "CoefQto", CoefQto.ToString(ci), ln); };
|
ln = inp.ReadLine(); if (ln != CoefQto.ToString(ci)) { diff.AppendFormat(fmt, "CoefQto", CoefQto.ToString(ci), ln); };
|
||||||
ln = inp.ReadLine(); if (ln != ErrLimLo.ToString(ci)) { diff.AppendFormat(fmt, "ErrLimLo", ErrLimLo.ToString(ci), ln); };
|
ln = inp.ReadLine(); if (ln != ErrLimLo.ToString(ci)) { diff.AppendFormat(fmt, "ErrLimLo", ErrLimLo.ToString(ci), ln); };
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
///
|
///
|
||||||
/// Copyright (c) 2013-2021 Sensus Slovensko a.s.
|
/// Copyright (c) 2013-2023 Sensus Slovensko a.s.
|
||||||
///
|
///
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@@ -47,7 +47,7 @@ namespace Config.Entities
|
|||||||
public virtual int AltProcPeriod { get; set; } /// Period of alternative procedures (0 = no alt. procedure)
|
public virtual int AltProcPeriod { get; set; } /// Period of alternative procedures (0 = no alt. procedure)
|
||||||
|
|
||||||
public virtual float DN { get; set; } /// Not mapped to DB, valid in ProceduresCtrl for procedure filtering only
|
public virtual float DN { get; set; } /// Not mapped to DB, valid in ProceduresCtrl for procedure filtering only
|
||||||
public virtual float Qn { get; set; } /// - ' ' -
|
public virtual double Qn { get; set; } /// - ' ' -
|
||||||
public virtual string MClass { get; set; } /// - ' ' -
|
public virtual string MClass { get; set; } /// - ' ' -
|
||||||
public virtual string Producer { get; set; } /// - ' ' -
|
public virtual string Producer { get; set; } /// - ' ' -
|
||||||
|
|
||||||
@@ -75,7 +75,7 @@ namespace Config.Entities
|
|||||||
///
|
///
|
||||||
/// Default values
|
/// Default values
|
||||||
///
|
///
|
||||||
CreationUser = Users.CurrentUser.UserName();
|
CreationUser = Common.CurrentUser.UserName();
|
||||||
CreationTime = DateTime.Now;
|
CreationTime = DateTime.Now;
|
||||||
LastChgUser = CreationUser;
|
LastChgUser = CreationUser;
|
||||||
LastChgTime = CreationTime;
|
LastChgTime = CreationTime;
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ namespace Config.Entities
|
|||||||
///
|
///
|
||||||
/// Default values
|
/// Default values
|
||||||
///
|
///
|
||||||
CreationUser = Users.CurrentUser.UserName();
|
CreationUser = CurrentUser.UserName();
|
||||||
CreationTime = DateTime.Now;
|
CreationTime = DateTime.Now;
|
||||||
LastChgUser = CreationUser;
|
LastChgUser = CreationUser;
|
||||||
LastChgTime = CreationTime;
|
LastChgTime = CreationTime;
|
||||||
|
|||||||
+51
-75
@@ -1,5 +1,5 @@
|
|||||||
///
|
///
|
||||||
/// Copyright (c) 2013-2022 Sensus Slovensko a.s.
|
/// Copyright (c) 2013-2023 Sensus Slovensko a.s.
|
||||||
///
|
///
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@@ -19,14 +19,15 @@ namespace Config.Entities
|
|||||||
public virtual string Name { get; set; }
|
public virtual string Name { get; set; }
|
||||||
public virtual int Part { get; set; } /// Part=0 ... test of all WM-s
|
public virtual int Part { get; set; } /// Part=0 ... test of all WM-s
|
||||||
/// Part>0 ... part of a set of tests with the same Name: subset of WM-s is given by MetersPath
|
/// Part>0 ... part of a set of tests with the same Name: subset of WM-s is given by MetersPath
|
||||||
public virtual TestProfile Profile { get; set; } /// UserDefined, Protected, UserDefinedHeatMeter, ProtectedHeatMeter
|
public virtual TestProfile Profile { get; set; } /// UserDefined, UserDefinedCompound, UserDefinedHeatMeter, Protected, ProtectedCompound, ProtectedHeatMeter
|
||||||
public virtual sbyte Publish { get; set; } /// 0=no, 1=in all protocols, 2=on screen, 3=internal
|
public virtual sbyte Publish { get; set; } /// 0=no, 1=in all protocols, 2=on screen, 3=internal
|
||||||
public virtual bool DoEvaluate { get; set; }
|
public virtual bool DoEvaluate { get; set; }
|
||||||
public virtual float Qtg { get; set; } /// Target water flow [m3/h]
|
public virtual double Qtg { get; set; } /// When == -1 => Qtg is determined by the test method, otherwise Qtg is in [m3/h],
|
||||||
public virtual float Qfrom { get; set; } /// Water flow low limit in [m3/h]
|
public virtual double Qfrom { get; set; } /// Water flow low limit in [m3/h] or in [%] of Qtg
|
||||||
public virtual float Qto { get; set; } /// Water flow high limit in [m3/h]
|
public virtual double Qto { get; set; } /// Water flow high limit in [m3/h] or in [%] of Qtg
|
||||||
public virtual float Volume { get; set; } /// Test volume (target) in [l]
|
public virtual bool IsFromToInPct { get; set; } /// true: Qfrom and Qto are in % of Qtg, false: Qfrom and Qto are in [m3/h]
|
||||||
public virtual float TestTime { get; set; } /// Test time (estimate) in [s]
|
public virtual double Volume { get; set; } /// Test volume (target) in [l]
|
||||||
|
public virtual double TestTime { get; set; } /// Test time (estimate) in [s]
|
||||||
public virtual string Method { get; set; }
|
public virtual string Method { get; set; }
|
||||||
public virtual float ErrLimLo { get; set; } /// in [%] usually < 0, in case of heat meters: 1=class1, 2=class2, 3=class3
|
public virtual float ErrLimLo { get; set; } /// in [%] usually < 0, in case of heat meters: 1=class1, 2=class2, 3=class3
|
||||||
public virtual float ErrLimHi { get; set; } /// in [%] usually > 0, in case of heat meters: -Qn in m3/h
|
public virtual float ErrLimHi { get; set; } /// in [%] usually > 0, in case of heat meters: -Qn in m3/h
|
||||||
@@ -45,8 +46,7 @@ namespace Config.Entities
|
|||||||
public virtual int TimeFlow2Mass { get; set; } /// Delay time from the flow stable to the 1st mass measurement in [s]
|
public virtual int TimeFlow2Mass { get; set; } /// Delay time from the flow stable to the 1st mass measurement in [s]
|
||||||
public virtual int TimePump2StartV { get; set; } /// Delay time from the start of the pump to opening the start valve in [s]
|
public virtual int TimePump2StartV { get; set; } /// Delay time from the start of the pump to opening the start valve in [s]
|
||||||
public virtual int TimeStop2Mass { get; set; } /// Delay time from the test end (diverted) to the 2nd mass measuremen in [s]
|
public virtual int TimeStop2Mass { get; set; } /// Delay time from the test end (diverted) to the 2nd mass measuremen in [s]
|
||||||
public virtual double ShortPulses { get; set; } /// = Filter
|
public virtual int ShortPulses { get; set; } /// Short pulses
|
||||||
public virtual string RedType { get; set; }
|
|
||||||
public virtual string FeedingPath { get; set; }
|
public virtual string FeedingPath { get; set; }
|
||||||
public virtual string BenchPath { get; set; }
|
public virtual string BenchPath { get; set; }
|
||||||
public virtual string OutputPath { get; set; }
|
public virtual string OutputPath { get; set; }
|
||||||
@@ -57,14 +57,12 @@ namespace Config.Entities
|
|||||||
public virtual string TransBefore { get; set; }
|
public virtual string TransBefore { get; set; }
|
||||||
public virtual string TransBetween { get; set; }
|
public virtual string TransBetween { get; set; }
|
||||||
public virtual string TransAfter { get; set; }
|
public virtual string TransAfter { get; set; }
|
||||||
#if ORACLE_DB
|
|
||||||
public virtual int OraId { get; set; }
|
public virtual IList<ComponentTest> MoreParams { get; set; }
|
||||||
public virtual int OraIdRepetMulti { get; set; }
|
|
||||||
public virtual string OraDesignation { get; set; }
|
public virtual Procedure Procedure { get; set; }
|
||||||
public virtual int RawDataId { get; set; }
|
|
||||||
public virtual int RawDataIdRepetMulti { get; set; }
|
/// Additional stuff not mapped into the database
|
||||||
public virtual string RawDataDesignation { get; set; }
|
|
||||||
#endif
|
|
||||||
public virtual bool IsOuterLoopStart { get; set; } /// Not mapped to database
|
public virtual bool IsOuterLoopStart { get; set; } /// Not mapped to database
|
||||||
public virtual bool IsOuterLoopEnd { get; set; } /// Not mapped to database
|
public virtual bool IsOuterLoopEnd { get; set; } /// Not mapped to database
|
||||||
|
|
||||||
@@ -80,12 +78,17 @@ namespace Config.Entities
|
|||||||
public virtual Unit TempUnit { get; set; } /// Not mapped to database, used in ProcedureDlg / Metrology1Tab
|
public virtual Unit TempUnit { get; set; } /// Not mapped to database, used in ProcedureDlg / Metrology1Tab
|
||||||
public virtual Unit PressUnit { get; set; } /// Not mapped to database, used in ProcedureDlg / Metrology1Tab
|
public virtual Unit PressUnit { get; set; } /// Not mapped to database, used in ProcedureDlg / Metrology1Tab
|
||||||
public virtual Unit LengthUnit { get; set; } /// Not mapped to database, used in ProcedureDlg / Metrology1Tab
|
public virtual Unit LengthUnit { get; set; } /// Not mapped to database, used in ProcedureDlg / Metrology1Tab
|
||||||
|
public virtual Unit ElectricUnit { get; set; } /// Not mapped to database, used in ProcedureDlg / Metrology1Tab
|
||||||
|
|
||||||
public virtual IList<ComponentTest> MoreParams { get; set; }
|
/// Wrappers
|
||||||
|
public virtual double QfromM3ph()
|
||||||
public virtual Procedure Procedure { get; set; }
|
{
|
||||||
|
return !IsFromToInPct ? Qfrom : Qtg >= 0 ? Qtg * Qfrom / 100 : 0;
|
||||||
/// ------------- Additional stuff not mapped into the database -------------
|
}
|
||||||
|
public virtual double QtoM3ph()
|
||||||
|
{
|
||||||
|
return !IsFromToInPct ? Qto : Qtg >= 0 ? Qtg * Qto / 100 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
public Test()
|
public Test()
|
||||||
{
|
{
|
||||||
@@ -98,6 +101,7 @@ namespace Config.Entities
|
|||||||
Profile = TestProfile.UserDefined;
|
Profile = TestProfile.UserDefined;
|
||||||
Publish = (sbyte)Common.Publish.Always;
|
Publish = (sbyte)Common.Publish.Always;
|
||||||
DoEvaluate = true;
|
DoEvaluate = true;
|
||||||
|
IsFromToInPct = false;
|
||||||
ErrLimLo = -2.0f; /// [%] lower error limit
|
ErrLimLo = -2.0f; /// [%] lower error limit
|
||||||
ErrLimHi = 2.0f; /// [%] upper error limit
|
ErrLimHi = 2.0f; /// [%] upper error limit
|
||||||
Uncertainty = 0;
|
Uncertainty = 0;
|
||||||
@@ -119,14 +123,6 @@ namespace Config.Entities
|
|||||||
TransBefore = string.Empty;
|
TransBefore = string.Empty;
|
||||||
TransBetween = string.Empty;
|
TransBetween = string.Empty;
|
||||||
TransAfter = string.Empty;
|
TransAfter = string.Empty;
|
||||||
#if ORACLE_DB
|
|
||||||
OraId = 0;
|
|
||||||
OraIdRepetMulti = 0;
|
|
||||||
OraDesignation = string.Empty;
|
|
||||||
RawDataId = 0;
|
|
||||||
RawDataIdRepetMulti = 0;
|
|
||||||
RawDataDesignation = string.Empty;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Test(string name, int itemNr, Procedure procedure)
|
public Test(string name, int itemNr, Procedure procedure)
|
||||||
@@ -175,6 +171,7 @@ namespace Config.Entities
|
|||||||
result.Qtg = Qtg;
|
result.Qtg = Qtg;
|
||||||
result.Qfrom = Qfrom;
|
result.Qfrom = Qfrom;
|
||||||
result.Qto = Qto;
|
result.Qto = Qto;
|
||||||
|
result.IsFromToInPct = IsFromToInPct;
|
||||||
result.Volume = Volume;
|
result.Volume = Volume;
|
||||||
result.TestTime = TestTime;
|
result.TestTime = TestTime;
|
||||||
result.Method = Method;
|
result.Method = Method;
|
||||||
@@ -196,7 +193,6 @@ namespace Config.Entities
|
|||||||
result.TimePump2StartV = TimePump2StartV;
|
result.TimePump2StartV = TimePump2StartV;
|
||||||
result.TimeStop2Mass = TimeStop2Mass;
|
result.TimeStop2Mass = TimeStop2Mass;
|
||||||
result.ShortPulses = ShortPulses;
|
result.ShortPulses = ShortPulses;
|
||||||
result.RedType = RedType;
|
|
||||||
result.FeedingPath = FeedingPath;
|
result.FeedingPath = FeedingPath;
|
||||||
result.BenchPath = BenchPath;
|
result.BenchPath = BenchPath;
|
||||||
result.OutputPath = OutputPath;
|
result.OutputPath = OutputPath;
|
||||||
@@ -207,20 +203,14 @@ namespace Config.Entities
|
|||||||
result.TransBefore = TransBefore;
|
result.TransBefore = TransBefore;
|
||||||
result.TransBetween = TransBetween;
|
result.TransBetween = TransBetween;
|
||||||
result.TransAfter = TransAfter;
|
result.TransAfter = TransAfter;
|
||||||
#if ORACLE_DB
|
|
||||||
result.OraId = OraId;
|
|
||||||
result.OraIdRepetMulti = OraIdRepetMulti;
|
|
||||||
result.OraDesignation = OraDesignation;
|
|
||||||
result.RawDataId = RawDataId;
|
|
||||||
result.RawDataIdRepetMulti = RawDataIdRepetMulti;
|
|
||||||
result.RawDataDesignation = RawDataDesignation;
|
|
||||||
#endif
|
|
||||||
result.VolumeUnit = VolumeUnit;
|
result.VolumeUnit = VolumeUnit;
|
||||||
result.FlowUnit = FlowUnit;
|
result.FlowUnit = FlowUnit;
|
||||||
|
result.FlowUnit = FlowUnit;
|
||||||
result.MassUnit = MassUnit;
|
result.MassUnit = MassUnit;
|
||||||
result.TempUnit = TempUnit;
|
result.TempUnit = TempUnit;
|
||||||
result.PressUnit = PressUnit;
|
result.PressUnit = PressUnit;
|
||||||
result.LengthUnit = LengthUnit;
|
result.LengthUnit = LengthUnit;
|
||||||
|
result.ElectricUnit = ElectricUnit;
|
||||||
foreach (var prms in MoreParams) { result.MoreParams.Add(prms.Clone()); }
|
foreach (var prms in MoreParams) { result.MoreParams.Add(prms.Clone()); }
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@@ -237,6 +227,7 @@ namespace Config.Entities
|
|||||||
output.WriteLine(Qtg.ToString(ci));
|
output.WriteLine(Qtg.ToString(ci));
|
||||||
output.WriteLine(Qfrom.ToString(ci));
|
output.WriteLine(Qfrom.ToString(ci));
|
||||||
output.WriteLine(Qto.ToString(ci));
|
output.WriteLine(Qto.ToString(ci));
|
||||||
|
output.WriteLine(IsFromToInPct.ToString());
|
||||||
output.WriteLine(Volume.ToString(ci));
|
output.WriteLine(Volume.ToString(ci));
|
||||||
output.WriteLine(TestTime.ToString(ci));
|
output.WriteLine(TestTime.ToString(ci));
|
||||||
output.WriteLine(Method);
|
output.WriteLine(Method);
|
||||||
@@ -257,6 +248,7 @@ namespace Config.Entities
|
|||||||
output.WriteLine(TimeFlow2Mass.ToString(ci));
|
output.WriteLine(TimeFlow2Mass.ToString(ci));
|
||||||
output.WriteLine(TimePump2StartV.ToString(ci));
|
output.WriteLine(TimePump2StartV.ToString(ci));
|
||||||
output.WriteLine(TimeStop2Mass.ToString(ci));
|
output.WriteLine(TimeStop2Mass.ToString(ci));
|
||||||
|
output.WriteLine(ShortPulses.ToString(ci));
|
||||||
output.WriteLine(FeedingPath);
|
output.WriteLine(FeedingPath);
|
||||||
output.WriteLine(BenchPath);
|
output.WriteLine(BenchPath);
|
||||||
output.WriteLine(OutputPath);
|
output.WriteLine(OutputPath);
|
||||||
@@ -265,14 +257,7 @@ namespace Config.Entities
|
|||||||
output.WriteLine(TransBetween);
|
output.WriteLine(TransBetween);
|
||||||
output.WriteLine(Profile);
|
output.WriteLine(Profile);
|
||||||
output.WriteLine(TransAfter);
|
output.WriteLine(TransAfter);
|
||||||
#if ORACLE_DB
|
|
||||||
output.WriteLine(OraId);
|
|
||||||
output.WriteLine(OraIdRepetMulti);
|
|
||||||
output.WriteLine(OraDesignation);
|
|
||||||
output.WriteLine(RawDataId);
|
|
||||||
output.WriteLine(RawDataIdRepetMulti);
|
|
||||||
output.WriteLine(RawDataDesignation);
|
|
||||||
#endif
|
|
||||||
foreach (var prms in MoreParams) { prms.Export(output); }
|
foreach (var prms in MoreParams) { prms.Export(output); }
|
||||||
output.WriteLine();
|
output.WriteLine();
|
||||||
}
|
}
|
||||||
@@ -292,11 +277,12 @@ namespace Config.Entities
|
|||||||
tst.Part = int.Parse(input.ReadLine(), ci);
|
tst.Part = int.Parse(input.ReadLine(), ci);
|
||||||
tst.Publish = sbyte.Parse(input.ReadLine(), ci);
|
tst.Publish = sbyte.Parse(input.ReadLine(), ci);
|
||||||
tst.DoEvaluate = bool.Parse(input.ReadLine());
|
tst.DoEvaluate = bool.Parse(input.ReadLine());
|
||||||
tst.Qtg = float.Parse(input.ReadLine(), ci);
|
tst.Qtg = double.Parse(input.ReadLine(), ci);
|
||||||
tst.Qfrom = float.Parse(input.ReadLine(), ci);
|
tst.Qfrom = double.Parse(input.ReadLine(), ci);
|
||||||
tst.Qto = float.Parse(input.ReadLine(), ci);
|
tst.Qto = double.Parse(input.ReadLine(), ci);
|
||||||
tst.Volume = float.Parse(input.ReadLine(), ci);
|
tst.IsFromToInPct = bool.Parse(input.ReadLine());
|
||||||
tst.TestTime = float.Parse(input.ReadLine(), ci);
|
tst.Volume = double.Parse(input.ReadLine(), ci);
|
||||||
|
tst.TestTime = double.Parse(input.ReadLine(), ci);
|
||||||
tst.Method = input.ReadLine();
|
tst.Method = input.ReadLine();
|
||||||
tst.ErrLimLo = float.Parse(input.ReadLine(), ci);
|
tst.ErrLimLo = float.Parse(input.ReadLine(), ci);
|
||||||
tst.ErrLimHi = float.Parse(input.ReadLine(), ci);
|
tst.ErrLimHi = float.Parse(input.ReadLine(), ci);
|
||||||
@@ -315,6 +301,7 @@ namespace Config.Entities
|
|||||||
tst.TimeFlow2Mass = int.Parse(input.ReadLine(), ci);
|
tst.TimeFlow2Mass = int.Parse(input.ReadLine(), ci);
|
||||||
tst.TimePump2StartV = int.Parse(input.ReadLine(), ci);
|
tst.TimePump2StartV = int.Parse(input.ReadLine(), ci);
|
||||||
tst.TimeStop2Mass = int.Parse(input.ReadLine(), ci);
|
tst.TimeStop2Mass = int.Parse(input.ReadLine(), ci);
|
||||||
|
tst.ShortPulses = int.Parse(input.ReadLine(), ci);
|
||||||
tst.FeedingPath = input.ReadLine();
|
tst.FeedingPath = input.ReadLine();
|
||||||
tst.BenchPath = input.ReadLine();
|
tst.BenchPath = input.ReadLine();
|
||||||
tst.OutputPath = input.ReadLine();
|
tst.OutputPath = input.ReadLine();
|
||||||
@@ -323,17 +310,12 @@ namespace Config.Entities
|
|||||||
tst.TransBetween = input.ReadLine();
|
tst.TransBetween = input.ReadLine();
|
||||||
string line = input.ReadLine();
|
string line = input.ReadLine();
|
||||||
tst.Profile = line.Equals(TestProfile.ProtectedHeatMeter.ToString()) ? TestProfile.ProtectedHeatMeter
|
tst.Profile = line.Equals(TestProfile.ProtectedHeatMeter.ToString()) ? TestProfile.ProtectedHeatMeter
|
||||||
|
: line.Equals(TestProfile.ProtectedCompound.ToString()) ? TestProfile.ProtectedCompound
|
||||||
|
: line.Equals(TestProfile.Protected.ToString()) ? TestProfile.Protected
|
||||||
: line.Equals(TestProfile.UserDefinedHeatMeter.ToString()) ? TestProfile.UserDefinedHeatMeter
|
: line.Equals(TestProfile.UserDefinedHeatMeter.ToString()) ? TestProfile.UserDefinedHeatMeter
|
||||||
: line.Equals(TestProfile.Protected.ToString()) ? TestProfile.Protected : TestProfile.UserDefined; /// UserDefined is the default
|
: line.Equals(TestProfile.UserDefinedCompound.ToString()) ? TestProfile.UserDefinedCompound
|
||||||
|
: TestProfile.UserDefined; /// UserDefined is the default
|
||||||
tst.TransAfter = input.ReadLine();
|
tst.TransAfter = input.ReadLine();
|
||||||
#if ORACLE_DB
|
|
||||||
tst.OraId = int.Parse(input.ReadLine(), ci);
|
|
||||||
tst.OraIdRepetMulti = int.Parse(input.ReadLine(), ci);
|
|
||||||
tst.OraDesignation = input.ReadLine();
|
|
||||||
tst.RawDataId = int.Parse(input.ReadLine(), ci);
|
|
||||||
tst.RawDataIdRepetMulti = int.Parse(input.ReadLine(), ci);
|
|
||||||
tst.RawDataDesignation = input.ReadLine();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
@@ -365,6 +347,7 @@ namespace Config.Entities
|
|||||||
ln = inp.ReadLine(); if (ln != Qtg.ToString(ci)) { diff.AppendFormat(fmt, "Qtg", Qtg.ToString(ci), ln); };
|
ln = inp.ReadLine(); if (ln != Qtg.ToString(ci)) { diff.AppendFormat(fmt, "Qtg", Qtg.ToString(ci), ln); };
|
||||||
ln = inp.ReadLine(); if (ln != Qfrom.ToString(ci)) { diff.AppendFormat(fmt, "Qfrom", Qfrom.ToString(ci), ln); };
|
ln = inp.ReadLine(); if (ln != Qfrom.ToString(ci)) { diff.AppendFormat(fmt, "Qfrom", Qfrom.ToString(ci), ln); };
|
||||||
ln = inp.ReadLine(); if (ln != Qto.ToString(ci)) { diff.AppendFormat(fmt, "Qto", Qto.ToString(ci), ln); };
|
ln = inp.ReadLine(); if (ln != Qto.ToString(ci)) { diff.AppendFormat(fmt, "Qto", Qto.ToString(ci), ln); };
|
||||||
|
ln = inp.ReadLine(); if (ln != IsFromToInPct.ToString()) { diff.AppendFormat(fmt, "IsFromToInPct", IsFromToInPct.ToString(), ln); };
|
||||||
ln = inp.ReadLine(); if (ln != Volume.ToString(ci)) { diff.AppendFormat(fmt, "Volume", Volume.ToString(ci), ln); };
|
ln = inp.ReadLine(); if (ln != Volume.ToString(ci)) { diff.AppendFormat(fmt, "Volume", Volume.ToString(ci), ln); };
|
||||||
ln = inp.ReadLine(); if (ln != TestTime.ToString(ci)) { diff.AppendFormat(fmt, "TstTime", TestTime.ToString(ci), ln); };
|
ln = inp.ReadLine(); if (ln != TestTime.ToString(ci)) { diff.AppendFormat(fmt, "TstTime", TestTime.ToString(ci), ln); };
|
||||||
ln = inp.ReadLine(); if (ln != Method) { diff.AppendFormat(fmt, "Method", Method, ln); };
|
ln = inp.ReadLine(); if (ln != Method) { diff.AppendFormat(fmt, "Method", Method, ln); };
|
||||||
@@ -372,8 +355,8 @@ namespace Config.Entities
|
|||||||
ln = inp.ReadLine(); if (ln != ErrLimHi.ToString(ci)) { diff.AppendFormat(fmt, "ErrLimHi", ErrLimHi.ToString(ci), ln); };
|
ln = inp.ReadLine(); if (ln != ErrLimHi.ToString(ci)) { diff.AppendFormat(fmt, "ErrLimHi", ErrLimHi.ToString(ci), ln); };
|
||||||
ln = inp.ReadLine(); if (ln != Uncertainty.ToString(ci)) { diff.AppendFormat(fmt, "Uncertainty", Uncertainty.ToString(ci), ln); };
|
ln = inp.ReadLine(); if (ln != Uncertainty.ToString(ci)) { diff.AppendFormat(fmt, "Uncertainty", Uncertainty.ToString(ci), ln); };
|
||||||
ln = inp.ReadLine(); if (ln != Repeats.ToString(ci)) { diff.AppendFormat(fmt, "Repeats", Repeats.ToString(ci), ln); };
|
ln = inp.ReadLine(); if (ln != Repeats.ToString(ci)) { diff.AppendFormat(fmt, "Repeats", Repeats.ToString(ci), ln); };
|
||||||
ln = inp.ReadLine(); if (ln != DoDraining.ToString(ci)) { diff.AppendFormat(fmt, "Draining", DoDraining.ToString(ci), ln); };
|
ln = inp.ReadLine(); if (ln != DoDraining.ToString()) { diff.AppendFormat(fmt, "DoDraining", DoDraining.ToString(), ln); };
|
||||||
ln = inp.ReadLine(); if (ln != DoDrainingAfter.ToString(ci)) { diff.AppendFormat(fmt, "Zeroing", DoDrainingAfter.ToString(ci), ln); };
|
ln = inp.ReadLine(); if (ln != DoDrainingAfter.ToString()) { diff.AppendFormat(fmt, "DoDrainingAfter", DoDrainingAfter.ToString(), ln); };
|
||||||
ln = inp.ReadLine(); if (ln != TempLimLo.ToString(ci)) { diff.AppendFormat(fmt, "TempLimLo", TempLimLo.ToString(ci), ln); };
|
ln = inp.ReadLine(); if (ln != TempLimLo.ToString(ci)) { diff.AppendFormat(fmt, "TempLimLo", TempLimLo.ToString(ci), ln); };
|
||||||
ln = inp.ReadLine(); if (ln != TempLimHi.ToString(ci)) { diff.AppendFormat(fmt, "TempLimHi", TempLimHi.ToString(ci), ln); };
|
ln = inp.ReadLine(); if (ln != TempLimHi.ToString(ci)) { diff.AppendFormat(fmt, "TempLimHi", TempLimHi.ToString(ci), ln); };
|
||||||
ln = inp.ReadLine(); if (ln != TempControl) { diff.AppendFormat(fmt, "TempController", TempControl, ln); };
|
ln = inp.ReadLine(); if (ln != TempControl) { diff.AppendFormat(fmt, "TempController", TempControl, ln); };
|
||||||
@@ -389,18 +372,11 @@ namespace Config.Entities
|
|||||||
ln = inp.ReadLine(); if (ln != BenchPath) { diff.AppendFormat(fmt, "BenchPath", BenchPath, ln); };
|
ln = inp.ReadLine(); if (ln != BenchPath) { diff.AppendFormat(fmt, "BenchPath", BenchPath, ln); };
|
||||||
ln = inp.ReadLine(); if (ln != OutputPath) { diff.AppendFormat(fmt, "OutputPath", OutputPath, ln); };
|
ln = inp.ReadLine(); if (ln != OutputPath) { diff.AppendFormat(fmt, "OutputPath", OutputPath, ln); };
|
||||||
ln = inp.ReadLine(); if (ln != MetersPath) { diff.AppendFormat(fmt, "MetersPath", MetersPath, ln); };
|
ln = inp.ReadLine(); if (ln != MetersPath) { diff.AppendFormat(fmt, "MetersPath", MetersPath, ln); };
|
||||||
ln = inp.ReadLine(); if (ln != TransBefore) { diff.AppendFormat(fmt, "RelTransBefore", TransBefore, ln); };
|
ln = inp.ReadLine(); if (ln != TransBefore) { diff.AppendFormat(fmt, "TransBefore", TransBefore, ln); };
|
||||||
ln = inp.ReadLine(); if (ln != TransBetween) { diff.AppendFormat(fmt, "RelTransBetween", TransBetween, ln); };
|
ln = inp.ReadLine(); if (ln != TransBetween) { diff.AppendFormat(fmt, "TransBetween", TransBetween, ln); };
|
||||||
ln = inp.ReadLine(); if (ln != Profile.ToString()) { diff.AppendFormat(fmt, "RelTransAfter", Profile, ln); };
|
ln = inp.ReadLine(); if (ln != Profile.ToString()) { diff.AppendFormat(fmt, "Profile", Profile, ln); };
|
||||||
ln = inp.ReadLine(); if (ln != TransAfter) { diff.AppendFormat(fmt, "TransitionAfter", TransAfter, ln); };
|
ln = inp.ReadLine(); if (ln != TransAfter) { diff.AppendFormat(fmt, "TransAfter", TransAfter, ln); };
|
||||||
#if ORACLE_DB
|
|
||||||
ln = inp.ReadLine(); if (ln != OraId.ToString(ci)) { diff.AppendFormat(fmt, "OraId", OraId.ToString(ci), ln); };
|
|
||||||
ln = inp.ReadLine(); if (ln != OraIdRepetMulti.ToString(ci)) { diff.AppendFormat(fmt, "OraIdRepetMulti", OraIdRepetMulti.ToString(ci), ln); };
|
|
||||||
ln = inp.ReadLine(); if (ln != OraDesignation) { diff.AppendFormat(fmt, "OraDesignation", OraDesignation, ln); };
|
|
||||||
ln = inp.ReadLine(); if (ln != RawDataId.ToString(ci)) { diff.AppendFormat(fmt, "RawDataId", RawDataId.ToString(ci), ln); };
|
|
||||||
ln = inp.ReadLine(); if (ln != RawDataIdRepetMulti.ToString(ci)){ diff.AppendFormat(fmt, "RawDataIdRepetMulti", RawDataIdRepetMulti.ToString(ci), ln); };
|
|
||||||
ln = inp.ReadLine(); if (ln != RawDataDesignation) { diff.AppendFormat(fmt, "RawDataDesignation", RawDataDesignation, ln); };
|
|
||||||
#endif
|
|
||||||
return diff.ToString();
|
return diff.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+167
-5
@@ -1,13 +1,18 @@
|
|||||||
///
|
///
|
||||||
/// Copyright (c) 2013-2019 Sensus Slovensko a.s.
|
/// Copyright (c) 2013-2021 Sensus Slovensko a.s.
|
||||||
///
|
///
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using log4net;
|
||||||
|
using Common;
|
||||||
|
using Config.Resources;
|
||||||
|
|
||||||
namespace Config.Entities
|
namespace Config.Entities
|
||||||
{
|
{
|
||||||
public class User
|
public class User : Common.IUser
|
||||||
{
|
{
|
||||||
|
static readonly ILog log = LogManager.GetLogger(typeof(User));
|
||||||
|
|
||||||
public virtual int Id { get; protected set; }
|
public virtual int Id { get; protected set; }
|
||||||
public virtual string UserName { get; set; } /// = name, alias, abbreviation
|
public virtual string UserName { get; set; } /// = name, alias, abbreviation
|
||||||
public virtual string FullName { get; set; } /// = description
|
public virtual string FullName { get; set; } /// = description
|
||||||
@@ -20,11 +25,27 @@ namespace Config.Entities
|
|||||||
public virtual DateTime LastPwChange { get; set; }
|
public virtual DateTime LastPwChange { get; set; }
|
||||||
public virtual IList<Group> Groups { get; set; } //User can be a member of a list of groups
|
public virtual IList<Group> Groups { get; set; } //User can be a member of a list of groups
|
||||||
|
|
||||||
|
private bool powerUser; /// true for built-in users, power users have full access even with empty Groups list
|
||||||
|
public virtual bool IsPowerUser() { return powerUser; }
|
||||||
|
|
||||||
|
private string legalizator; /// Not mapped to a database !!!, 2nd user entered in a logging dialog
|
||||||
|
public virtual void SetLegalizator(string value) { legalizator = value; }
|
||||||
|
public virtual string GetLegalizator() { return legalizator; }
|
||||||
|
|
||||||
public User()
|
public User()
|
||||||
{
|
{
|
||||||
Groups = new List<Group>();
|
Groups = new List<Group>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public User(string userName, int number, bool powerUser)
|
||||||
|
{
|
||||||
|
UserName = userName;
|
||||||
|
Number = number;
|
||||||
|
this.powerUser = powerUser;
|
||||||
|
Groups = new List<Group>();
|
||||||
|
FullName = powerUser ? "Power User" : string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Adds a group to the user.
|
/// Adds a group to the user.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -35,13 +56,154 @@ namespace Config.Entities
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Encrypts and sets users password.
|
/// All members are copied except of ID (so that NHibernate works properly).
|
||||||
|
/// List of groups is empty.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="password">Unencrypted password</param>
|
/// <param name="user"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public virtual object Clone()
|
||||||
|
{
|
||||||
|
User newUser = new User(UserName, Number, false);
|
||||||
|
newUser.FullName = FullName;
|
||||||
|
newUser.Number = Number;
|
||||||
|
newUser.Tag = Tag;
|
||||||
|
newUser.Password = Password;
|
||||||
|
newUser.LastPwChange = LastPwChange;
|
||||||
|
return newUser;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return (UserName != null) ? UserName : Number.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// ------------- Additional stuff not mapped into the database -------------
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Check whether user is a member of a group.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="groupId">Group GID</param>
|
||||||
|
/// <returns>true is user is a member of the specified group</returns>
|
||||||
|
public virtual bool IsMemberOf(GID groupId)
|
||||||
|
{
|
||||||
|
if (powerUser)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if ((groupId >= 0) && (groupId < GID.NrOfGroups))
|
||||||
|
{
|
||||||
|
foreach (var g in Groups)
|
||||||
|
{
|
||||||
|
if (g.GID == groupId) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Check whether user is a member of any of specified groups.
|
||||||
|
/// Returns true also when no groups are defined (groupIds = null).
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="groupIds">An array of group GID-s or null (no membership required)</param>
|
||||||
|
/// <returns>true if user is a member of any of specified groups</returns>
|
||||||
|
public virtual bool IsMemberOf(GID[] groupIds)
|
||||||
|
{
|
||||||
|
if (groupIds == null || powerUser)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var gid in groupIds)
|
||||||
|
{
|
||||||
|
if ((gid >= 0) && (gid < GID.NrOfGroups))
|
||||||
|
{
|
||||||
|
/// for all group elements in User.Groups
|
||||||
|
foreach (var grp in Groups)
|
||||||
|
{
|
||||||
|
/// element GID = parameter GroupId ?
|
||||||
|
if (grp.GID == gid) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Checks requirements on the password regardless of the password history
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="password">Password</param>
|
||||||
|
/// <returns>true when the password is OK</returns>
|
||||||
|
public static bool IsPasswordMeetsRequirements(string password, out string explanation)
|
||||||
|
{
|
||||||
|
return Common.Utils.IsPasswordMeetsRequirements(password, out explanation);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns true when password was already used in the past
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="passwordCandidate">Password</param>
|
||||||
|
/// <returns>false when password is new, true when it was used in the past</returns>
|
||||||
|
public virtual bool IsPasswordUsedInPast(string passwordCandidate)
|
||||||
|
{
|
||||||
|
string encryptedPW = EncryptedPassword(passwordCandidate);
|
||||||
|
return (encryptedPW == Password) || (encryptedPW == Password2) || (encryptedPW == Password3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Checks 'LastPwChange' and returns true when password expired
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></ returns>
|
||||||
|
public virtual bool IsPasswordExpired()
|
||||||
|
{
|
||||||
|
if (IsPowerUser() || IsMemberOf(GID.Administrators) || CurrentUser.PasswdExpirationPeriodDays == 0)
|
||||||
|
{
|
||||||
|
/// Password cannot expirate for this user or this feature is disabled in Backup and Security options
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Password expiration time is 3 months
|
||||||
|
return (DateTime.Now - LastPwChange > new TimeSpan(CurrentUser.PasswdExpirationPeriodDays, 0, 0, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Encrypts and saves users password.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="password">Password</param>
|
||||||
public virtual void SetPassword(string password)
|
public virtual void SetPassword(string password)
|
||||||
{
|
{
|
||||||
Password = Users.Entities.User.getHash(password);
|
Password4 = Password3;
|
||||||
|
Password3 = Password2;
|
||||||
|
Password2 = Password;
|
||||||
|
Password = EncryptedPassword(password);
|
||||||
LastPwChange = DateTime.Now;
|
LastPwChange = DateTime.Now;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string EncryptedPassword(string password)
|
||||||
|
{
|
||||||
|
return Common.Utils.GetHash(password);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Verifies users password. Used by static bool Authorisation(...)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="password">Password</param>
|
||||||
|
/// <returns>true if password is correct</returns>
|
||||||
|
public virtual bool IsCorrectPassword(string password)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(password) && string.IsNullOrEmpty(Password))
|
||||||
|
{
|
||||||
|
/// Currently saved and verified passwords are both empty => return true
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (Password == EncryptedPassword(password));
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual string ToEncodedStr()
|
||||||
|
{
|
||||||
|
return string.Format("{0}~{1}~{2}", UserName, FullName, legalizator);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+28
-26
@@ -1,5 +1,5 @@
|
|||||||
///
|
///
|
||||||
/// Copyright (c) 2013-2018 Sensus Slovensko a.s.
|
/// Copyright (c) 2013-2021 Sensus Slovensko a.s.
|
||||||
///
|
///
|
||||||
using System;
|
using System;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
@@ -8,17 +8,18 @@ using FluentNHibernate.Cfg.Db;
|
|||||||
using NHibernate;
|
using NHibernate;
|
||||||
using NHibernate.Cfg;
|
using NHibernate.Cfg;
|
||||||
using NHibernate.Tool.hbm2ddl;
|
using NHibernate.Tool.hbm2ddl;
|
||||||
|
using Common;
|
||||||
using Config.Resources;
|
using Config.Resources;
|
||||||
|
|
||||||
namespace Config
|
namespace Config
|
||||||
{
|
{
|
||||||
public static class FluentCommon
|
public class FluentCommon
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// NHibernate session factory (to create the database session 'SessionFactory')
|
/// NHibernate session factory (to create the database session 'SessionFactory')
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>A database session</returns>
|
/// <returns>A database session</returns>
|
||||||
public static ISessionFactory CreateSessionFactory(Common.DBKind database, Common.DBType dbType, string connectionString, bool createDB)
|
public static ISessionFactory CreateSessionFactory(DBKind database, DBType dbType, string connectionString, bool createDB)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -27,10 +28,10 @@ namespace Config
|
|||||||
switch (dbType)
|
switch (dbType)
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
case Common.DBType.MySql:
|
case DBType.MySql:
|
||||||
cfg = cfg.Database(MySQLConfiguration.Standard.ConnectionString(connectionString));
|
cfg = cfg.Database(MySQLConfiguration.Standard.ConnectionString(connectionString));
|
||||||
break;
|
break;
|
||||||
case Common.DBType.SQLite:
|
case DBType.SQLite:
|
||||||
cfg = cfg.Database(SQLiteConfiguration.Standard.UsingFile(connectionString));
|
cfg = cfg.Database(SQLiteConfiguration.Standard.UsingFile(connectionString));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -38,12 +39,12 @@ namespace Config
|
|||||||
switch (database)
|
switch (database)
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
case Common.DBKind.Config:
|
case DBKind.Config:
|
||||||
case Common.DBKind.RemoteConfig:
|
case DBKind.RemoteConfig:
|
||||||
cfg = cfg.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Data>());
|
cfg = cfg.Mappings(m => m.FluentMappings.AddFromAssemblyOf<FluentCommon>());
|
||||||
break;
|
break;
|
||||||
case Common.DBKind.Results:
|
case DBKind.Results:
|
||||||
cfg = cfg.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Data>());
|
cfg = cfg.Mappings(m => m.FluentMappings.AddFromAssemblyOf<FluentCommon>());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,9 +90,9 @@ namespace Config
|
|||||||
/// <param name="dbType">DBType.SQLite or DBType.MySql</param>
|
/// <param name="dbType">DBType.SQLite or DBType.MySql</param>
|
||||||
/// <param name="connectionString">Connection string</param>
|
/// <param name="connectionString">Connection string</param>
|
||||||
/// <returns>true=success, false=error</returns>
|
/// <returns>true=success, false=error</returns>
|
||||||
public static bool CreateEmptyConfigDB(Common.DBType dbType, string connectionString)
|
public static bool CreateEmptyConfigDB(DBType dbType, string connectionString)
|
||||||
{
|
{
|
||||||
ISessionFactory sessionFactory = CreateSessionFactory(Common.DBKind.Config, dbType, connectionString, true);
|
ISessionFactory sessionFactory = CreateSessionFactory(DBKind.Config, dbType, connectionString, true);
|
||||||
if (sessionFactory == null) return false;
|
if (sessionFactory == null) return false;
|
||||||
|
|
||||||
/// Populate the database
|
/// Populate the database
|
||||||
@@ -104,33 +105,34 @@ namespace Config
|
|||||||
///
|
///
|
||||||
var admin = new Config.Entities.User
|
var admin = new Config.Entities.User
|
||||||
{
|
{
|
||||||
UserName = Data.AdminUsername,
|
UserName = CurrentUser.AdminUsername,
|
||||||
FullName = Strings.Administrator,
|
FullName = Strings.Administrator,
|
||||||
LastPwChange = DateTime.Now
|
LastPwChange = DateTime.Now
|
||||||
};
|
};
|
||||||
admin.SetPassword(Data.AdminPassword);
|
admin.SetPassword(CurrentUser.AdminPassword);
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Prepare all groups, add some of them to admin
|
/// Prepare all groups, add some of them to admin
|
||||||
///
|
///
|
||||||
for (Common.GID gid = 0; gid < Common.GID.NrOfGroups; gid++)
|
for (GID gid = 0; gid < GID.NrOfGroups; gid++)
|
||||||
{
|
{
|
||||||
Config.Entities.Group group = new Config.Entities.Group(gid);
|
Config.Entities.Group group = new Config.Entities.Group(gid);
|
||||||
switch (gid)
|
switch (gid)
|
||||||
{
|
{
|
||||||
case Common.GID.Testers:
|
case GID.Testers:
|
||||||
case Common.GID.TestingSpecialists:
|
case GID.TestingSpecialists:
|
||||||
case Common.GID.HeadOfLab:
|
case GID.HeadOfLab:
|
||||||
case Common.GID.MaintenanceSpecialists:
|
case GID.MaintenanceSpecialists:
|
||||||
case Common.GID.Metrologists:
|
case GID.Metrologists:
|
||||||
case Common.GID.CalibrationSpecialists:
|
case GID.CalibrationSpecialists:
|
||||||
case Common.GID.Administrators:
|
case GID.Administrators:
|
||||||
#if TURA_IPERL || TURA_IPERL_NEW || TURA_SPECIAL
|
#if TURA_IPERL || TURA_IPERL_NEW || TURA_SPECIAL
|
||||||
case Common.GID.TraceabilityManagement:
|
case GID.TraceabilityManagement:
|
||||||
#elif KEMPNO_50 || KRAKOW_50 || TORUN_50 || WARSAW_50 || WARSAW_END
|
//#elif LANG_PL
|
||||||
case Common.GID.MetrologicalAuthority:
|
|
||||||
case Common.GID.WaterMeterAuthority:
|
|
||||||
#endif
|
#endif
|
||||||
|
case GID.MetrologicalAuthority:
|
||||||
|
case GID.WaterMeterAuthority:
|
||||||
|
|
||||||
admin.AddGroup(group);
|
admin.AddGroup(group);
|
||||||
session.SaveOrUpdate(group); /// Save this group
|
session.SaveOrUpdate(group); /// Save this group
|
||||||
break;
|
break;
|
||||||
|
|||||||
+5
-3
@@ -1,4 +1,4 @@
|
|||||||
///
|
///
|
||||||
/// Copyright (c) 2013-2018 Sensus Slovensko a.s.
|
/// Copyright (c) 2013-2018 Sensus Slovensko a.s.
|
||||||
///
|
///
|
||||||
using System;
|
using System;
|
||||||
@@ -6,6 +6,8 @@ using System.Collections.Generic;
|
|||||||
using log4net;
|
using log4net;
|
||||||
using Common;
|
using Common;
|
||||||
|
|
||||||
|
//formulas.cs has been added cause iPerl from master-2 ...MF
|
||||||
|
|
||||||
namespace Config
|
namespace Config
|
||||||
{
|
{
|
||||||
public static class Formulas
|
public static class Formulas
|
||||||
@@ -214,9 +216,9 @@ namespace Config
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static double ErrorFromVolumes(double measuredVolume, double trueVolume)
|
public static double ErrorFromVolumes(double measuredVolume, double trueVolume)
|
||||||
{
|
{
|
||||||
if (trueVolume <= float.Epsilon)
|
if (-float.Epsilon <= trueVolume && trueVolume <= float.Epsilon)
|
||||||
{
|
{
|
||||||
if (measuredVolume <= float.Epsilon)
|
if (-float.Epsilon <= measuredVolume && measuredVolume <= float.Epsilon)
|
||||||
{
|
{
|
||||||
log.WarnFormat("ErrorFromVolumes({0},{1}) returns {2}", measuredVolume, trueVolume, -100.0);
|
log.WarnFormat("ErrorFromVolumes({0},{1}) returns {2}", measuredVolume, trueVolume, -100.0);
|
||||||
return -100.0;
|
return -100.0;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
///
|
///
|
||||||
/// Copyright (c) 2013-2022 Sensus Slovensko a.s.
|
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||||
///
|
///
|
||||||
using FluentNHibernate.Mapping;
|
using FluentNHibernate.Mapping;
|
||||||
using Config.Entities;
|
using Config.Entities;
|
||||||
@@ -16,11 +16,14 @@ namespace Config.Mappings
|
|||||||
Map(x => x.Qfrom);
|
Map(x => x.Qfrom);
|
||||||
Map(x => x.Qto);
|
Map(x => x.Qto);
|
||||||
Map(x => x.Selector);
|
Map(x => x.Selector);
|
||||||
Map(x => x.TempMtrUp).Column("TempIn");
|
Map(x => x.TempMtrUp);
|
||||||
Map(x => x.TempMtrDown).Column("TempOut");
|
Map(x => x.TempMtrDown);
|
||||||
Map(x => x.PressMtrUp).Column("PressIn");
|
Map(x => x.PressMtrUp);
|
||||||
Map(x => x.PressMtrDown).Column("PressOut");
|
Map(x => x.PressMtrDown);
|
||||||
Map(x => x.PressMtrDelta);
|
Map(x => x.PressMtrDelta);
|
||||||
|
//Map(x => x.ElectricMtrUp);
|
||||||
|
//Map(x => x.ElectricMtrDown);
|
||||||
|
//Map(x => x.ElectricMtrDelta);
|
||||||
Map(x => x.StopBFValve);
|
Map(x => x.StopBFValve);
|
||||||
Map(x => x.ValvesOpen)
|
Map(x => x.ValvesOpen)
|
||||||
.CustomType("StringClob")
|
.CustomType("StringClob")
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
///
|
///
|
||||||
/// Copyright (c) 2013-2019 Sensus Slovensko a.s.
|
/// Copyright (c) 2013-2023 Sensus Slovensko a.s.
|
||||||
///
|
///
|
||||||
using FluentNHibernate.Mapping;
|
using FluentNHibernate.Mapping;
|
||||||
using Config.Entities;
|
using Config.Entities;
|
||||||
@@ -13,13 +13,13 @@ namespace Config.Mappings
|
|||||||
Id(x => x.Id);
|
Id(x => x.Id);
|
||||||
Map(x => x.Name);
|
Map(x => x.Name);
|
||||||
Map(x => x.ClassName);
|
Map(x => x.ClassName);
|
||||||
Map(x => x.ParentName);
|
Map(x => x.Parent);
|
||||||
Map(x => x.ItemNr);
|
Map(x => x.ItemNr);
|
||||||
Map(x => x.Mode);
|
Map(x => x.DebugMode);
|
||||||
Map(x => x.Logging);
|
Map(x => x.LogLevel);
|
||||||
Map(x => x.Parameters)
|
Map(x => x.Parameters)
|
||||||
.CustomType("StringClob")
|
.CustomType("StringClob")
|
||||||
.CustomSqlType("varchar(8000)");
|
.CustomSqlType("varchar(12000)");
|
||||||
HasMany(x => x.Corrections)
|
HasMany(x => x.Corrections)
|
||||||
.OrderBy("Measurement")
|
.OrderBy("Measurement")
|
||||||
.Cascade.All();
|
.Cascade.All();
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
///
|
///
|
||||||
/// Copyright (c) 2013-2022 Sensus Slovensko a.s.
|
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||||
///
|
///
|
||||||
using FluentNHibernate.Mapping;
|
using FluentNHibernate.Mapping;
|
||||||
using Config.Entities;
|
using Config.Entities;
|
||||||
@@ -17,7 +17,7 @@ namespace Config.Mappings
|
|||||||
Map(x => x.Qto);
|
Map(x => x.Qto);
|
||||||
Map(x => x.Selector);
|
Map(x => x.Selector);
|
||||||
Map(x => x.Pump);
|
Map(x => x.Pump);
|
||||||
Map(x => x.RegulValvesPct);
|
Map(x => x.RegVPositions);
|
||||||
Map(x => x.ValvesOpen)
|
Map(x => x.ValvesOpen)
|
||||||
.CustomType("StringClob")
|
.CustomType("StringClob")
|
||||||
.CustomSqlType("varchar(8000)");
|
.CustomSqlType("varchar(8000)");
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
///
|
///
|
||||||
/// Copyright (c) 2013-2018 Sensus Slovensko a.s.
|
/// Copyright (c) 2013-2021 Sensus Slovensko a.s.
|
||||||
///
|
///
|
||||||
using FluentNHibernate.Mapping;
|
using FluentNHibernate.Mapping;
|
||||||
using Config.Entities;
|
using Config.Entities;
|
||||||
|
|
||||||
namespace Config.Mappings
|
namespace Config.Mappings
|
||||||
{
|
{
|
||||||
class MeasurementCorrectionMap : ClassMap<MeasurementCorrection>
|
class MeasurementCorrectionMap : ClassMap<Entities.MeasurementCorrection>
|
||||||
{
|
{
|
||||||
public MeasurementCorrectionMap()
|
public MeasurementCorrectionMap()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
///
|
///
|
||||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
/// Copyright (c) 2013-2021 Sensus Slovensko a.s.
|
||||||
///
|
///
|
||||||
using FluentNHibernate.Mapping;
|
using FluentNHibernate.Mapping;
|
||||||
using Config.Entities;
|
|
||||||
|
|
||||||
namespace Config.Mappings
|
namespace Config.Mappings
|
||||||
{
|
{
|
||||||
class MetersPathMap : ClassMap<MetersPath>
|
class MetersPathMap : ClassMap<Entities.MetersPath>
|
||||||
{
|
{
|
||||||
public MetersPathMap()
|
public MetersPathMap()
|
||||||
{
|
{
|
||||||
@@ -14,48 +13,26 @@ namespace Config.Mappings
|
|||||||
Map(x => x.ItemNr);
|
Map(x => x.ItemNr);
|
||||||
Map(x => x.Name);
|
Map(x => x.Name);
|
||||||
|
|
||||||
#pragma warning disable
|
Map(x => x.Sensor1);
|
||||||
if (Config.Data.WMsCount >= 1) Map(x => x.Sensor1);
|
Map(x => x.Sensor2);
|
||||||
if (Config.Data.WMsCount >= 2) Map(x => x.Sensor2);
|
Map(x => x.Sensor3);
|
||||||
if (Config.Data.WMsCount >= 3) Map(x => x.Sensor3);
|
Map(x => x.Sensor4);
|
||||||
if (Config.Data.WMsCount >= 4) Map(x => x.Sensor4);
|
Map(x => x.Sensor5);
|
||||||
if (Config.Data.WMsCount >= 5) Map(x => x.Sensor5);
|
Map(x => x.Sensor6);
|
||||||
if (Config.Data.WMsCount >= 6) Map(x => x.Sensor6);
|
Map(x => x.Sensor7);
|
||||||
if (Config.Data.WMsCount >= 7) Map(x => x.Sensor7);
|
Map(x => x.Sensor8);
|
||||||
if (Config.Data.WMsCount >= 8) Map(x => x.Sensor8);
|
Map(x => x.Sensor9);
|
||||||
if (Config.Data.WMsCount >= 9) Map(x => x.Sensor9);
|
Map(x => x.Sensor10);
|
||||||
if (Config.Data.WMsCount >= 10) Map(x => x.Sensor10);
|
Map(x => x.Sensor11);
|
||||||
if (Config.Data.WMsCount >= 11) Map(x => x.Sensor11);
|
Map(x => x.Sensor12);
|
||||||
if (Config.Data.WMsCount >= 12) Map(x => x.Sensor12);
|
Map(x => x.Sensor13);
|
||||||
if (Config.Data.WMsCount >= 13) Map(x => x.Sensor13);
|
Map(x => x.Sensor14);
|
||||||
if (Config.Data.WMsCount >= 14) Map(x => x.Sensor14);
|
Map(x => x.Sensor15);
|
||||||
if (Config.Data.WMsCount >= 15) Map(x => x.Sensor15);
|
Map(x => x.Sensor16);
|
||||||
if (Config.Data.WMsCount >= 16) Map(x => x.Sensor16);
|
Map(x => x.Sensor17);
|
||||||
if (Config.Data.WMsCount >= 17) Map(x => x.Sensor17);
|
Map(x => x.Sensor18);
|
||||||
if (Config.Data.WMsCount >= 18) Map(x => x.Sensor18);
|
Map(x => x.Sensor19);
|
||||||
if (Config.Data.WMsCount >= 19) Map(x => x.Sensor19);
|
Map(x => x.Sensor20);
|
||||||
if (Config.Data.WMsCount >= 20) Map(x => x.Sensor20);
|
|
||||||
if (Config.Data.WMsCount >= 21) Map(x => x.Sensor21);
|
|
||||||
if (Config.Data.WMsCount >= 22) Map(x => x.Sensor22);
|
|
||||||
if (Config.Data.WMsCount >= 23) Map(x => x.Sensor23);
|
|
||||||
if (Config.Data.WMsCount >= 24) Map(x => x.Sensor24);
|
|
||||||
if (Config.Data.WMsCount >= 25) Map(x => x.Sensor25);
|
|
||||||
if (Config.Data.WMsCount >= 26) Map(x => x.Sensor26);
|
|
||||||
if (Config.Data.WMsCount >= 27) Map(x => x.Sensor27);
|
|
||||||
if (Config.Data.WMsCount >= 28) Map(x => x.Sensor28);
|
|
||||||
if (Config.Data.WMsCount >= 29) Map(x => x.Sensor29);
|
|
||||||
if (Config.Data.WMsCount >= 30) Map(x => x.Sensor30);
|
|
||||||
if (Config.Data.WMsCount >= 31) Map(x => x.Sensor31);
|
|
||||||
if (Config.Data.WMsCount >= 32) Map(x => x.Sensor32);
|
|
||||||
if (Config.Data.WMsCount >= 33) Map(x => x.Sensor33);
|
|
||||||
if (Config.Data.WMsCount >= 34) Map(x => x.Sensor34);
|
|
||||||
if (Config.Data.WMsCount >= 35) Map(x => x.Sensor35);
|
|
||||||
if (Config.Data.WMsCount >= 36) Map(x => x.Sensor36);
|
|
||||||
if (Config.Data.WMsCount >= 37) Map(x => x.Sensor37);
|
|
||||||
if (Config.Data.WMsCount >= 38) Map(x => x.Sensor38);
|
|
||||||
if (Config.Data.WMsCount >= 39) Map(x => x.Sensor39);
|
|
||||||
if (Config.Data.WMsCount >= 40) Map(x => x.Sensor40);
|
|
||||||
#pragma warning restore
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,16 +16,15 @@ namespace Config.Mappings
|
|||||||
Map(x => x.Qfrom);
|
Map(x => x.Qfrom);
|
||||||
Map(x => x.Qto);
|
Map(x => x.Qto);
|
||||||
Map(x => x.Selector);
|
Map(x => x.Selector);
|
||||||
Map(x => x.RegulValve);
|
Map(x => x.RegValve);
|
||||||
|
Map(x => x.RegulMinStep).Nullable();//older databases may not have this column
|
||||||
Map(x => x.FlowMeter);
|
Map(x => x.FlowMeter);
|
||||||
Map(x => x.PidCoef);
|
Map(x => x.PidCoef);
|
||||||
Map(x => x.StartValve);
|
Map(x => x.StartValve);
|
||||||
Map(x => x.Diverter);
|
Map(x => x.Diverter);
|
||||||
Map(x => x.TempDiv);
|
Map(x => x.TempMtrDiv);
|
||||||
Map(x => x.Scale)
|
Map(x => x.Scale);
|
||||||
.Column("Balance");
|
Map(x => x.RegVPositions);
|
||||||
Map(x => x.RegulValvesPct)
|
|
||||||
.Column("EmptyTankValve");
|
|
||||||
Map(x => x.ValvesOpen)
|
Map(x => x.ValvesOpen)
|
||||||
.CustomType("StringClob")
|
.CustomType("StringClob")
|
||||||
.CustomSqlType("varchar(8000)");
|
.CustomSqlType("varchar(8000)");
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
///
|
///
|
||||||
/// Copyright (c) 2019 Sensus Slovensko a.s.
|
/// Copyright (c) 2019-2023 Sensus Slovensko a.s.
|
||||||
///
|
///
|
||||||
using FluentNHibernate.Mapping;
|
using FluentNHibernate.Mapping;
|
||||||
using Config.Entities;
|
using Config.Entities;
|
||||||
@@ -14,6 +14,7 @@ namespace Config.Mappings
|
|||||||
Map(x => x.ItemNr);
|
Map(x => x.ItemNr);
|
||||||
Map(x => x.Name);
|
Map(x => x.Name);
|
||||||
Map(x => x.Part);
|
Map(x => x.Part);
|
||||||
|
Map(x => x.FlowId);
|
||||||
Map(x => x.CoefQfrom);
|
Map(x => x.CoefQfrom);
|
||||||
Map(x => x.CoefQto);
|
Map(x => x.CoefQto);
|
||||||
Map(x => x.ErrLimLo);
|
Map(x => x.ErrLimLo);
|
||||||
|
|||||||
+11
-28
@@ -1,5 +1,5 @@
|
|||||||
///
|
///
|
||||||
/// Copyright (c) 2013-2022 Sensus Slovensko a.s.
|
/// Copyright (c) 2013-2023 Sensus Slovensko a.s.
|
||||||
///
|
///
|
||||||
using FluentNHibernate.Mapping;
|
using FluentNHibernate.Mapping;
|
||||||
using Config.Entities;
|
using Config.Entities;
|
||||||
@@ -16,19 +16,16 @@ namespace Config.Mappings
|
|||||||
Map(x => x.Part);
|
Map(x => x.Part);
|
||||||
Map(x => x.Profile);
|
Map(x => x.Profile);
|
||||||
Map(x => x.Publish);
|
Map(x => x.Publish);
|
||||||
Map(x => x.DoEvaluate)
|
Map(x => x.DoEvaluate);
|
||||||
.Column("Evaluate");
|
|
||||||
Map(x => x.Qtg);
|
Map(x => x.Qtg);
|
||||||
Map(x => x.Qfrom);
|
Map(x => x.Qfrom);
|
||||||
Map(x => x.Qto);
|
Map(x => x.Qto);
|
||||||
|
Map(x => x.IsFromToInPct);
|
||||||
Map(x => x.Volume);
|
Map(x => x.Volume);
|
||||||
Map(x => x.TestTime)
|
Map(x => x.TestTime);
|
||||||
.Column("TstTime");
|
|
||||||
Map(x => x.Repeats);
|
Map(x => x.Repeats);
|
||||||
Map(x => x.DoDraining)
|
Map(x => x.DoDraining);
|
||||||
.Column("Emptying");
|
Map(x => x.DoDrainingAfter);
|
||||||
Map(x => x.DoDrainingAfter)
|
|
||||||
.Column("Zeroing");
|
|
||||||
Map(x => x.TempLimLo);
|
Map(x => x.TempLimLo);
|
||||||
Map(x => x.TempLimHi);
|
Map(x => x.TempLimHi);
|
||||||
Map(x => x.TempControl);
|
Map(x => x.TempControl);
|
||||||
@@ -39,16 +36,13 @@ namespace Config.Mappings
|
|||||||
.CustomType<byte>();
|
.CustomType<byte>();
|
||||||
Map(x => x.TimeBeforeFlow);
|
Map(x => x.TimeBeforeFlow);
|
||||||
Map(x => x.TimeFlow2Mass);
|
Map(x => x.TimeFlow2Mass);
|
||||||
Map(x => x.TimePump2StartV)
|
Map(x => x.TimePump2StartV);
|
||||||
.Column("TimeMass2Start");
|
|
||||||
Map(x => x.TimeStop2Mass);
|
Map(x => x.TimeStop2Mass);
|
||||||
Map(x => x.Method);
|
Map(x => x.Method);
|
||||||
Map(x => x.ErrLimLo);
|
Map(x => x.ErrLimLo);
|
||||||
Map(x => x.ErrLimHi);
|
Map(x => x.ErrLimHi);
|
||||||
Map(x => x.Uncertainty);
|
Map(x => x.Uncertainty);
|
||||||
Map(x => x.ShortPulses)
|
Map(x => x.ShortPulses);
|
||||||
.Column("TolerRed"); /// ???
|
|
||||||
Map(x => x.RedType);
|
|
||||||
Map(x => x.FeedingPath);
|
Map(x => x.FeedingPath);
|
||||||
Map(x => x.BenchPath);
|
Map(x => x.BenchPath);
|
||||||
Map(x => x.OutputPath);
|
Map(x => x.OutputPath);
|
||||||
@@ -56,20 +50,9 @@ namespace Config.Mappings
|
|||||||
#if HEAT_METERS
|
#if HEAT_METERS
|
||||||
Map(x => x.HeatMetersPath);
|
Map(x => x.HeatMetersPath);
|
||||||
#endif
|
#endif
|
||||||
Map(x => x.TransBefore)
|
Map(x => x.TransBefore);
|
||||||
.Column("RelTransBefore");
|
Map(x => x.TransBetween);
|
||||||
Map(x => x.TransBetween)
|
Map(x => x.TransAfter);
|
||||||
.Column("RelTransBetween");
|
|
||||||
Map(x => x.TransAfter)
|
|
||||||
.Column("TransitionAfter");
|
|
||||||
#if ORACLE_DB
|
|
||||||
Map(x => x.OraId);
|
|
||||||
Map(x => x.OraIdRepetMulti);
|
|
||||||
Map(x => x.OraDesignation);
|
|
||||||
Map(x => x.RawDataId);
|
|
||||||
Map(x => x.RawDataIdRepetMulti);
|
|
||||||
Map(x => x.RawDataDesignation);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
HasMany(x => x.MoreParams)
|
HasMany(x => x.MoreParams)
|
||||||
.Cascade.All();
|
.Cascade.All();
|
||||||
|
|||||||
@@ -10,14 +10,16 @@ namespace Config.Mappings
|
|||||||
public UserMap()
|
public UserMap()
|
||||||
{
|
{
|
||||||
Id(x => x.Id);
|
Id(x => x.Id);
|
||||||
Map(x => x.UserName).Column("Name");
|
Map(x => x.UserName)
|
||||||
|
.Column("Name");
|
||||||
Map(x => x.Number);
|
Map(x => x.Number);
|
||||||
Map(x => x.Tag);
|
Map(x => x.Tag);
|
||||||
Map(x => x.Password);
|
Map(x => x.Password);
|
||||||
Map(x => x.Password2);
|
Map(x => x.Password2);
|
||||||
Map(x => x.Password3);
|
Map(x => x.Password3);
|
||||||
Map(x => x.Password4);
|
Map(x => x.Password4);
|
||||||
Map(x => x.FullName).Column("Description");
|
Map(x => x.FullName)
|
||||||
|
.Column("Description");
|
||||||
Map(x => x.LastPwChange);
|
Map(x => x.LastPwChange);
|
||||||
HasManyToMany(x => x.Groups)
|
HasManyToMany(x => x.Groups)
|
||||||
.Cascade.SaveUpdate()
|
.Cascade.SaveUpdate()
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ using System.Runtime.InteropServices;
|
|||||||
[assembly: AssemblyConfiguration("")]
|
[assembly: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("Sensus")]
|
[assembly: AssemblyCompany("Sensus")]
|
||||||
[assembly: AssemblyProduct("Config")]
|
[assembly: AssemblyProduct("Config")]
|
||||||
[assembly: AssemblyCopyright("Copyright © 2013 - 2022 Sensus Slovensko a.s.")]
|
[assembly: AssemblyCopyright("Copyright © 2013 - 2018 Sensus Slovensko a.s.")]
|
||||||
[assembly: AssemblyTrademark("")]
|
[assembly: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
|||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("2.31.1990.0")]
|
[assembly: AssemblyVersion("3.1.1464.0")]
|
||||||
[assembly: AssemblyFileVersion("2.31.1990.0")]
|
[assembly: AssemblyFileVersion("3.1.1464.0")]
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
namespace Config
|
||||||
|
{
|
||||||
|
public class PurchaseResources
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -162,4 +162,7 @@
|
|||||||
<data name="Administrator" xml:space="preserve">
|
<data name="Administrator" xml:space="preserve">
|
||||||
<value>Administrator</value>
|
<value>Administrator</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Password_must_have_at_least_0_characters" xml:space="preserve">
|
||||||
|
<value>Password must have at least {0} characters</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
///
|
|
||||||
/// Copyright (c) 2017-2022 Sensus Slovensko a.s.
|
|
||||||
///
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace Config
|
|
||||||
{
|
|
||||||
public static class Utils
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Extract and return a DB server from a MySQL connection string.
|
|
||||||
/// </summary>
|
|
||||||
public static string GetDBServer(string connectionString)
|
|
||||||
{
|
|
||||||
return GetFromConnectionString(connectionString, new string[] { "SERVER=" });
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Extract and return a DB name from a MySQL connection string.
|
|
||||||
/// </summary>
|
|
||||||
public static string GetDBName(string connectionString)
|
|
||||||
{
|
|
||||||
return GetFromConnectionString(connectionString, new string[] { "DATABASE=" });
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Extract and return a username from a MySQL connection string
|
|
||||||
/// </summary>
|
|
||||||
public static string GetDBUser(string connectionString)
|
|
||||||
{
|
|
||||||
return GetFromConnectionString(connectionString, new string[] { "USER=", "UID=" });
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Extract and return a password from a MySQL connection string
|
|
||||||
/// </summary>
|
|
||||||
public static string GetDBPassword(string connectionString)
|
|
||||||
{
|
|
||||||
return GetFromConnectionString(connectionString, new string[] { "PASSWORD=", "PWD=" });
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Extract and return an element of a MySQL connection string
|
|
||||||
/// (a host, a database, a user name or a password).
|
|
||||||
/// Return an empty string on any error.
|
|
||||||
/// </summary>
|
|
||||||
public static string GetFromConnectionString(string connectionString, string[] patterns)
|
|
||||||
{
|
|
||||||
foreach (var pattern in patterns)
|
|
||||||
{
|
|
||||||
int startIx = connectionString.IndexOf(pattern);
|
|
||||||
if (startIx >= 0)
|
|
||||||
{
|
|
||||||
/// pattern found, extract the subsequent element
|
|
||||||
startIx += pattern.Length;
|
|
||||||
int endIx = connectionString.IndexOf(';', startIx);
|
|
||||||
return (endIx > 0) ? connectionString.Substring(startIx, endIx - startIx) : string.Empty;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// pattern NOT found
|
|
||||||
return string.Empty;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,271 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace DataMatrix4Net
|
||||||
|
{
|
||||||
|
public class DataMatrix
|
||||||
|
{
|
||||||
|
///
|
||||||
|
/// Public interface
|
||||||
|
///
|
||||||
|
public bool isContainMatrix { get { return Matrix != null; } }
|
||||||
|
public Gma.QrCodeNet.Encoding.BitMatrix Matrix;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Internal member variables
|
||||||
|
///
|
||||||
|
readonly SymbolSize chosenSize;
|
||||||
|
readonly bool[,] visited;
|
||||||
|
int width { get { return isContainMatrix ? Matrix.Width : 0; } }
|
||||||
|
int height { get { return isContainMatrix ? Matrix.Height : 0; } }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Data matrix constructor
|
||||||
|
/// Data matrix size up to 26x26 supported, one data region.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="content">Content of the data matrix (ASCII characters only)</param>
|
||||||
|
/// <param name="symbolSize">Chosen data matrix size</param>
|
||||||
|
public DataMatrix(string content, SymbolSize symbolSize = SymbolSize.SquareAuto)
|
||||||
|
{
|
||||||
|
byte[] contentBytes = Utils.MakeByteArray(content);
|
||||||
|
|
||||||
|
if (symbolSize >= 0)
|
||||||
|
{
|
||||||
|
chosenSize = symbolSize;
|
||||||
|
}
|
||||||
|
else if (symbolSize == SymbolSize.SquareAuto)
|
||||||
|
{
|
||||||
|
for (SymbolSize ss = 0; ss < Symbol.SymbolSquareCount; ss++)
|
||||||
|
{
|
||||||
|
if (contentBytes.Length <= Symbol.GetSymbolAttribute(SymbolAttribute.SymbolDataWords, ss))
|
||||||
|
{
|
||||||
|
chosenSize = ss;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int w = Symbol.GetSymbolAttribute(SymbolAttribute.SymbolCols, chosenSize);
|
||||||
|
int h = Symbol.GetSymbolAttribute(SymbolAttribute.SymbolRows, chosenSize);
|
||||||
|
if (w == -1 || h == -1)
|
||||||
|
{
|
||||||
|
throw new ArgumentOutOfRangeException("symboSize");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Add padding and Reed-Solomon error correction bytes to the content
|
||||||
|
byte[] data = ReedSolomon.Encode(contentBytes, chosenSize);
|
||||||
|
|
||||||
|
/// Create matrix, fill in frame cells
|
||||||
|
Matrix = new MyBitMatrix(w, h);
|
||||||
|
visited = new bool[w - 2, h - 2];
|
||||||
|
MakeFrame(chosenSize);
|
||||||
|
|
||||||
|
int ix = 0;
|
||||||
|
int x = 0; /// inside data region in the range 0 .. width-2 (x coordinate, frame excluded)
|
||||||
|
int y = 4; /// inside data region in the range 0 .. height-2 (y coordinate, frame excluded)
|
||||||
|
|
||||||
|
/// Walk through the data matrix area and fill in data bytes
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (x == 0 && y == height - 2)
|
||||||
|
{
|
||||||
|
PlaceByteSpecial1(data[ix++], width, height);
|
||||||
|
}
|
||||||
|
else if (x == 0 && y == height - 4 && (height - 2) % 4 != 0)
|
||||||
|
{
|
||||||
|
PlaceByteSpecial2(data[ix++], width, height);
|
||||||
|
}
|
||||||
|
else if (x == 0 && y == height - 4 && (height - 2) % 8 == 4)
|
||||||
|
{
|
||||||
|
PlaceByteSpecial3(data[ix++], width, height);
|
||||||
|
}
|
||||||
|
else if (x == 2 && y == height + 2 && (height - 2) % 8 == 0)
|
||||||
|
{
|
||||||
|
PlaceByteSpecial4(data[ix++], width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (x >= 0 && y < height - 2 && !visited[x, y])
|
||||||
|
{
|
||||||
|
PlaceByteStandard(data[ix++], x, y, width, height);
|
||||||
|
visited[x, y] = true;
|
||||||
|
}
|
||||||
|
x += 2;
|
||||||
|
y -= 2;
|
||||||
|
}
|
||||||
|
while (x < width - 2 && y >= 0);
|
||||||
|
x += 3;
|
||||||
|
y += 1;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (x < width - 2 && y >= 0 && !visited[x, y])
|
||||||
|
{
|
||||||
|
PlaceByteStandard(data[ix++], x, y, width, height);
|
||||||
|
visited[x, y] = true;
|
||||||
|
}
|
||||||
|
x -= 2;
|
||||||
|
y += 2;
|
||||||
|
}
|
||||||
|
while (x >= 0 && y < height - 2);
|
||||||
|
x += 1;
|
||||||
|
y += 3;
|
||||||
|
}
|
||||||
|
while (ix < data.Length);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// All matrix sizes
|
||||||
|
void PlaceByteSpecial1(byte dataByte, int width, int height)
|
||||||
|
{
|
||||||
|
Matrix[width - 2, 4] = (dataByte & 0x01) != 0;
|
||||||
|
Matrix[width - 2, 3] = (dataByte & 0x02) != 0;
|
||||||
|
Matrix[width - 2, 2] = (dataByte & 0x04) != 0;
|
||||||
|
Matrix[width - 2, 1] = (dataByte & 0x08) != 0;
|
||||||
|
Matrix[width - 3, 1] = (dataByte & 0x10) != 0;
|
||||||
|
Matrix[3, height - 2] = (dataByte & 0x20) != 0;
|
||||||
|
Matrix[2, height - 2] = (dataByte & 0x40) != 0;
|
||||||
|
Matrix[1, height - 2] = (dataByte & 0x80) != 0;
|
||||||
|
|
||||||
|
visited[width - 3, 3] = true;
|
||||||
|
visited[width - 3, 2] = true;
|
||||||
|
visited[width - 3, 1] = true;
|
||||||
|
visited[width - 3, 0] = true;
|
||||||
|
visited[width - 4, 0] = true;
|
||||||
|
visited[2, height - 3] = true;
|
||||||
|
visited[1, height - 3] = true;
|
||||||
|
visited[0, height - 3] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PlaceByteSpecial2(byte dataByte, int width, int height)
|
||||||
|
{
|
||||||
|
Matrix[width - 2, 2] = (dataByte & 0x01) != 0;
|
||||||
|
Matrix[width - 2, 1] = (dataByte & 0x02) != 0;
|
||||||
|
Matrix[width - 3, 1] = (dataByte & 0x04) != 0;
|
||||||
|
Matrix[width - 4, 1] = (dataByte & 0x08) != 0;
|
||||||
|
Matrix[width - 5, 1] = (dataByte & 0x10) != 0;
|
||||||
|
Matrix[1, height - 2] = (dataByte & 0x20) != 0;
|
||||||
|
Matrix[1, height - 3] = (dataByte & 0x40) != 0;
|
||||||
|
Matrix[1, height - 4] = (dataByte & 0x80) != 0;
|
||||||
|
|
||||||
|
visited[width - 3, 1] = true;
|
||||||
|
visited[width - 3, 0] = true;
|
||||||
|
visited[width - 4, 0] = true;
|
||||||
|
visited[width - 5, 0] = true;
|
||||||
|
visited[width - 6, 0] = true;
|
||||||
|
visited[0, height - 3] = true;
|
||||||
|
visited[0, height - 4] = true;
|
||||||
|
visited[0, height - 5] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PlaceByteSpecial3(byte dataByte, int width, int height)
|
||||||
|
{
|
||||||
|
Matrix[width - 2, 2] = (dataByte & 0x01) != 0;
|
||||||
|
Matrix[width - 3, 2] = (dataByte & 0x02) != 0;
|
||||||
|
Matrix[width - 4, 2] = (dataByte & 0x04) != 0;
|
||||||
|
Matrix[width - 2, 1] = (dataByte & 0x08) != 0;
|
||||||
|
Matrix[width - 3, 1] = (dataByte & 0x10) != 0;
|
||||||
|
Matrix[width - 4, 1] = (dataByte & 0x20) != 0;
|
||||||
|
Matrix[width - 2, height - 2] = (dataByte & 0x40) != 0;
|
||||||
|
Matrix[1, height - 2] = (dataByte & 0x80) != 0;
|
||||||
|
|
||||||
|
visited[width - 3, 1] = true;
|
||||||
|
visited[width - 4, 1] = true;
|
||||||
|
visited[width - 5, 1] = true;
|
||||||
|
visited[width - 3, 0] = true;
|
||||||
|
visited[width - 4, 0] = true;
|
||||||
|
visited[width - 5, 0] = true;
|
||||||
|
visited[width - 3, height - 3] = true;
|
||||||
|
visited[0, height - 3] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PlaceByteSpecial4(byte dataByte, int width, int height)
|
||||||
|
{
|
||||||
|
Matrix[width - 2, 4] = (dataByte & 0x01) != 0;
|
||||||
|
Matrix[width - 2, 3] = (dataByte & 0x02) != 0;
|
||||||
|
Matrix[width - 2, 2] = (dataByte & 0x04) != 0;
|
||||||
|
Matrix[width - 2, 1] = (dataByte & 0x08) != 0;
|
||||||
|
Matrix[width - 3, 1] = (dataByte & 0x10) != 0;
|
||||||
|
Matrix[1, height - 2] = (dataByte & 0x20) != 0;
|
||||||
|
Matrix[1, height - 3] = (dataByte & 0x40) != 0;
|
||||||
|
Matrix[1, height - 4] = (dataByte & 0x80) != 0;
|
||||||
|
|
||||||
|
visited[width - 3, 3] = true;
|
||||||
|
visited[width - 3, 2] = true;
|
||||||
|
visited[width - 3, 1] = true;
|
||||||
|
visited[width - 3, 0] = true;
|
||||||
|
visited[width - 4, 0] = true;
|
||||||
|
visited[0, height - 3] = true;
|
||||||
|
visited[0, height - 4] = true;
|
||||||
|
visited[0, height - 5] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Standard bit positioning (all matrix sizes)
|
||||||
|
///
|
||||||
|
int[] xOffs = new int[8] { 1, 0, -1, 1, 0, -1, 0, -1 };
|
||||||
|
int[] yOffs = new int[8] { 1, 1, 1, 0, 0, 0, -1, -1 };
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Standard placemnt of a byte into a matrix
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="dataByte">Data byte</param>
|
||||||
|
/// <param name="x">X-coordinate in range 0..width-2 (from left, frame excluded)</param>
|
||||||
|
/// <param name="y">Y-coordinate in range 0..height-2 (from top, frame excluded)</param>
|
||||||
|
/// <param name="width">Matrix width incl. frame</param>
|
||||||
|
/// <param name="height">Matrix height incl. frame</param>
|
||||||
|
void PlaceByteStandard(byte dataByte, int x, int y, int width, int height)
|
||||||
|
{
|
||||||
|
int mask = 1;
|
||||||
|
for (int i = 0; i < 8; i++)
|
||||||
|
{
|
||||||
|
int xx = x + xOffs[i];
|
||||||
|
int yy = y + yOffs[i];
|
||||||
|
if (xx < 1)
|
||||||
|
{
|
||||||
|
xx += width - 2;
|
||||||
|
yy += 4 - (width + 4) % 8;
|
||||||
|
}
|
||||||
|
else if (yy < 1)
|
||||||
|
{
|
||||||
|
xx += 4 - (height + 4) % 8;
|
||||||
|
yy += height - 2;
|
||||||
|
}
|
||||||
|
Matrix[xx, yy] = (dataByte & mask) != 0;
|
||||||
|
mask = mask << 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Crate data matrix frame.
|
||||||
|
/// All square data matrix sizes supported (incl. 4, 16 and 36 data regions).
|
||||||
|
/// </summary>
|
||||||
|
void MakeFrame(SymbolSize size)
|
||||||
|
{
|
||||||
|
int drw = Symbol.GetSymbolAttribute(SymbolAttribute.DataRegionCols, size);
|
||||||
|
int drh = Symbol.GetSymbolAttribute(SymbolAttribute.DataRegionRows, size);
|
||||||
|
int totalhdr = Symbol.GetSymbolAttribute(SymbolAttribute.HorizDataRegions, size);
|
||||||
|
int totalvdr = Symbol.GetSymbolAttribute(SymbolAttribute.VertDataRegions, size);
|
||||||
|
|
||||||
|
for (int hdr = 0; hdr < totalhdr; hdr++)
|
||||||
|
{
|
||||||
|
for (int vdr = 0; vdr < totalvdr; vdr++)
|
||||||
|
{
|
||||||
|
int offsx = hdr * (drw + 2);
|
||||||
|
int offsy = vdr * (drh + 2);
|
||||||
|
|
||||||
|
for (int i = 0; i < drw + 2; i++)
|
||||||
|
{
|
||||||
|
Matrix[offsx + i, offsy + drh + 1] = true;
|
||||||
|
if (i % 2 == 0) Matrix[offsx + i, offsy] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int j = 0; j < drh + 2; j++)
|
||||||
|
{
|
||||||
|
Matrix[offsx, offsy + j] = true;
|
||||||
|
if (j % 2 == 1) Matrix[offsx + drw + 1, offsy + j] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{7CD2B5B4-3304-4151-B8B4-76A8B8AF9B06}</ProjectGuid>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>DataMatrix4Net</RootNamespace>
|
||||||
|
<AssemblyName>DataMatrix4Net</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
<TargetFrameworkProfile />
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="Gma.QrCodeNet.Encoding">
|
||||||
|
<HintPath>..\packages\QrCode.Net.0.4.0.0\net40\Gma.QrCodeNet.Encoding.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Core" />
|
||||||
|
<Reference Include="System.Xml.Linq" />
|
||||||
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
|
<Reference Include="Microsoft.CSharp" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="DataMatrix.cs" />
|
||||||
|
<Compile Include="MyBitMatrix.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
<Compile Include="ReedSolomon.cs" />
|
||||||
|
<Compile Include="Symbol.cs" />
|
||||||
|
<Compile Include="Utils.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user