Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
305b3570da | ||
|
|
619c06a511 | ||
|
|
9b85630405 | ||
|
|
078dc08ed0 | ||
|
|
f82658cee2 | ||
|
|
7c2135a8fe | ||
|
|
b5383a445e | ||
|
|
f3c0da79e8 | ||
|
|
c4c221f58c | ||
|
|
2a622d4aa2 | ||
|
|
baa67cfe02 | ||
|
|
d0cddd072c | ||
|
|
e20a95029c | ||
|
|
392a02b83c | ||
|
|
385825c9e8 | ||
|
|
acb5491225 | ||
|
|
5d4dedcb25 | ||
|
|
775af25d1b | ||
|
|
c4e4bb2e77 | ||
|
|
7e2781148e | ||
|
|
dd851fb344 | ||
|
|
531a728b37 | ||
|
|
f10c5797bb | ||
|
|
052f39d330 | ||
|
|
2e593d11eb | ||
|
|
e150624f4d | ||
|
|
ca9d83e424 | ||
|
|
3b1544b330 | ||
|
|
518a1f792c | ||
|
|
2f3b09ffc5 | ||
|
|
d9c60584eb | ||
|
|
d8e0772a0f | ||
|
|
875caf0e28 | ||
|
|
86601e1ba1 | ||
|
|
67a762e51c | ||
|
|
d6881bfdf3 | ||
|
|
878c89591e | ||
|
|
f332fd7141 | ||
|
|
bb3be1c649 | ||
|
|
e88175b349 | ||
|
|
c0f4c5acef | ||
|
|
1f9df9bb67 | ||
|
|
de4a0c61b9 | ||
|
|
0f3f54f8d0 | ||
|
|
60f7fbe4c3 | ||
|
|
37e84ee678 | ||
|
|
04878cea50 | ||
|
|
7c940bd633 | ||
|
|
5769b6ad48 | ||
|
|
b17d710044 | ||
|
|
441601bd42 | ||
|
|
d1f5bd8300 | ||
|
|
98c1194e5b | ||
|
|
85f2f31469 | ||
|
|
fe3867bc5c | ||
|
|
b2e467714e | ||
|
|
0993716c8e | ||
|
|
c19802fa13 | ||
|
|
efa5084d8b | ||
|
|
673e04a1b6 | ||
|
|
a4a589a40c | ||
|
|
0436906a59 | ||
|
|
f2a3c47cf7 | ||
|
|
80db263929 | ||
|
|
701c2f33bb | ||
|
|
dd8dce1d59 | ||
|
|
cd1bee1018 | ||
|
|
3f9312a606 | ||
|
|
f2c7b9904b | ||
|
|
9ac7f691e0 | ||
|
|
bf1da91018 | ||
|
|
3f8fc9475a | ||
|
|
72c3006c8a | ||
|
|
5c8ebd6476 | ||
|
|
2efdb8bb61 | ||
|
|
b9886599ed | ||
|
|
570570570b | ||
|
|
1593dc3070 | ||
|
|
9931138e5d | ||
|
|
91e7b95332 | ||
|
|
f912389a36 | ||
|
|
be5122cec6 | ||
|
|
9f9883ac3e | ||
|
|
5e50056f4a | ||
|
|
d97fa481c8 | ||
|
|
495fb4e074 | ||
|
|
82a1669306 | ||
|
|
0adec1cb51 | ||
|
|
f8a358c21e | ||
|
|
6a40a351a7 | ||
|
|
e8af9418bf | ||
|
|
4245238112 | ||
|
|
88c92dd762 | ||
|
|
6a38189ee2 | ||
|
|
694e20c9b6 | ||
|
|
d0c27c4fe0 | ||
|
|
82e71f6779 | ||
|
|
ab6b96976c | ||
|
|
47c2184d5f | ||
|
|
04b0be79cd | ||
|
|
9b212bd455 | ||
|
|
62b06b23a5 | ||
|
|
bbea6da45c | ||
|
|
4452b62cbd | ||
|
|
4a7d14b01f | ||
|
|
9ab78cf824 | ||
|
|
615b3409be | ||
|
|
7465f23809 | ||
|
|
0598491753 | ||
|
|
88bf586da4 | ||
|
|
369753f94a | ||
|
|
29f79285a7 | ||
|
|
81951287c6 | ||
|
|
be86f791e4 | ||
|
|
4c70ac6412 | ||
|
|
d8de284c37 | ||
|
|
39d43bc217 | ||
|
|
7bb6d7f0e9 | ||
|
|
fc8bf749a4 | ||
|
|
95a3d7def6 | ||
|
|
1155cae130 | ||
|
|
f645aea402 | ||
|
|
1a82625f39 | ||
|
|
bcc54ccd8f | ||
|
|
5df13df7fc | ||
|
|
47fd6206f6 | ||
|
|
776f8ed841 | ||
|
|
cf20ca885e | ||
|
|
e2e7a091af | ||
|
|
17e605cfd9 | ||
|
|
80999a8573 | ||
|
|
8deb18fe9c | ||
|
|
bb3688bf7a | ||
|
|
d3c7d54466 | ||
|
|
b844aafcf3 | ||
|
|
5f17dabb0b | ||
|
|
e0fb7927ed | ||
|
|
567ea533a9 | ||
|
|
cb62b0eb3a | ||
|
|
069d3865d4 | ||
|
|
a40ba5243e | ||
|
|
2c7d1af146 | ||
|
|
6bf5bdce2b | ||
|
|
c5c4a571c5 | ||
|
|
9464e3e4e1 | ||
|
|
03b99f1bbf | ||
|
|
d2e9b6f582 | ||
|
|
2bc8a5629f | ||
|
|
95ad2484ef | ||
|
|
9a8f8722bd | ||
|
|
08cf231dfc | ||
|
|
1f13ac3c77 | ||
|
|
d9bea4209c | ||
|
|
159390c094 | ||
|
|
0d3ee53bd5 | ||
|
|
06018303e7 | ||
|
|
51e91cdab0 | ||
|
|
7038c1163f | ||
|
|
812b5cddcc | ||
|
|
caed4635eb | ||
|
|
7043e4e11e | ||
|
|
566dfb7ba8 | ||
|
|
b0238fc0a3 | ||
|
|
47ae6ab4ae | ||
|
|
14716e4ed1 | ||
|
|
095d4aab2b | ||
|
|
4144a8970b | ||
|
|
ec3c0aae0a | ||
|
|
b443cab973 | ||
|
|
2e3b120bb1 | ||
|
|
d640a2f4b6 | ||
|
|
5116767ec7 | ||
|
|
43412cde9e | ||
|
|
d225d97863 | ||
|
|
7983423e2a | ||
|
|
7859ce582a | ||
|
|
3e1013fc12 | ||
|
|
5f7b4443c2 | ||
|
|
57977ae8b6 | ||
|
|
d21d4fb766 | ||
|
|
298d4a9b17 | ||
|
|
be82f1fe0e | ||
|
|
459cb5bb4a | ||
|
|
8d39bf82d2 | ||
|
|
e762aca7fb | ||
|
|
ace0bdb2a6 | ||
|
|
f6e44914fa | ||
|
|
6b6098164a | ||
|
|
6572623313 | ||
|
|
7f4bbcccf2 | ||
|
|
a49a81cff7 | ||
|
|
88fc2d4951 | ||
|
|
2c64b8905d | ||
|
|
dda796b929 | ||
|
|
4fd332490a | ||
|
|
be7c433343 | ||
|
|
6181e6a0f2 | ||
|
|
c5453fff5b | ||
|
|
b9b7fc95b4 | ||
|
|
b8a51409ab | ||
|
|
cebaab8e8b | ||
|
|
76bef24456 | ||
|
|
871b95891d | ||
|
|
f5ddde647a | ||
|
|
d4de7db70d | ||
|
|
ad858266d5 | ||
|
|
8772004e8e | ||
|
|
aec3519ec9 | ||
|
|
20bbbc7741 | ||
|
|
5ee93200ed | ||
|
|
981c399e65 | ||
|
|
96429a8c7a | ||
|
|
e1fc3e7b82 | ||
|
|
498115637a | ||
|
|
2322a145f6 | ||
|
|
53bab003bf | ||
|
|
97fc922321 | ||
|
|
8c32d64f35 | ||
|
|
1dfbf12f46 | ||
|
|
0f9256325c | ||
|
|
93c6ba5e74 | ||
|
|
2d3e14fc6c | ||
|
|
3ad842b02a | ||
|
|
14cfb65b6b | ||
|
|
cd926f559d | ||
|
|
cafa247279 | ||
|
|
e411b80fdc | ||
|
|
ae5e680e35 | ||
|
|
db684afd84 | ||
|
|
dc2ab14412 | ||
|
|
9e28ca5df3 | ||
|
|
dcfc12a849 | ||
|
|
ad3f9b53ad | ||
|
|
e7e0937ae5 | ||
|
|
0325b0214b | ||
|
|
6d616ca4cc | ||
|
|
a2620870ad | ||
|
|
a9ab29fcbb | ||
|
|
65f2c4d4a5 | ||
|
|
2ba5c8277d | ||
|
|
28f3b3f323 | ||
|
|
607dbaacb1 | ||
|
|
656bd36a1d | ||
|
|
1b83bd22b9 | ||
|
|
54eba8509e | ||
|
|
996b88cb2e | ||
|
|
441d950e94 | ||
|
|
59c2afe0e8 | ||
|
|
441cf91ff6 | ||
|
|
41a1b3323f | ||
|
|
4e31493cc8 | ||
|
|
8abe8df823 | ||
|
|
39af5d29c6 | ||
|
|
52d073cb8c | ||
|
|
65a6854cc0 | ||
|
|
ec540bcf20 | ||
|
|
4e9748f4dc | ||
|
|
82da9bc2e7 | ||
|
|
4cc9715f57 | ||
|
|
75f72cb04e | ||
|
|
3d58b8baf2 | ||
|
|
0c2839e6c9 | ||
|
|
0df833ca8a | ||
|
|
82988ce74f | ||
|
|
32fbb2964e | ||
|
|
38d7562bb3 | ||
|
|
a8dd8d98cb | ||
|
|
615383f924 | ||
|
|
25fa494b7b | ||
|
|
8b321e36db | ||
|
|
3822c6f5ab | ||
|
|
21a329b1d3 | ||
|
|
8d669d9f54 | ||
|
|
9a905c6111 | ||
|
|
239bcddfa2 | ||
|
|
cd5e20a3f4 | ||
|
|
518e87e4f1 | ||
|
|
6cd0be4c17 | ||
|
|
04db65f01f | ||
|
|
aa63fe2cb4 | ||
|
|
0593e3484c | ||
|
|
80bb277386 | ||
|
|
ec22661e87 | ||
|
|
80cdc2fb95 | ||
|
|
bfedd4d11b | ||
|
|
f58831f916 | ||
|
|
328d6b7fa7 | ||
|
|
98105cbf21 | ||
|
|
c9c57db7c1 | ||
|
|
7d4f1b2a44 | ||
|
|
7b7d1994c7 | ||
|
|
8b438d8d76 | ||
|
|
7a510a98ad | ||
|
|
66034de880 | ||
|
|
b9ca3e6beb | ||
|
|
9ad0872854 | ||
|
|
e6933922cd | ||
|
|
d6d6d88e20 | ||
|
|
8974d93877 | ||
|
|
7e6bef9008 | ||
|
|
1e2711a616 | ||
|
|
fd81675168 | ||
|
|
3dc347c66a | ||
|
|
8a8f4fa563 | ||
|
|
ed3fc330ab | ||
|
|
9fa025caa4 | ||
|
|
b54f938bd5 | ||
|
|
4efba80fc6 | ||
|
|
c3eab4820f | ||
|
|
a5bb127a1e | ||
|
|
ae1ed99c9f | ||
|
|
fa36932fbc | ||
|
|
9ac3dd07b9 | ||
|
|
4ca28941d0 | ||
|
|
4b2e207ddf | ||
|
|
88055f1c84 | ||
|
|
2f68a9444a | ||
|
|
0ccd711b0f | ||
|
|
63a6cb7afe | ||
|
|
d9fc5482db | ||
|
|
4f06438371 | ||
|
|
5afb5f2419 | ||
|
|
9f467a23b4 | ||
|
|
76dd46b30c | ||
|
|
0c1ddecaf1 | ||
|
|
d36d4733ca | ||
|
|
18dac8fb72 | ||
|
|
fb1db6df1c | ||
|
|
3fb487b67b | ||
|
|
2e1d497aad | ||
|
|
754bd14342 | ||
|
|
c4026c87ce | ||
|
|
e6b8454a94 | ||
|
|
98f68d6b45 | ||
|
|
5ef1bcbdb6 | ||
|
|
7846239be9 | ||
|
|
f8e2d6c86b | ||
|
|
b06f4a5781 | ||
|
|
968faf9200 | ||
|
|
62ceb13385 | ||
|
|
bed0046618 | ||
|
|
8a2287c685 | ||
|
|
3c85440d34 | ||
|
|
7ed21ff08c | ||
|
|
df42ec3d3a | ||
|
|
35b62520c9 | ||
|
|
e6936dc10e | ||
|
|
d5904fe9fa | ||
|
|
20d8fbc389 | ||
|
|
70ccb8b4d8 | ||
|
|
175571072f | ||
|
|
b0e25a35fb | ||
|
|
08e7041bcf | ||
|
|
b58ebcd7a7 | ||
|
|
8eb2472171 | ||
|
|
f73d89f41b | ||
|
|
95848197c5 | ||
|
|
442ac6969f | ||
|
|
3fb2c0aeff | ||
|
|
8ed99092ff | ||
|
|
f393709944 | ||
|
|
527da6bcc5 | ||
|
|
17940d453c | ||
|
|
8d623ae8fa | ||
|
|
c9d3480c58 | ||
|
|
e133b68472 | ||
|
|
9ecfe1e10e | ||
|
|
3a38ca6b61 | ||
|
|
62cb5cdba7 | ||
|
|
1cb0345b37 | ||
|
|
b3e6a3f157 | ||
|
|
6ed831c968 | ||
|
|
3f1d992879 | ||
|
|
c076ebce6f | ||
|
|
56e006318f | ||
|
|
4867b031b9 | ||
|
|
548973cf11 | ||
|
|
9c575d7fbf | ||
|
|
feefbeb5b4 | ||
|
|
a4d8081b73 | ||
|
|
467e51374d | ||
|
|
ec27a5843b | ||
|
|
a6a87cccae | ||
|
|
1d7a2e4a0c | ||
|
|
9ac237a377 | ||
|
|
74d5688936 | ||
|
|
534baa7aa3 | ||
|
|
b11d55c2c7 | ||
|
|
8fb27fc4f1 | ||
|
|
7332bc2a71 | ||
|
|
ae0ebd15f7 | ||
|
|
b8ade55096 | ||
|
|
acc5b2fecd | ||
|
|
e76c2afa08 | ||
|
|
8d249a96f4 | ||
|
|
229bec30cc | ||
|
|
5552a28925 | ||
|
|
3bd5d0e7d3 | ||
|
|
218a14acca | ||
|
|
1f978844c0 | ||
|
|
ca80c1e49d | ||
|
|
9bf66f651a | ||
|
|
a94ebc747a | ||
|
|
77a6aff593 | ||
|
|
f58bc38450 | ||
|
|
bb962ad3b7 | ||
|
|
dbdbda77b3 | ||
|
|
cafdffd647 | ||
|
|
e076410d71 | ||
|
|
0862b265bd | ||
|
|
803bea960d | ||
|
|
1a2c64db84 | ||
|
|
179e673104 | ||
|
|
3ba579e4a0 | ||
|
|
00a2289e92 | ||
|
|
34ad6f040d | ||
|
|
0c827d7167 | ||
|
|
178af644d0 | ||
|
|
2ea5454707 | ||
|
|
f5c5569482 | ||
|
|
a250556f9b | ||
|
|
dac91b094e | ||
|
|
1ef666be9e | ||
|
|
e71795bfe5 | ||
|
|
0d6a8b272a | ||
|
|
5d0b929593 | ||
|
|
94e5e906b1 | ||
|
|
38b985c75f | ||
|
|
49fa937074 | ||
|
|
85ead0b69e | ||
|
|
22c8d6ed9d | ||
|
|
7449456d55 | ||
|
|
2fb1c44ff2 | ||
|
|
71e1cf47df | ||
|
|
13ddcac646 | ||
|
|
3a3dc59275 | ||
|
|
76a841bc84 | ||
|
|
628efe83ca | ||
|
|
17f6f7c3be | ||
|
|
7ad8c986d7 | ||
|
|
470fc6fd07 | ||
|
|
b1f1c6f932 | ||
|
|
902d596c63 | ||
|
|
cf5307d2e2 | ||
|
|
9c663b34c7 | ||
|
|
2ac97aa809 | ||
|
|
ddebe7f8d5 | ||
|
|
6773624cb4 | ||
|
|
1bf118bdb9 | ||
|
|
c31c19ba02 | ||
|
|
05200c437e | ||
|
|
750122e6ea | ||
|
|
8d5c13f6d7 | ||
|
|
1dd399bdb9 | ||
|
|
beba64242d | ||
|
|
3be28f8a11 | ||
|
|
d2b745dd8e | ||
|
|
db55f5b3fd | ||
|
|
420c194f04 | ||
|
|
5cb3955903 | ||
|
|
420d016ee8 | ||
|
|
f803d27882 | ||
|
|
21016a1500 | ||
|
|
8a4ad1c2d4 | ||
|
|
62e562c245 | ||
|
|
d8c389541c | ||
|
|
f13529b339 | ||
|
|
8b195bd6a9 | ||
|
|
082166fc78 | ||
|
|
be6240bf28 | ||
|
|
c776cbcdf1 | ||
|
|
294cc73e36 | ||
|
|
3deb24f89a | ||
|
|
65124248cd | ||
|
|
750ec031d9 | ||
|
|
91b750e1a0 | ||
|
|
b92d9f5a9c | ||
|
|
bcaf1b4830 | ||
|
|
71613cba5d | ||
|
|
d2c21bcca4 | ||
|
|
d756af52d8 | ||
|
|
a6cc2cc325 | ||
|
|
ee89de9621 | ||
|
|
e21d9102a2 | ||
|
|
c4d736b7cc | ||
|
|
5ed7049900 | ||
|
|
6f6112a77c | ||
|
|
cb38a7fe5e | ||
|
|
4c1daf55f2 | ||
|
|
6cace280c9 | ||
|
|
847a4d74d6 | ||
|
|
53c3a51b47 | ||
|
|
b557658760 | ||
|
|
7d03fd4674 | ||
|
|
01ad1993f1 | ||
|
|
f0140e2bd1 | ||
|
|
ed83ae57c5 | ||
|
|
e746d0179f | ||
|
|
6ba2a663b4 | ||
|
|
95f14f9879 | ||
|
|
2933bd24e7 | ||
|
|
73eefe6649 | ||
|
|
0f7ff301c4 | ||
|
|
17c685148e | ||
|
|
54a6c1e402 | ||
|
|
fa57c51786 | ||
|
|
8a9eba9e76 | ||
|
|
59392d8bdc | ||
|
|
45d35ec108 | ||
|
|
a773e42fca | ||
|
|
80697ed65f | ||
|
|
43fd99cea6 | ||
|
|
eafcf016f3 | ||
|
|
5a89a5d43f | ||
|
|
33715395dc | ||
|
|
05982cc2ff | ||
|
|
6706b296c0 | ||
|
|
e4be90b7bc | ||
|
|
9cc9e4b4c9 | ||
|
|
45869401ad | ||
|
|
5a88e8909f | ||
|
|
a4dc7435d0 | ||
|
|
df1689d458 | ||
|
|
76a54f41a7 | ||
|
|
89593b1dac | ||
|
|
dbd6b7a9f7 | ||
|
|
e49fcdebfc | ||
|
|
1ccdcf9bd2 | ||
|
|
60f5359bd9 | ||
|
|
71cc77bee1 | ||
|
|
460b40c9cd | ||
|
|
c2e32c774e | ||
|
|
796d9fa554 | ||
|
|
8a8c6c9997 | ||
|
|
6e420250b4 | ||
|
|
4564f0424c | ||
|
|
099d635d3e | ||
|
|
d372a38e7d | ||
|
|
fc26b95bdb | ||
|
|
44735260ce | ||
|
|
6aa3cd96a6 | ||
|
|
e1eb582804 | ||
|
|
0ad4847972 | ||
|
|
323f2ede25 | ||
|
|
a64c547395 | ||
|
|
40f5079846 | ||
|
|
464dfc6dd1 | ||
|
|
c1b3cdde6d | ||
|
|
e688c4ba25 | ||
|
|
592823aa10 | ||
|
|
5ad871a7e0 | ||
|
|
049bbc8655 | ||
|
|
dcf6df293f | ||
|
|
0dd2245fe6 | ||
|
|
cd750cca2f | ||
|
|
5f2da63339 | ||
|
|
d420128b4b | ||
|
|
2ca5eec8e1 | ||
|
|
214a570ca6 | ||
|
|
8fb021da4c | ||
|
|
439d98f99d | ||
|
|
3c4fe34c1d | ||
|
|
641353585c | ||
|
|
de9a47c2a1 | ||
|
|
e902dd7c07 | ||
|
|
ac7076ee0f | ||
|
|
b5f218b657 | ||
|
|
c468854a76 | ||
|
|
1037a68d96 | ||
|
|
9e84d894a7 | ||
|
|
dbbe11cbbc | ||
|
|
8d287351b7 | ||
|
|
724869948f | ||
|
|
0497693968 | ||
|
|
de90477276 | ||
|
|
8d4af6f347 | ||
|
|
64cb33cdfd | ||
|
|
042488ba79 | ||
|
|
cd50494141 | ||
|
|
f12b2c38f7 | ||
|
|
dbfc06960f | ||
|
|
861aae753e | ||
|
|
ccf99a3105 | ||
|
|
e245ec80c6 | ||
|
|
7564ed7ba6 | ||
|
|
721bfdf5c8 | ||
|
|
f3d9fdca7f | ||
|
|
2b78f46efe | ||
|
|
77555aeebf | ||
|
|
58d34023b7 | ||
|
|
42ac833091 | ||
|
|
94eb2909bc | ||
|
|
c46dea3ae7 | ||
|
|
3160bfd43c | ||
|
|
e1f54cc49f | ||
|
|
8b297ba8a6 | ||
|
|
dcca6d9215 | ||
|
|
0d2099af10 | ||
|
|
ff4dcc39db | ||
|
|
87bc0131cf | ||
|
|
20fce538de | ||
|
|
d2bed417f1 | ||
|
|
8d572a650a | ||
|
|
efc3efcbfb | ||
|
|
56f8d64fc8 | ||
|
|
e93a817d4d | ||
|
|
f9c8c22d5e | ||
|
|
e423562806 | ||
|
|
aa47ce24f4 | ||
|
|
3c51b92e5e | ||
|
|
697b0b3538 | ||
|
|
08b47776ec | ||
|
|
0370d1f582 | ||
|
|
fa5b427d4d | ||
|
|
21102bb991 | ||
|
|
b00b6e8412 | ||
|
|
5b4a9c0129 | ||
|
|
dc2b945230 | ||
|
|
9ff58c9e0b | ||
|
|
df0a38e3c6 | ||
|
|
33b349e333 | ||
|
|
ab14866575 | ||
|
|
0f6a3ffa80 | ||
|
|
fde4b8b16f | ||
|
|
c450eaf339 | ||
|
|
30819bbacd | ||
|
|
fce6e65218 | ||
|
|
9550f97f8e | ||
|
|
bb9c2b13e5 | ||
|
|
aafcf77004 | ||
|
|
89c9e69a03 | ||
|
|
6a072b7814 | ||
|
|
4515f0fc13 | ||
|
|
e7723c108d | ||
|
|
970fc886c6 | ||
|
|
7b093a5623 | ||
|
|
9a2e7ea72b | ||
|
|
8b188c9c75 | ||
|
|
4aed5c15a0 | ||
|
|
305d99d654 | ||
|
|
1029308b2c | ||
|
|
463e3fd0aa | ||
|
|
3ee6e16592 | ||
|
|
2b7ad1ef7d | ||
|
|
4c66ba4038 | ||
|
|
eb1ff6ddda | ||
|
|
ff837fc076 | ||
|
|
5cbddcaaf4 | ||
|
|
24884de4e4 | ||
|
|
efc4668200 | ||
|
|
a90ba0c546 | ||
|
|
d039df5361 | ||
|
|
8d4910fcb0 | ||
|
|
f30d785fb3 | ||
|
|
efdd138379 | ||
|
|
115f83aeb0 | ||
|
|
b93eaadfc2 | ||
|
|
1233f17dc4 | ||
|
|
2a2dbcca83 | ||
|
|
e9070e5cc3 | ||
|
|
7319a9aee4 | ||
|
|
93513100eb | ||
|
|
46cc618300 | ||
|
|
7ac1f2d431 | ||
|
|
d96f124bb3 | ||
|
|
3fd56531da | ||
|
|
83fa635ee9 | ||
|
|
be8dededff | ||
|
|
f318cfe6f0 | ||
|
|
3f311d8603 | ||
|
|
3b13756db9 | ||
|
|
20b3840445 | ||
|
|
2a4d95bd7b | ||
|
|
e8966f6705 | ||
|
|
a20edf7890 | ||
|
|
f1d73421c8 | ||
|
|
97611369c4 | ||
|
|
5ca265fef7 | ||
|
|
38c199f6f9 | ||
|
|
02ce6bf7c0 | ||
|
|
fc3cef37d2 | ||
|
|
d9021ea140 | ||
|
|
ebf03af9c1 | ||
|
|
044e53f2b2 | ||
|
|
01ebd94073 | ||
|
|
e9c7430a48 | ||
|
|
2150ced11f | ||
|
|
ada96d3d83 | ||
|
|
5b4a797719 | ||
|
|
18cf0b5de3 | ||
|
|
cf876aabd2 | ||
|
|
2ced1417ed | ||
|
|
6d45b2c878 | ||
|
|
f5d1014b89 | ||
|
|
13d00ee18e | ||
|
|
c73cf7002f | ||
|
|
739759ddc3 | ||
|
|
e34fc6a1f2 | ||
|
|
6e9bfb61cc | ||
|
|
5634931cc2 | ||
|
|
a7c8b90e9f | ||
|
|
8e058cebbb | ||
|
|
08acc5778a | ||
|
|
2199679d28 | ||
|
|
e730ee1541 | ||
|
|
7c1d0be9c9 | ||
|
|
5ba9352576 | ||
|
|
21ee6b7a65 | ||
|
|
dd85f03328 | ||
|
|
254afc3978 | ||
|
|
ad51719d92 | ||
|
|
e43e0a6850 | ||
|
|
535af59860 | ||
|
|
3f08036139 | ||
|
|
7f31a84000 | ||
|
|
c672a49146 | ||
|
|
e84f87fcda | ||
|
|
070f435a23 | ||
|
|
2fcdfabd3c | ||
|
|
12053b4531 | ||
|
|
1a0b2ee975 | ||
|
|
13b80de703 | ||
|
|
9bd409e672 | ||
|
|
435e47707d | ||
|
|
4da0717729 | ||
|
|
98fe6223b4 | ||
|
|
b4e84c36b8 | ||
|
|
bf92f677fe | ||
|
|
62f26719ba | ||
|
|
beff091699 | ||
|
|
72debd397f | ||
|
|
89901c75f7 | ||
|
|
8a73968f41 | ||
|
|
eb2c3d00ce | ||
|
|
dd62310e59 | ||
|
|
a782d3960a | ||
|
|
d5f91e9bab | ||
|
|
be52e2df96 | ||
|
|
72418d802c | ||
|
|
534361b540 | ||
|
|
77782a8729 | ||
|
|
7dc42fb900 | ||
|
|
da4b5a50a7 | ||
|
|
c8c411aebc | ||
|
|
8b4890560e | ||
|
|
216e08d57c | ||
|
|
f9888a2108 | ||
|
|
f3b178473c | ||
|
|
20c7b07cb9 | ||
|
|
5e4da449ad | ||
|
|
c8d0c647b7 | ||
|
|
e1eedb039c | ||
|
|
c30043d4fc | ||
|
|
58a3340f53 | ||
|
|
1143fa79ae | ||
|
|
56217a68ce | ||
|
|
6df36659ab | ||
|
|
6f599d55c5 | ||
|
|
b91888213b | ||
|
|
10221d636c | ||
|
|
5c9adba751 | ||
|
|
d2af4f224e | ||
|
|
3a029432f8 | ||
|
|
72a5385c57 | ||
|
|
1028866721 | ||
|
|
9bd37c2980 | ||
|
|
00e0bc5ab7 | ||
|
|
e69836b03c | ||
|
|
ae8ba80f67 | ||
|
|
1f3a2af043 | ||
|
|
4917b0c0c4 | ||
|
|
cec1816f82 | ||
|
|
1bc3137d20 | ||
|
|
ed416e5237 | ||
|
|
37d61658d4 | ||
|
|
9d67343e2e | ||
|
|
7477a536da | ||
|
|
59c0f73dd2 | ||
|
|
02c7ac37f5 | ||
|
|
5114f5f1eb | ||
|
|
0a1966d7bd | ||
|
|
9b457299ea | ||
|
|
8b8c0c09df | ||
|
|
eb5f3465c8 | ||
|
|
1487e7889b | ||
|
|
2c0914baf8 | ||
|
|
b75a8105de | ||
|
|
0a827e0eb6 | ||
|
|
98a773700e | ||
|
|
2189c2150e | ||
|
|
92f77bf6d6 | ||
|
|
a5799290c9 | ||
|
|
16d471f12e | ||
|
|
ec0eecde50 | ||
|
|
b649c282e8 | ||
|
|
3e6243a8b7 | ||
|
|
02b29d9553 | ||
|
|
04cec33bf6 | ||
|
|
eee5e5dc8c | ||
|
|
09166ae73c | ||
|
|
52d0c1907f | ||
|
|
5620ba61fa | ||
|
|
63b5507f78 | ||
|
|
1ad8a69717 | ||
|
|
8be072ca52 | ||
|
|
cdea0e96b6 | ||
|
|
bab677c5c2 | ||
|
|
d1fb0e0f0a | ||
|
|
08d854f6f8 | ||
|
|
93e8328940 | ||
|
|
b608fb77b9 | ||
|
|
03c027ab33 | ||
|
|
14de767c52 | ||
|
|
9e90d3a93f | ||
|
|
97fbcbbf58 | ||
|
|
1b77c903f7 | ||
|
|
844a743c6b | ||
|
|
d4cbec50ba | ||
|
|
588d16caf9 | ||
|
|
fc3512a23a | ||
|
|
f8f08fb8ce | ||
|
|
790364832d | ||
|
|
0fb3a74879 | ||
|
|
45e0f50562 | ||
|
|
caf43fedb3 | ||
|
|
1388f459fe | ||
|
|
dddfc4bed5 | ||
|
|
2057cc6b73 | ||
|
|
4e29e88b02 | ||
|
|
aff7961a4e | ||
|
|
76dbf4e216 | ||
|
|
1fc129117f | ||
|
|
f866f5fb2c | ||
|
|
38d6016aec | ||
|
|
b3a2c3a0fc | ||
|
|
c84fd8089a | ||
|
|
2e4c59d3b5 | ||
|
|
5f21b5ab26 | ||
|
|
f8331c1c1c | ||
|
|
3c15dbab9e | ||
|
|
d5eb20854f | ||
|
|
438028506e | ||
|
|
010afcd1e4 | ||
|
|
7df9333fba | ||
|
|
4160420844 | ||
|
|
9f2e8407a0 | ||
|
|
45c64ae44b | ||
|
|
e8748bab70 | ||
|
|
c30f905893 | ||
|
|
8932c232e2 | ||
|
|
295e96098c | ||
|
|
dff3a1aff7 | ||
|
|
c497c02ef9 | ||
|
|
f51360c23d | ||
|
|
2286877fad | ||
|
|
a1810baffa | ||
|
|
6bb45ccc25 | ||
|
|
5f7c0c82e7 | ||
|
|
1d964e5fcc | ||
|
|
85ca2420bd | ||
|
|
c835fe5551 | ||
|
|
9563dbdb6f | ||
|
|
3666752414 | ||
|
|
c842c50361 | ||
|
|
49c6ebf9c7 | ||
|
|
5824564e25 | ||
|
|
e484697f60 | ||
|
|
9d53d7aaa8 | ||
|
|
1feb3215e5 | ||
|
|
581819de9f | ||
|
|
8cc0f3ceb4 | ||
|
|
456687478d | ||
|
|
618f0b1bca | ||
|
|
700b9b3122 | ||
|
|
fc0bdda553 | ||
|
|
1dbe9890f3 | ||
|
|
0f7790e538 | ||
|
|
9c0430a0d8 | ||
|
|
df7631eb3a | ||
|
|
4ce613a82d | ||
|
|
d8bb450a2e | ||
|
|
774d47a86f | ||
|
|
e3318179c1 | ||
|
|
74738ff78c | ||
|
|
53ead401d0 | ||
|
|
0426d2510a | ||
|
|
ef5bbe737c | ||
|
|
50194001d9 | ||
|
|
f696d20060 | ||
|
|
83ddb7c8bf | ||
|
|
7d8c23d014 | ||
|
|
011219d491 | ||
|
|
d4b20876b2 | ||
|
|
785aae3b73 | ||
|
|
91cb245f84 | ||
|
|
0859dd28d5 | ||
|
|
df91e435bb | ||
|
|
15f96e86ac | ||
|
|
a49912bdb1 | ||
|
|
f7a7987831 | ||
|
|
8dae45e10e | ||
|
|
4d616939ad | ||
|
|
e5ad1ac93b | ||
|
|
faffa8a270 | ||
|
|
4a2342c015 | ||
|
|
283a9ebaa1 | ||
|
|
a07aa13358 | ||
|
|
b3ceb6f300 | ||
|
|
111e3d8647 | ||
|
|
606c74f3dc | ||
|
|
c88ac1fcab | ||
|
|
b9ea2087de | ||
|
|
dcadd29791 | ||
|
|
69f7e62e4e | ||
|
|
63abe74aed | ||
|
|
68c6111377 | ||
|
|
32a8b95c32 | ||
|
|
687bc3ed0c | ||
|
|
c71626adaf | ||
|
|
c0c46a1181 | ||
|
|
f0bd10bb12 | ||
|
|
92787ccd4f | ||
|
|
4794e73994 | ||
|
|
fd69bc6376 | ||
|
|
d8e8156cc9 | ||
|
|
fa2896d755 | ||
|
|
a7571a6bb7 | ||
|
|
19dc994616 | ||
|
|
a1a0e319ce | ||
|
|
0ac1fe2b4e | ||
|
|
7cbbb2270b | ||
|
|
ac1bdbe476 | ||
|
|
799fda63e9 | ||
|
|
9d56836c80 | ||
|
|
91dff782a3 | ||
|
|
8a3a0ca6ef | ||
|
|
d393a519f3 | ||
|
|
4dcd018642 | ||
|
|
accd439be8 | ||
|
|
799c7b6fdb | ||
|
|
550be3f8a3 | ||
|
|
264e5d9cd0 | ||
|
|
448dbcdf2f | ||
|
|
284673c200 | ||
|
|
887fde3620 | ||
|
|
b909c82b28 | ||
|
|
0c3ed1e1bf | ||
|
|
4b8f9e031e | ||
|
|
1337fff2dc | ||
|
|
e6d38040e0 | ||
|
|
cbf6b286db | ||
|
|
6fe2e01026 | ||
|
|
147fb6fb30 | ||
|
|
d439d94645 | ||
|
|
2c0e8c90ed | ||
|
|
08945212c7 | ||
|
|
8a91d60c46 | ||
|
|
5e78d54cea | ||
|
|
175d5b8d7f | ||
|
|
e5e6083c49 | ||
|
|
0a44598fb7 | ||
|
|
acd614a20d | ||
|
|
b36a965678 | ||
|
|
59fc7e30d8 | ||
|
|
52f600cb94 | ||
|
|
0bcfb489af | ||
|
|
18234bb713 | ||
|
|
ebffe9b1cb | ||
|
|
b0137f9384 | ||
|
|
8bb227393e | ||
|
|
cd671f9e77 | ||
|
|
f65fefe1ff | ||
|
|
cfcce08047 | ||
|
|
aa6c12e388 | ||
|
|
b34b031fcf | ||
|
|
19dff40664 | ||
|
|
2935bc2c77 | ||
|
|
1a4d20b6e2 | ||
|
|
5c93b55f58 | ||
|
|
6e418b1fc4 | ||
|
|
f81dcc1d82 | ||
|
|
63de7b9aa8 | ||
|
|
49ef7436b2 | ||
|
|
5ac9e40575 | ||
|
|
00619ab2c6 | ||
|
|
5ebef2d27f | ||
|
|
695a725b5f | ||
|
|
6fda6dcabc | ||
|
|
ef824531b8 | ||
|
|
483218ef02 | ||
|
|
4ea85a0644 | ||
|
|
03a992d480 | ||
|
|
4a25dac8ff | ||
|
|
1bcbe382d7 | ||
|
|
4ae4ba15cf | ||
|
|
775d3c67a4 | ||
|
|
ec82370934 | ||
|
|
baf87f63cc | ||
|
|
4c2ef35ac1 | ||
|
|
1b3fe413cb | ||
|
|
1af6a65a9f | ||
|
|
cf57f3ab01 | ||
|
|
af0de8734a | ||
|
|
cd43aa2f42 | ||
|
|
be76fb4001 | ||
|
|
7c7f330a0b | ||
|
|
3d844390e7 | ||
|
|
ea7adb31a6 | ||
|
|
8a563a7729 | ||
|
|
78bcf73f13 | ||
|
|
b5b15b2988 | ||
|
|
1eee432993 | ||
|
|
dc5afadd53 | ||
|
|
643699161a | ||
|
|
ed996cc27e | ||
|
|
7a544495f2 | ||
|
|
f44713eec3 | ||
|
|
dcd795b778 | ||
|
|
08a404beab | ||
|
|
63099d27c5 | ||
|
|
28b78c1345 | ||
|
|
6a4dff5cbc | ||
|
|
5239ed6d15 | ||
|
|
7b878be87d | ||
|
|
f746c9cd8f | ||
|
|
25b8bd8469 | ||
|
|
d1eb7b21d1 | ||
|
|
4ea8d66330 | ||
|
|
ca0bcc49ac | ||
|
|
d516441ff8 | ||
|
|
df58d05b84 | ||
|
|
ca2705421b | ||
|
|
291bb72cf5 | ||
|
|
7f3d1bb199 | ||
|
|
a41d0517d2 | ||
|
|
d09921ee5b | ||
|
|
e88c34e2f4 | ||
|
|
e09aad2a6d | ||
|
|
9500bc4656 | ||
|
|
a13c6a37fa | ||
|
|
1d924d7d40 | ||
|
|
b1e0e74d8a | ||
|
|
c58f639346 | ||
|
|
f0e9b74132 | ||
|
|
9a725de4a9 | ||
|
|
6efa998532 | ||
|
|
2d877877e2 | ||
|
|
e037720115 | ||
|
|
fdd4036797 | ||
|
|
e001d01f15 | ||
|
|
efad9eb0d9 | ||
|
|
f6169c962d | ||
|
|
b073e322d4 | ||
|
|
f901367817 | ||
|
|
e94443ad8a | ||
|
|
2d20ea1196 | ||
|
|
a275a911f6 | ||
|
|
1f08cf0b81 | ||
|
|
2a3f76c3dc | ||
|
|
45c6c10755 | ||
|
|
5a265d4ef6 | ||
|
|
63c12958f7 | ||
|
|
809c16e1e1 | ||
|
|
dc9b72f487 | ||
|
|
2bf0ab226f | ||
|
|
0c2c9bb1e2 | ||
|
|
b006e36d52 | ||
|
|
2392bfa2a7 | ||
|
|
16ef6bde34 | ||
|
|
933909c1e9 | ||
|
|
a9c7e1fa25 | ||
|
|
aee1990243 | ||
|
|
88caba317b | ||
|
|
3843b16587 | ||
|
|
b86ca9fac8 | ||
|
|
1fb82dad92 | ||
|
|
b879245df2 | ||
|
|
224c9c4372 | ||
|
|
c16964c1de | ||
|
|
1d52047559 | ||
|
|
0b9fd8712a | ||
|
|
edf53a91f9 | ||
|
|
5884f282e4 | ||
|
|
b6e368938d | ||
|
|
e7fa371c1b | ||
|
|
270c3b0aae | ||
|
|
27e0cd3b53 | ||
|
|
8ff2ff0c38 | ||
|
|
6c0c89a0dc | ||
|
|
e264f3b3dd | ||
|
|
e3605b647c | ||
|
|
25eff13c41 | ||
|
|
d2493b0331 | ||
|
|
82cede65ef | ||
|
|
3549376f34 | ||
|
|
7b61f7cb86 | ||
|
|
87b5c36e6a | ||
|
|
5c48dbf60e | ||
|
|
cc789ee7e0 | ||
|
|
087870b1ec | ||
|
|
393bc99d9b | ||
|
|
93b40740b5 | ||
|
|
140ec13626 | ||
|
|
2cab985bd0 | ||
|
|
4ab889b43e | ||
|
|
cd52a11d0e | ||
|
|
014ec3924f | ||
|
|
a62ce451c4 | ||
|
|
7badb8ef7b | ||
|
|
4d39805ef4 | ||
|
|
4b1a684d69 | ||
|
|
a22b4de1b6 | ||
|
|
462ed568de | ||
|
|
92bcd46549 | ||
|
|
e22d58101c | ||
|
|
193ede3d55 | ||
|
|
edc4d59f90 | ||
|
|
56e38831f1 | ||
|
|
6a159f773e | ||
|
|
e94e16c9e6 | ||
|
|
e70e5f7cb4 | ||
|
|
3946d26cb4 | ||
|
|
7534fc7c24 | ||
|
|
766562fb7d | ||
|
|
2c1e4e7d26 | ||
|
|
3775913a33 | ||
|
|
42a9ecda27 | ||
|
|
eafa88258f | ||
|
|
9a143bd266 | ||
|
|
b6c9c8cf22 | ||
|
|
f31843f665 | ||
|
|
6e2bf48b43 | ||
|
|
1278a2365d | ||
|
|
3407b51c27 | ||
|
|
adb37826a5 | ||
|
|
0fdcbffcae | ||
|
|
d575220aec | ||
|
|
69de3b038a | ||
|
|
773a1f2d15 | ||
|
|
a4331c8267 | ||
|
|
bfa506911c | ||
|
|
a2432927ee | ||
|
|
126a0e2663 | ||
|
|
f3f6ad4291 | ||
|
|
ffc70efaf4 | ||
|
|
951a62ad06 | ||
|
|
d8d8f24843 | ||
|
|
c75e88c871 | ||
|
|
47af8c11d3 | ||
|
|
6c85732748 | ||
|
|
8cd3b6a7b0 | ||
|
|
d1ef582349 | ||
|
|
6d47789708 | ||
|
|
66a31fc1e9 | ||
|
|
d84c3ca4d8 | ||
|
|
98c8b0e7a8 | ||
|
|
68c4bf5956 | ||
|
|
b131ba01a8 | ||
|
|
f5642a2676 | ||
|
|
1585066b57 | ||
|
|
1ee5724082 | ||
|
|
511d86a186 | ||
|
|
d91ca4b56b | ||
|
|
e14dc37060 | ||
|
|
1e058726d4 | ||
|
|
26982a5729 | ||
|
|
494c6edf76 | ||
|
|
61bfa51fa7 | ||
|
|
81fe244c23 | ||
|
|
98f74fa971 | ||
|
|
bb260426c9 | ||
|
|
02b31634f8 | ||
|
|
35c449bd0c | ||
|
|
2b7f6a8dac | ||
|
|
2a4eeb2d77 | ||
|
|
a08be1ee73 | ||
|
|
21390eaba6 | ||
|
|
5f0c56b19f | ||
|
|
714780d0b6 | ||
|
|
d852e390b3 | ||
|
|
bb2087c002 | ||
|
|
15ac3608c4 | ||
|
|
e4e8c97cfd | ||
|
|
3ef8674caf | ||
|
|
58a2be10aa | ||
|
|
bcae594b3f | ||
|
|
763acec379 | ||
|
|
12bd4e80dd | ||
|
|
4f456e0c40 | ||
|
|
c6ef378bc9 | ||
|
|
9689080387 | ||
|
|
6ecddf07f6 | ||
|
|
89ecf478ba | ||
|
|
d9e7efa15a | ||
|
|
6e6edde77f | ||
|
|
b2c944f9b1 | ||
|
|
852ffd0602 | ||
|
|
a06fe00440 | ||
|
|
8c1c5ed4f0 | ||
|
|
123187aa8a | ||
|
|
644c26355c | ||
|
|
432b288c34 | ||
|
|
f6cec9d769 | ||
|
|
29ece2f91c | ||
|
|
e3aa3f6721 | ||
|
|
b1ccdcb5c1 | ||
|
|
a541ac4945 | ||
|
|
38cbcb6430 | ||
|
|
c593ed903e | ||
|
|
d488f62648 | ||
|
|
aefbcdb2a0 | ||
|
|
c1bdb53a4d | ||
|
|
38dc09af7f | ||
|
|
d83b497fa0 | ||
|
|
5b31a94b74 | ||
|
|
ee1afaa78b | ||
|
|
910d5d58dc | ||
|
|
6dfba78dbf | ||
|
|
cd98f30ad2 | ||
|
|
893b7af55a | ||
|
|
3bb8cb2ab7 | ||
|
|
22b1fbca90 | ||
|
|
ddcfa71273 | ||
|
|
8d123d306f | ||
|
|
a380a68855 | ||
|
|
39d0a73e39 | ||
|
|
a01f99fa7e | ||
|
|
8a0411bd92 | ||
|
|
8cd4f12de3 | ||
|
|
4a528dafb8 | ||
|
|
b3a9302f53 | ||
|
|
575b17a919 | ||
|
|
41433329da | ||
|
|
e52f9ea9e7 | ||
|
|
1892f9de9f | ||
|
|
db0c850d70 | ||
|
|
060aba08a9 | ||
|
|
5ac7572a3d | ||
|
|
c9e2742745 | ||
|
|
5a77c5f660 | ||
|
|
1301db3af4 | ||
|
|
2cd877fb17 | ||
|
|
9dc3759f99 | ||
|
|
66f1bfa14b | ||
|
|
d7c262c87a | ||
|
|
02da6ae134 | ||
|
|
3336454719 | ||
|
|
5967db86a1 | ||
|
|
2acd67707e | ||
|
|
70f38e9352 | ||
|
|
687e843e5f | ||
|
|
43eaa61007 |
+24
-4
@@ -1,7 +1,27 @@
|
||||
TestBenchFramework/bin/
|
||||
TestBenchFramework/obj/
|
||||
Config/bin/
|
||||
Config/obj/
|
||||
DeviceTest/bin/
|
||||
DeviceTest/obj/
|
||||
Dirichlet.Numerics/bin
|
||||
Dirichlet.Numerics/obj
|
||||
GemCard/bin
|
||||
GemCard/obj
|
||||
GraphLib/bin
|
||||
GraphLib/obj
|
||||
MonitoringDB/bin
|
||||
MonitoringDB/obj
|
||||
Results/bin/
|
||||
Results/obj/
|
||||
ResultsBrowser/bin/
|
||||
ResultsBrowser/obj/
|
||||
TBFSetup/
|
||||
TBF/bin/
|
||||
TBF/obj/
|
||||
TBFSetup/Debug/
|
||||
TBFSetup/Release/
|
||||
Users/bin/
|
||||
Users/obj/
|
||||
UserManagement/bin/
|
||||
UserManagement/obj/
|
||||
Doc/
|
||||
*.suo
|
||||
*.suo
|
||||
*.bak
|
||||
|
||||
@@ -0,0 +1,149 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>8.0.30703</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{743DF7DB-C7B6-42EB-986D-0F485E5588E4}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Config</RootNamespace>
|
||||
<AssemblyName>Config</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>TRACE;DEBUG;SENTEC</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<AllowUnsafeBlocks>false</AllowUnsafeBlocks>
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE;SENTEC</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="FluentNHibernate">
|
||||
<HintPath>..\packages\FluentNHibernate.2.0.3.0\lib\net40\FluentNHibernate.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Iesi.Collections">
|
||||
<HintPath>..\packages\Iesi.Collections.4.0.0.4000\lib\net40\Iesi.Collections.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="log4net">
|
||||
<HintPath>..\packages\log4net.2.0.2\lib\net40-full\log4net.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="MySql.Data">
|
||||
<HintPath>..\packages\MySql.Data.6.6.5\lib\net40\MySql.Data.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="NHibernate">
|
||||
<HintPath>..\packages\NHibernate.4.0.4.4000\lib\net40\NHibernate.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Data.SQLite">
|
||||
<HintPath>..\packages\System.Data.SQLite.1.0.90.0\lib\net40\System.Data.SQLite.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Data.SQLite.Linq">
|
||||
<HintPath>..\packages\System.Data.SQLite.1.0.90.0\lib\net40\System.Data.SQLite.Linq.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<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="Data.cs" />
|
||||
<Compile Include="DatabaseSettings.cs" />
|
||||
<Compile Include="Entities\BenchPath.cs" />
|
||||
<Compile Include="Entities\Component.cs" />
|
||||
<Compile Include="Entities\ComponentProcedure.cs" />
|
||||
<Compile Include="Entities\ComponentTest.cs" />
|
||||
<Compile Include="Entities\Enums.cs" />
|
||||
<Compile Include="Entities\FeedingPath.cs" />
|
||||
<Compile Include="Entities\Group.cs" />
|
||||
<Compile Include="Entities\HeatMetersPath.cs" />
|
||||
<Compile Include="Entities\IHasItemNr.cs" />
|
||||
<Compile Include="Entities\IHasName.cs" />
|
||||
<Compile Include="Entities\IHasValves.cs" />
|
||||
<Compile Include="Entities\IParamsProvider.cs" />
|
||||
<Compile Include="Entities\MeasurementCorrection.cs" />
|
||||
<Compile Include="Entities\MetersPath.cs" />
|
||||
<Compile Include="Entities\OutputPath.cs" />
|
||||
<Compile Include="Entities\Procedure.cs" />
|
||||
<Compile Include="Entities\ProcedureHistory.cs" />
|
||||
<Compile Include="Entities\Test.cs" />
|
||||
<Compile Include="Entities\TransitionSequence.cs" />
|
||||
<Compile Include="Entities\TransitionStep.cs" />
|
||||
<Compile Include="Entities\User.cs" />
|
||||
<Compile Include="Entities\VirtualBenchSequence.cs" />
|
||||
<Compile Include="Entities\VirtualBenchStep.cs" />
|
||||
<Compile Include="Entities\Watermeter.cs" />
|
||||
<Compile Include="Entities\WMType.cs" />
|
||||
<Compile Include="FluentCommon.cs" />
|
||||
<Compile Include="Formulas.cs" />
|
||||
<Compile Include="Mappings\BenchPathMap.cs" />
|
||||
<Compile Include="Mappings\ComponentMap.cs" />
|
||||
<Compile Include="Mappings\ComponentProcedureMap.cs" />
|
||||
<Compile Include="Mappings\ComponentTestMap.cs" />
|
||||
<Compile Include="Mappings\FeedingPathMap.cs" />
|
||||
<Compile Include="Mappings\GroupMap.cs" />
|
||||
<Compile Include="Mappings\HeatMetersPathMap.cs" />
|
||||
<Compile Include="Mappings\MeasurementCorrectionMap.cs" />
|
||||
<Compile Include="Mappings\MetersPathMap.cs" />
|
||||
<Compile Include="Mappings\OutputPathMap.cs" />
|
||||
<Compile Include="Mappings\ProcedureMap.cs" />
|
||||
<Compile Include="Mappings\TestMap.cs" />
|
||||
<Compile Include="Mappings\TransitionSequenceMap.cs" />
|
||||
<Compile Include="Mappings\TransitionStepMap.cs" />
|
||||
<Compile Include="Mappings\UserMap.cs" />
|
||||
<Compile Include="Mappings\VirtualBenchSequenceMap.cs" />
|
||||
<Compile Include="Mappings\VirtualBenchStepMap.cs" />
|
||||
<Compile Include="Mappings\WatermeterMap.cs" />
|
||||
<Compile Include="Mappings\WMTypeMap.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Resources\Strings.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTime>True</DesignTime>
|
||||
<DependentUpon>Strings.resx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Units.cs" />
|
||||
<Compile Include="Utils.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Resources\Strings.cs.resx" />
|
||||
<EmbeddedResource Include="Resources\Strings.de.resx" />
|
||||
<EmbeddedResource Include="Resources\Strings.it.resx" />
|
||||
<EmbeddedResource Include="Resources\Strings.pl.resx" />
|
||||
<EmbeddedResource Include="Resources\Strings.resx">
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Resources\Strings.ru.resx" />
|
||||
<EmbeddedResource Include="Resources\Strings.zh-CN.resx" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Users\Users.csproj">
|
||||
<Project>{6E5CB0E9-E1B6-4E5D-AC6E-B1049E180F2B}</Project>
|
||||
<Name>Users</Name>
|
||||
</ProjectReference>
|
||||
</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>
|
||||
@@ -0,0 +1,84 @@
|
||||
using System;
|
||||
|
||||
namespace Config
|
||||
{
|
||||
public class Data : Users.GlobalData
|
||||
{
|
||||
public const string AdminUsername = "admin";
|
||||
public const string AdminPassword = "staratura";
|
||||
public const string SQLiteDbFName = "SQLite.db";
|
||||
|
||||
#if MUNICH
|
||||
public const int WMsCount = 3;
|
||||
public const int LineSize = 1;
|
||||
public const int CompoundWMsCount = 1;
|
||||
public const int HeatMetersCount = 0;
|
||||
public const int MaxPartNr = 3;
|
||||
#elif DN100 || BADGER_STREDNA_TRAT || BADGER_VELKA_TRAT
|
||||
public const int WMsCount = 3;
|
||||
public const int LineSize = 3;
|
||||
public const int CompoundWMsCount = 1;
|
||||
public const int HeatMetersCount = 0;
|
||||
public const int MaxPartNr = WMsCount / LineSize;
|
||||
#elif FUZHOU300 || FUZHOU150 || PT200IL || PUCHONG_PT200 || GENESIS || SLM_150 || PETERSBURG_200
|
||||
public const int WMsCount = 6;
|
||||
public const int LineSize = 6;
|
||||
public const int CompoundWMsCount = 3;
|
||||
public const int HeatMetersCount = 0;
|
||||
public const int MaxPartNr = 3;
|
||||
#elif TORINO50 || BADGER_MALA_TRAT || BERLIN
|
||||
public const int WMsCount = 6;
|
||||
public const int LineSize = 6;
|
||||
public const int CompoundWMsCount = 1;
|
||||
public const int HeatMetersCount = 0;
|
||||
public const int MaxPartNr = 1;
|
||||
#elif TORUN_PT50_2015 || CEVAK_PT40_272 || MURES_PT40 || FUZHOU_40 || PETERSBURG_50 || KEMPNO_50 || BAHRAIN_50 || KRAKOW_50 || JUZNA_AFRIKA_50 || ZAMBIA
|
||||
public const int WMsCount = 20;
|
||||
public const int LineSize = 10;
|
||||
public const int CompoundWMsCount = 1;
|
||||
public const int HeatMetersCount = 0;
|
||||
public const int MaxPartNr = WMsCount / LineSize;
|
||||
#elif RUM_MOB
|
||||
public const int WMsCount = 8;
|
||||
public const int LineSize = 8;
|
||||
public const int CompoundWMsCount = 1;
|
||||
public const int HeatMetersCount = 0;
|
||||
public const int MaxPartNr = WMsCount / LineSize;
|
||||
#elif TURA_IPERL
|
||||
public const int WMsCount = 40;
|
||||
public const int LineSize = 20;
|
||||
public const int CompoundWMsCount = 1;
|
||||
public const int HeatMetersCount = 0;
|
||||
public const int MaxPartNr = WMsCount / LineSize;
|
||||
#elif TURA_SPECIAL || SENTEC
|
||||
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 SLM_50
|
||||
public const int WMsCount = 12;
|
||||
public const int LineSize = 12;
|
||||
public const int CompoundWMsCount = 1;
|
||||
public const int HeatMetersCount = 6;
|
||||
public const int MaxPartNr = WMsCount / LineSize;
|
||||
#elif SLM_END || WARSAW_END
|
||||
public const int WMsCount = 10;
|
||||
public const int LineSize = 5;
|
||||
public const int CompoundWMsCount = 1;
|
||||
public const int HeatMetersCount = 0;
|
||||
public const int MaxPartNr = 4;
|
||||
#elif MALTA_WSD25
|
||||
public const int WMsCount = 6;
|
||||
public const int LineSize = 6;
|
||||
public const int CompoundWMsCount = 0;
|
||||
public const int HeatMetersCount = 0;
|
||||
public const int MaxPartNr = WMsCount / LineSize;
|
||||
#endif
|
||||
|
||||
///
|
||||
/// Database related: This object reference is set after a successful user login
|
||||
///
|
||||
public static DatabaseSettings CurrentBench;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2017 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Text;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Config
|
||||
{
|
||||
/// <summary>
|
||||
/// Test bench database settings, contains bench name and settings od several databases
|
||||
/// </summary>
|
||||
public class DatabaseSettings : ICloneable
|
||||
{
|
||||
// Public fields
|
||||
public string BenchName;
|
||||
public bool IsRealBench;
|
||||
public Users.DBSettings ProceduresDBSettings; /// Config database settings
|
||||
public Users.DBSettings WaterMetersDBSettings; /// Results database settings
|
||||
public Users.DBSettings UsersDBSettings; /// Users database settings
|
||||
|
||||
// Constructor
|
||||
public DatabaseSettings()
|
||||
{
|
||||
BenchName = String.Empty; /// Empty string (avoid null)
|
||||
IsRealBench = false;
|
||||
ProceduresDBSettings = new Users.DBSettings(Users.Entities.DBType.MySql, string.Empty);
|
||||
WaterMetersDBSettings = new Users.DBSettings(Users.Entities.DBType.MySql, string.Empty);
|
||||
UsersDBSettings = new Users.DBSettings(Users.Entities.DBType.MySql, string.Empty);
|
||||
}
|
||||
|
||||
public object Clone()
|
||||
{
|
||||
DatabaseSettings result = new DatabaseSettings();
|
||||
|
||||
result.BenchName = BenchName;
|
||||
result.IsRealBench = IsRealBench;
|
||||
result.ProceduresDBSettings = (Users.DBSettings)ProceduresDBSettings.Clone();
|
||||
result.WaterMetersDBSettings = (Users.DBSettings)WaterMetersDBSettings.Clone();
|
||||
result.UsersDBSettings = (Users.DBSettings)ProceduresDBSettings.Clone();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return string.Format("{0} config={1} results={2} users={3}",
|
||||
BenchName,
|
||||
ProceduresDBSettings.ConnectionString,
|
||||
WaterMetersDBSettings.ConnectionString,
|
||||
UsersDBSettings.ConnectionString);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2017 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class BenchPath : IHasName, IHasItemNr, IHasValves
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual int ItemNr { get; set; }
|
||||
public virtual string Name { get; set; }
|
||||
public virtual string OriName { get; set; } /// Not mapped to database
|
||||
public virtual float Qfrom { get; set; } /// Water flow in [m3/h]
|
||||
public virtual float Qto { get; set; } /// Water flow in [m3/h]
|
||||
public virtual string TempMtrUp { get; set; }
|
||||
public virtual string TempMtrDown { get; set; }
|
||||
public virtual string PressMtrUp { get; set; }
|
||||
public virtual string PressMtrDown { get; set; }
|
||||
public virtual string PressMtrDelta { get; set; }
|
||||
public virtual string StopBFValve { get; set; }
|
||||
|
||||
/// Valves
|
||||
public virtual string ValvesOpen { get; set; }
|
||||
public virtual string ValvesClose { get; set; }
|
||||
|
||||
/// ------------- Additional stuff not mapped into the database -------------
|
||||
|
||||
public BenchPath()
|
||||
{
|
||||
ValvesOpen = string.Empty;
|
||||
ValvesClose = string.Empty;
|
||||
}
|
||||
|
||||
public BenchPath(string name, int itemNr)
|
||||
: this()
|
||||
{
|
||||
Name = name;
|
||||
ItemNr = itemNr;
|
||||
}
|
||||
|
||||
public virtual BenchPath Clone(string name, int itemNr)
|
||||
{
|
||||
BenchPath result = new BenchPath(name, itemNr);
|
||||
|
||||
result.Qfrom = Qfrom;
|
||||
result.Qto = Qto;
|
||||
result.TempMtrUp = TempMtrUp;
|
||||
result.TempMtrDown = TempMtrDown;
|
||||
result.PressMtrUp = PressMtrUp;
|
||||
result.PressMtrDown = PressMtrDown;
|
||||
result.PressMtrDelta = PressMtrDelta;
|
||||
result.StopBFValve = StopBFValve;
|
||||
result.ValvesOpen = ValvesOpen;
|
||||
result.ValvesClose = ValvesClose;
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,136 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class Component : IHasName, IHasItemNr
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual int ItemNr { get; set; }
|
||||
public virtual string Name { get; set; }
|
||||
public virtual string ClassName { get; set; }
|
||||
public virtual string ParentName { get; set; }
|
||||
public virtual DebugMode Mode { get; set; }
|
||||
public virtual LogLevel Logging { get; set; }
|
||||
public virtual string Parameters { get; set; }
|
||||
public virtual IList<MeasurementCorrection> Corrections { get; set; }
|
||||
|
||||
/// ------------- Additional stuff not mapped into the database -------------
|
||||
|
||||
public Component()
|
||||
{
|
||||
Name = string.Empty;
|
||||
ClassName = string.Empty;
|
||||
Corrections = new List<MeasurementCorrection>();
|
||||
}
|
||||
|
||||
public static Component CreateFromCfg(string name, string className, string parentName, int itemNr,
|
||||
DebugMode debugLevel, LogLevel logLevel, string parameters)
|
||||
{
|
||||
Component result = new Component();
|
||||
result.ItemNr = itemNr;
|
||||
result.Name = name;
|
||||
result.ClassName = className;
|
||||
result.ParentName = parentName;
|
||||
result.Mode = debugLevel;
|
||||
result.Logging = logLevel;
|
||||
result.Parameters = parameters;
|
||||
return result;
|
||||
}
|
||||
|
||||
// Makes a new copy of this object (not just a reference)
|
||||
public virtual Component Clone()
|
||||
{
|
||||
Component result = new Component();
|
||||
result.ItemNr = ItemNr;
|
||||
result.Name = Name;
|
||||
result.ClassName = ClassName;
|
||||
result.ParentName = ParentName;
|
||||
result.Mode = Mode;
|
||||
result.Logging = Logging;
|
||||
result.Parameters = Parameters;
|
||||
return result;
|
||||
}
|
||||
|
||||
public virtual void Export(StreamWriter output)
|
||||
{
|
||||
output.WriteLine(Name);
|
||||
output.WriteLine(ClassName);
|
||||
output.WriteLine(ParentName);
|
||||
output.WriteLine(Mode.ToString());
|
||||
output.WriteLine(Logging.ToString());
|
||||
output.Write(Parameters);
|
||||
|
||||
output.Close();
|
||||
}
|
||||
|
||||
public static Component Import(StreamReader input)
|
||||
{
|
||||
Component result = new Component();
|
||||
|
||||
result.Name = input.ReadLine();
|
||||
result.ClassName = input.ReadLine();
|
||||
result.ParentName = input.ReadLine();
|
||||
|
||||
string line = input.ReadLine();
|
||||
if (line.Equals(DebugMode.DetectedOff.ToString())) result.Mode = DebugMode.DetectedOff;
|
||||
else if (line.Equals(DebugMode.DetectedOn.ToString())) result.Mode = DebugMode.DetectedOn;
|
||||
else if (line.Equals(DebugMode.Normal.ToString())) result.Mode = DebugMode.Normal;
|
||||
else if (line.Equals(DebugMode.AutoDetect.ToString())) result.Mode = DebugMode.AutoDetect;
|
||||
else if (line.Equals(DebugMode.FailureDuringOperation.ToString())) result.Mode = DebugMode.FailureDuringOperation;
|
||||
else if (line.Equals(DebugMode.Off.ToString())) result.Mode = DebugMode.Off;
|
||||
else if (line.Equals(DebugMode.Record.ToString())) result.Mode = DebugMode.Record;
|
||||
else if (line.Equals(DebugMode.Reply.ToString())) result.Mode = DebugMode.Reply;
|
||||
else if (line.Equals(DebugMode.Simulate.ToString())) result.Mode = DebugMode.Simulate;
|
||||
else if (line.Equals(DebugMode.Inherit.ToString())) result.Mode = DebugMode.Inherit;
|
||||
|
||||
line = input.ReadLine();
|
||||
if (line.Equals(LogLevel.Off.ToString())) result.Logging = LogLevel.Off;
|
||||
else if (line.Equals(LogLevel.Fatal.ToString())) result.Logging = LogLevel.Fatal;
|
||||
else if (line.Equals(LogLevel.Error.ToString())) result.Logging = LogLevel.Error;
|
||||
else if (line.Equals(LogLevel.Warn.ToString())) result.Logging = LogLevel.Warn;
|
||||
else if (line.Equals(LogLevel.Info.ToString())) result.Logging = LogLevel.Info;
|
||||
else if (line.Equals(LogLevel.Debug.ToString())) result.Logging = LogLevel.Debug;
|
||||
else if (line.Equals(LogLevel.All.ToString())) result.Logging = LogLevel.All;
|
||||
|
||||
result.Parameters = string.Empty;
|
||||
line = input.ReadLine();
|
||||
while (line != null)
|
||||
{
|
||||
result.Parameters += line;
|
||||
result.Parameters += Environment.NewLine;
|
||||
line = input.ReadLine();
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public virtual string ToString(string indent)
|
||||
{
|
||||
string result = string.Empty;
|
||||
|
||||
result += indent + "ItemNr = " + (ItemNr + 1).ToString() + Environment.NewLine;
|
||||
result += indent + "Name = " + Name + Environment.NewLine;
|
||||
result += indent + "ClassName = " + ClassName + Environment.NewLine;
|
||||
if (ParentName != null)
|
||||
{
|
||||
result += indent + "ParentName = " + ParentName + Environment.NewLine;
|
||||
}
|
||||
result += indent + "DebugLevel = " + Mode.ToString() + Environment.NewLine;
|
||||
result += indent + "LogLevel = " + Logging.ToString() + Environment.NewLine;
|
||||
result += indent + "Parameters = " + Parameters + Environment.NewLine;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return string.Format("{0} ({1})", Name, ClassName);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2018 Sensus Slovensko a.s.
|
||||
///
|
||||
using System;
|
||||
using System.IO;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class ComponentProcedure
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual string CmpntName { get; set; } /// Component name
|
||||
public virtual string Parameters { get; set; }
|
||||
public virtual Procedure Procedure { get; set; }
|
||||
|
||||
IParamsProvider paramsProvider;
|
||||
///
|
||||
public virtual IParamsProvider GetParamsProvider() { return paramsProvider; }
|
||||
public virtual void SetParamsProvider(IParamsProvider paramsProvider) { this.paramsProvider = paramsProvider; }
|
||||
|
||||
|
||||
protected ComponentProcedure() { }
|
||||
|
||||
public ComponentProcedure(string name, string parameters, Procedure procedure)
|
||||
{
|
||||
this.CmpntName = name;
|
||||
this.Parameters = parameters;
|
||||
this.Procedure = procedure;
|
||||
}
|
||||
|
||||
|
||||
public virtual ComponentProcedure Clone(Procedure newProcedure)
|
||||
{
|
||||
return new ComponentProcedure(CmpntName, Parameters, newProcedure);
|
||||
}
|
||||
|
||||
public virtual void Export(StreamWriter output)
|
||||
{
|
||||
output.WriteLine(CmpntName);
|
||||
output.WriteLine(Parameters.Replace(Environment.NewLine, "~"));
|
||||
}
|
||||
|
||||
public static ComponentProcedure Import(StreamReader input, Procedure newProcedure)
|
||||
{
|
||||
string firstLine = input.ReadLine();
|
||||
|
||||
if (string.IsNullOrEmpty(firstLine)) return null;
|
||||
|
||||
try
|
||||
{
|
||||
string cmptnName = firstLine;
|
||||
string parameters = input.ReadLine().Replace("~", Environment.NewLine);
|
||||
return new ComponentProcedure(cmptnName, parameters, newProcedure);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2018 Sensus Slovensko a.s.
|
||||
///
|
||||
using System;
|
||||
using System.IO;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class ComponentTest
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual string CmpntName { get; set; } /// Component name
|
||||
public virtual string Parameters { get; set; }
|
||||
public virtual Test Test { get; set; }
|
||||
|
||||
IParamsProvider paramsProvider;
|
||||
///
|
||||
public virtual IParamsProvider GetParamsProvider() { return paramsProvider; }
|
||||
public virtual void SetParamsProvider(IParamsProvider paramsProvider) { this.paramsProvider = paramsProvider; }
|
||||
|
||||
|
||||
protected ComponentTest() { }
|
||||
|
||||
public ComponentTest(string name, string parameters, Test test)
|
||||
{
|
||||
this.CmpntName = name;
|
||||
this.Parameters = parameters;
|
||||
this.Test = test;
|
||||
}
|
||||
|
||||
|
||||
public virtual ComponentTest Clone()
|
||||
{
|
||||
return new ComponentTest(CmpntName, Parameters, Test);
|
||||
}
|
||||
|
||||
public virtual void Export(StreamWriter output)
|
||||
{
|
||||
output.WriteLine(CmpntName);
|
||||
output.WriteLine(Parameters.Replace(Environment.NewLine, "~"));
|
||||
}
|
||||
|
||||
public static ComponentTest Import(StreamReader input, Test newTest)
|
||||
{
|
||||
string firstLine = input.ReadLine();
|
||||
|
||||
if (string.IsNullOrEmpty(firstLine)) return null;
|
||||
|
||||
try
|
||||
{
|
||||
string cmptnName = firstLine;
|
||||
string parameters = input.ReadLine().Replace("~", Environment.NewLine);
|
||||
return new ComponentTest(cmptnName, parameters, newTest);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,455 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2017 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
/// <summary>
|
||||
/// Helper class to assign descriptions to enum values
|
||||
/// </summary>
|
||||
public class Description : Attribute
|
||||
{
|
||||
public string Text;
|
||||
public Description(string t)
|
||||
{
|
||||
Text = t;
|
||||
}
|
||||
}
|
||||
|
||||
public static class GetDescription
|
||||
{
|
||||
/// Extension method for enum-s
|
||||
public static string ToDescription(this Enum en)
|
||||
{
|
||||
Type type = en.GetType();
|
||||
MemberInfo[] memInfo = type.GetMember(en.ToString());
|
||||
|
||||
if (memInfo != null && memInfo.Length > 0)
|
||||
{
|
||||
object[] attrs = memInfo[0].GetCustomAttributes(typeof(Description), false);
|
||||
if (attrs != null && attrs.Length > 0)
|
||||
return ((Description)attrs[0]).Text;
|
||||
}
|
||||
|
||||
return en.ToString(); /// Return ToString() value in case there is no description
|
||||
}
|
||||
}
|
||||
|
||||
public enum ProcedureState
|
||||
{
|
||||
Active,
|
||||
History,
|
||||
Count,
|
||||
}
|
||||
|
||||
/// <summary> Kind of meters for the procedure / test </summary>
|
||||
public enum MetersKind
|
||||
{
|
||||
#if LANG_DE
|
||||
[Description("Wasserzähler")] Single,
|
||||
[Description("Verbundwasserzähler")] Combined,
|
||||
[Description("Wärmezähler")] HeatMeter,
|
||||
#elif LANG_CS
|
||||
[Description("Vodoměry")] Single,
|
||||
[Description("Kombinované vodoměry")] Combined,
|
||||
[Description("Měřiče tepla")] HeatMeter,
|
||||
#elif LANG_RU
|
||||
[Description("Счетчик")] Single,
|
||||
[Description("Комбинированный счетчик")] Combined,
|
||||
[Description("Счетчик тепла")] HeatMeter,
|
||||
#else
|
||||
[Description("Water meters")] Single,
|
||||
[Description("Compound water meters")] Combined,
|
||||
[Description("Heat meters")] HeatMeter,
|
||||
#endif
|
||||
}
|
||||
|
||||
public enum CompoundMeterId : byte
|
||||
{
|
||||
Single,
|
||||
CompoundMain,
|
||||
CompoundAux,
|
||||
Compound,
|
||||
HeatMeterVolume,
|
||||
HeatMeterEnergy,
|
||||
SingleOrCompound, /// Only used when querying results
|
||||
}
|
||||
|
||||
public enum Medium
|
||||
{
|
||||
[Description("")] NotSpecified,
|
||||
#if LANG_PL
|
||||
[Description("zimna")] ColdWater,
|
||||
[Description("ciepła")] HotWater,
|
||||
#elif LANG_IT
|
||||
[Description("freddo")] ColdWater,
|
||||
[Description("caldo")] HotWater,
|
||||
#else
|
||||
[Description("cold")] ColdWater,
|
||||
[Description("hot")] HotWater,
|
||||
#endif
|
||||
Count
|
||||
}
|
||||
|
||||
public enum Mounting
|
||||
{
|
||||
[Description("")] NotSpecified,
|
||||
#if LANG_DE
|
||||
[Description("H")] H, /// horizontal
|
||||
[Description("V")] V, /// vertical
|
||||
[Description("STR")] S, /// standrohre
|
||||
[Description("F")] F, /// fall
|
||||
#else
|
||||
[Description("H")] H, /// horizontal
|
||||
[Description("V")] V, /// vertical
|
||||
[Description("S")] S, /// steig
|
||||
[Description("F")] F, /// fall
|
||||
#endif
|
||||
Count
|
||||
}
|
||||
|
||||
public enum TemperatureClass
|
||||
{
|
||||
[Description("")] NotSpecified,
|
||||
[Description("T30")] T30,
|
||||
[Description("T50")] T50,
|
||||
[Description("T70")] T70,
|
||||
[Description("T90")] T90,
|
||||
[Description("T130")] T130,
|
||||
[Description("T180")] T180,
|
||||
[Description("T30/70")] T30_70,
|
||||
[Description("T30/90")] T30_90,
|
||||
[Description("T30/130")] T30_130,
|
||||
[Description("T30/180")] T30_180,
|
||||
[Description("30")] t30,
|
||||
[Description("50")] t50,
|
||||
[Description("70")] t70,
|
||||
[Description("90")] t90,
|
||||
[Description("130")] t130,
|
||||
[Description("180")] t180,
|
||||
Count
|
||||
}
|
||||
|
||||
public enum FlowProfileSensitivityClass
|
||||
{
|
||||
[Description("")] NotSpecified,
|
||||
[Description("U0")] U0, /// ?
|
||||
[Description("D0")] D0, /// ?
|
||||
Count
|
||||
}
|
||||
|
||||
public enum PressureLossClass
|
||||
{
|
||||
[Description("")] NotSpecified,
|
||||
[Description("dp63")] dp63, /// 0.063 MPa = 0.63 bar, TODO: Change to "Δp63"
|
||||
[Description("dp40")] dp40, /// 0.040 MPa = 0.40 bar
|
||||
[Description("dp25")] dp25, /// 0.025 MPa = 0.25 bar
|
||||
[Description("dp16")] dp16, /// 0.016 MPa = 0.16 bar
|
||||
[Description("dp10")] dp10, /// 0.010 MPa = 0.10 bar
|
||||
Count
|
||||
}
|
||||
|
||||
/// <summary> Maximum Admissible Pressure </summary>
|
||||
public enum MaxAdmissiblePressure
|
||||
{
|
||||
[Description("")] NotSpecified,
|
||||
[Description("MAP6")] MAP6,
|
||||
[Description("MAP10")] MAP10,
|
||||
[Description("MAP16")] MAP16,
|
||||
[Description("MAP25")] MAP25,
|
||||
[Description("MAP40")] MAP40,
|
||||
Count
|
||||
}
|
||||
|
||||
/// <summary> Register reader type </summary>
|
||||
public enum RegisterReaderType
|
||||
{
|
||||
Unknown,
|
||||
Pulses, /// Sick, optical and similar
|
||||
Camera, /// CLP1611
|
||||
DataStream, /// iPerl
|
||||
Manual, /// Entered by human via form (also from camera images)
|
||||
Count
|
||||
}
|
||||
|
||||
/// <summary> Transition step is finished when this condition is fulfilled </summary>
|
||||
public enum StepCondition
|
||||
{
|
||||
None,
|
||||
Scale1Empty,
|
||||
Scale2Empty,
|
||||
Scale3Empty,
|
||||
AllScalesEmpty,
|
||||
Count
|
||||
}
|
||||
|
||||
public enum Publish : sbyte
|
||||
{
|
||||
#if LANG_DE
|
||||
/// german
|
||||
[Description("nie")] Never = 0,
|
||||
[Description("immer")] Always = 1,
|
||||
[Description("Bildschirm")] OnScreen = 2,
|
||||
[Description("intern")] Internal = 3,
|
||||
#elif LANG_CS
|
||||
/// czech
|
||||
[Description("nikdy")] Never = 0,
|
||||
[Description("vždy")] Always = 1,
|
||||
[Description("na obrazovku")] OnScreen = 2,
|
||||
[Description("interně")] Internal = 3,
|
||||
#elif LANG_SK
|
||||
/// slovak
|
||||
[Description("nikdy")] Never = 0,
|
||||
[Description("vždy")] Always = 1,
|
||||
[Description("na obrazovku")] OnScreen = 2,
|
||||
[Description("interne")] Internal = 3,
|
||||
#elif LANG_PL
|
||||
/// polish
|
||||
[Description("nigdy")] Never = 0,
|
||||
[Description("zawsze")] Always = 1,
|
||||
[Description("na ekranie")] OnScreen = 2,
|
||||
[Description("wewnętrznie")] Internal = 3,
|
||||
#elif LANG_RU
|
||||
/// russian
|
||||
[Description("никогда")] Never = 0,
|
||||
[Description("всегда")] Always = 1,
|
||||
[Description("толька экран")] OnScreen = 2,
|
||||
[Description("внутренно")] Internal = 3,
|
||||
#else
|
||||
/// english
|
||||
[Description("Never")] Never = 0,
|
||||
[Description("Always")] Always = 1,
|
||||
[Description("On screen")] OnScreen = 2,
|
||||
[Description("Internal")] Internal = 3,
|
||||
#endif
|
||||
Count
|
||||
}
|
||||
|
||||
public enum MassMethod : byte
|
||||
{
|
||||
#if LANG_DE
|
||||
/// nemecky
|
||||
[Description("Waage")] Scale,
|
||||
[Description("Spanne")] Spread,
|
||||
[Description("Standardabw.")] StdDev,
|
||||
#elif LANG_CS
|
||||
/// cesky
|
||||
[Description("váhou")] Scale,
|
||||
[Description("max.rozdíl")] Spread,
|
||||
[Description("std.dev.")] StdDev,
|
||||
#else
|
||||
[Description("Scale")] Scale,
|
||||
[Description("Spread")] Spread,
|
||||
[Description("Std.dev.")] StdDev,
|
||||
#endif
|
||||
Count
|
||||
}
|
||||
|
||||
public enum TestRedType
|
||||
{
|
||||
Fix,
|
||||
/// etc.
|
||||
Count,
|
||||
}
|
||||
|
||||
public enum FQC1
|
||||
{
|
||||
FQC1,
|
||||
FQP1,
|
||||
Count,
|
||||
}
|
||||
|
||||
public enum Progress
|
||||
{
|
||||
JustStarted,
|
||||
TransitionBefore,
|
||||
SwitchingFlowDetection,
|
||||
FlowSetting,
|
||||
Aborted, /// Use as an argument when a test was aborted
|
||||
Test,
|
||||
TransitionAfter,
|
||||
Completed,
|
||||
Count,
|
||||
}
|
||||
|
||||
public enum Device
|
||||
{
|
||||
Screen,
|
||||
Printer,
|
||||
Disk,
|
||||
}
|
||||
|
||||
public enum PageOrientation
|
||||
{
|
||||
Portrait,
|
||||
Landscape,
|
||||
Count,
|
||||
}
|
||||
|
||||
public enum ItemCategory
|
||||
{
|
||||
#if LANG_DE
|
||||
[Description("Allgemein")] Other,
|
||||
[Description("Prüfstanddaten")] BenchData,
|
||||
[Description("Prüfstandergebnisse")] BenchResult,
|
||||
[Description("Prüfpunktdaten")] TestData,
|
||||
[Description("Prüfpunktergebnisse")] TestResult,
|
||||
[Description("Wasserzelledaten")] MeterData,
|
||||
[Description("Wasserzelleergebnisse")] MeterResult,
|
||||
#else
|
||||
[Description("Other")] Other,
|
||||
[Description("Bench data")] BenchData,
|
||||
[Description("Bench result")] BenchResult,
|
||||
[Description("Test data")] TestData,
|
||||
[Description("Test result")] TestResult,
|
||||
[Description("Meter data")] MeterData,
|
||||
[Description("Meter result")] MeterResult,
|
||||
#endif
|
||||
Count,
|
||||
}
|
||||
|
||||
/// <summary> Possible modes of operation of components and devices. </summary>
|
||||
public enum DebugMode
|
||||
{
|
||||
#if LANG_DE
|
||||
[Description("Erkennen-aus")] DetectedOff = -2,
|
||||
[Description("Erkennen-ein")] DetectedOn = -1,
|
||||
[Description("Normal")] Normal = 0, /// Normal operation
|
||||
[Description("Auto-erkennen")] AutoDetect, /// The component (device) will be auto-detected
|
||||
[Description("Fehler")] FailureDuringOperation, /// Failure during operation -> disabled
|
||||
[Description("Aus")] Off, /// The component is off
|
||||
[Description("Aufzeichnen")] Record,
|
||||
[Description("Reply")] Reply,
|
||||
[Description("Simuliert")] Simulate, /// Test bench simulation, this mode does not require any hardware
|
||||
[Description("Geerbt")] Inherit,
|
||||
#else
|
||||
[Description("Detected off")] DetectedOff = -2,
|
||||
[Description("Detected on")] DetectedOn = -1,
|
||||
[Description("Normal")] Normal = 0, /// Normal operation
|
||||
[Description("Auto detect")] AutoDetect, /// The component (device) will be auto-detected
|
||||
[Description("Run-time error")] FailureDuringOperation, /// Failure during operation -> disabled
|
||||
[Description("Off")] Off, /// The component is off
|
||||
[Description("Record")] Record,
|
||||
[Description("Reply")] Reply,
|
||||
[Description("Simulate")] Simulate, /// Test bench simulation, this mode does not require any hardware
|
||||
[Description("Inherit")] Inherit,
|
||||
#endif
|
||||
Count,
|
||||
}
|
||||
|
||||
public enum LogLevel
|
||||
{
|
||||
#if LANG_DE
|
||||
[Description("Aus")] Off,
|
||||
[Description("Schwerwiegend")] Fatal,
|
||||
[Description("Fehler")] Error,
|
||||
[Description("Warnung")] Warn,
|
||||
[Description("Info")] Info,
|
||||
[Description("Debug")] Debug,
|
||||
[Description("Alles")] All,
|
||||
#else
|
||||
[Description("Off")] Off,
|
||||
[Description("Fatal")] Fatal,
|
||||
[Description("Error")] Error,
|
||||
[Description("Warn")] Warn,
|
||||
[Description("Info")] Info,
|
||||
[Description("Debug")] Debug,
|
||||
[Description("All")] All,
|
||||
#endif
|
||||
Count,
|
||||
}
|
||||
|
||||
|
||||
/// <summary> Arrangement of tests </summary>
|
||||
public enum TestsArrangement
|
||||
{
|
||||
Rows,
|
||||
Columns,
|
||||
}
|
||||
|
||||
/// <summary> Arrangement of meters </summary>
|
||||
public enum MetersArrangement
|
||||
{
|
||||
Vertically,
|
||||
Horizontally,
|
||||
}
|
||||
|
||||
public enum Alignment
|
||||
{
|
||||
#if LANG_DE
|
||||
[Description("links")] Left,
|
||||
[Description("zentriert")] Center,
|
||||
[Description("rechts")] Right,
|
||||
[Description("angepasst")] Justified,
|
||||
#else
|
||||
[Description("Left")] Left,
|
||||
[Description("Center")] Center,
|
||||
[Description("Right")] Right,
|
||||
[Description("Justified")] Justified,
|
||||
#endif
|
||||
Count
|
||||
}
|
||||
|
||||
public enum VertAlignment
|
||||
{
|
||||
[Description("Top")] Top,
|
||||
[Description("Middle")] Middle,
|
||||
[Description("Bottom")] Bottom,
|
||||
}
|
||||
|
||||
public enum TableForm
|
||||
{
|
||||
None,
|
||||
Rows,
|
||||
Columns,
|
||||
ColumnsPL,
|
||||
Count,
|
||||
}
|
||||
|
||||
public enum ImageRotation
|
||||
{
|
||||
[Description("0 deg")] None,
|
||||
[Description("90 deg")] Deg90,
|
||||
[Description("180 deg")] Deg180,
|
||||
[Description("270 deg")] Deg270,
|
||||
Count
|
||||
}
|
||||
|
||||
public enum CameraDisplayResolution
|
||||
{
|
||||
Small,
|
||||
Medium,
|
||||
Large,
|
||||
// FullScreen,
|
||||
Count,
|
||||
}
|
||||
|
||||
public enum ErrorFlagsMode : sbyte
|
||||
{
|
||||
#if LANG_DE
|
||||
[Description("aus")] Off,
|
||||
[Description("info")] Info,
|
||||
[Description("ein")] On,
|
||||
#elif LANG_CS
|
||||
[Description("vypnuto")] Off,
|
||||
[Description("info")] Info,
|
||||
[Description("zapnuto")] On,
|
||||
#elif LANG_RU
|
||||
[Description("выкл")] Off,
|
||||
[Description("инфо")] Info,
|
||||
[Description("вкл")] On,
|
||||
#elif LANG_PL
|
||||
[Description("nie")] Off,
|
||||
[Description("info")] Info,
|
||||
[Description("tak")] On,
|
||||
#else // LANG_EN
|
||||
[Description("off")] Off,
|
||||
[Description("info")] Info,
|
||||
[Description("on")] On,
|
||||
#endif
|
||||
Count
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2017 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class FeedingPath : IHasName, IHasItemNr, IHasValves
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual int ItemNr { get; set; }
|
||||
public virtual string Name { get; set; }
|
||||
public virtual string OriName { get; set; } /// Not mapped to database
|
||||
public virtual float Qfrom { get; set; } /// Water flow in [m3/h]
|
||||
public virtual float Qto { get; set; } /// Water flow in [m3/h]
|
||||
public virtual string Pump { get; set; }
|
||||
public virtual string RegulValvesPct { get; set; } /// Positions of regulation valves in % separated by ';'
|
||||
|
||||
/// Valves
|
||||
public virtual string ValvesOpen { get; set; }
|
||||
public virtual string ValvesClose { get; set; }
|
||||
|
||||
/// ------------- Additional stuff not mapped into the database -------------
|
||||
|
||||
public FeedingPath()
|
||||
{
|
||||
ValvesOpen = string.Empty;
|
||||
ValvesClose = string.Empty;
|
||||
}
|
||||
|
||||
public FeedingPath(string name, int itemNr)
|
||||
: this()
|
||||
{
|
||||
Name = name;
|
||||
ItemNr = itemNr;
|
||||
}
|
||||
|
||||
public virtual FeedingPath Clone(string name, int itemNr)
|
||||
{
|
||||
FeedingPath result = new FeedingPath(name, itemNr);
|
||||
|
||||
result.Qfrom = Qfrom;
|
||||
result.Qto = Qto;
|
||||
result.Pump = Pump;
|
||||
result.RegulValvesPct = RegulValvesPct;
|
||||
result.ValvesOpen = ValvesOpen;
|
||||
result.ValvesClose = ValvesClose;
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2017 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class Group
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual int Gid { get; set; }
|
||||
public virtual string Name { get; set; }
|
||||
|
||||
public Group()
|
||||
{
|
||||
}
|
||||
|
||||
public Group(int gid, string name)
|
||||
{
|
||||
Gid = gid;
|
||||
Name = name;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
///
|
||||
/// Copyright (c) 2016-2017 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class HeatMetersPath : IHasName, IHasItemNr
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual int ItemNr { get; set; }
|
||||
public virtual string Name { get; set; }
|
||||
public virtual string OriName { get; set; } /// Not mapped to database
|
||||
|
||||
public virtual float TempWarmFrom { get; set; } /// Warm temperature range from [°C]
|
||||
public virtual float TempWarmTo { get; set; } /// Warm temperature range to [°C]
|
||||
public virtual float TempColdFrom { get; set; } /// Cold temperature range from [°C]
|
||||
public virtual float TempColdTo { get; set; } /// Cold temperature renge to [°C]
|
||||
|
||||
public virtual string TMeterRefWarm1 { get; set; }
|
||||
public virtual string TMeterRefWarm2 { get; set; }
|
||||
public virtual string TMeterRefCold1 { get; set; }
|
||||
public virtual string TMeterRefCold2 { get; set; }
|
||||
|
||||
public virtual string TMeterWorkWarm1 { get; set; }
|
||||
public virtual string TMeterWorkWarm2 { get; set; }
|
||||
public virtual string TMeterWorkCold1 { get; set; }
|
||||
public virtual string TMeterWorkCold2 { get; set; }
|
||||
|
||||
/// ------------- Additional stuff not mapped into the database -------------
|
||||
|
||||
public HeatMetersPath()
|
||||
{
|
||||
}
|
||||
|
||||
public HeatMetersPath(string name, int itemNr)
|
||||
: this()
|
||||
{
|
||||
Name = name;
|
||||
ItemNr = itemNr;
|
||||
}
|
||||
|
||||
public virtual HeatMetersPath Clone(string name, int itemNr)
|
||||
{
|
||||
HeatMetersPath result = new HeatMetersPath(name, itemNr);
|
||||
|
||||
result.TempWarmFrom = TempWarmFrom;
|
||||
result.TempWarmTo = TempWarmTo;
|
||||
result.TempColdFrom = TempColdFrom;
|
||||
result.TempColdTo = TempColdTo;
|
||||
|
||||
result.TMeterRefWarm1 = TMeterRefWarm1;
|
||||
result.TMeterRefWarm2 = TMeterRefWarm2;
|
||||
result.TMeterRefCold1 = TMeterRefCold1;
|
||||
result.TMeterRefCold2 = TMeterRefCold2;
|
||||
|
||||
result.TMeterWorkWarm1 = TMeterWorkWarm1;
|
||||
result.TMeterWorkWarm2 = TMeterWorkWarm2;
|
||||
result.TMeterWorkCold1 = TMeterWorkCold1;
|
||||
result.TMeterWorkCold2 = TMeterWorkCold2;
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
namespace TBF.Entities
|
||||
namespace Config.Entities
|
||||
{
|
||||
interface IHasItemNr
|
||||
public interface IHasItemNr
|
||||
{
|
||||
int Id { get; }
|
||||
int ItemNr { get; set; }
|
||||
@@ -0,0 +1,11 @@
|
||||
///
|
||||
/// Copyright (c) 2017 Sensus Metering Systems
|
||||
///
|
||||
namespace Config.Entities
|
||||
{
|
||||
public interface IHasName
|
||||
{
|
||||
int Id { get; }
|
||||
string Name { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
namespace TBF.Entities
|
||||
namespace Config.Entities
|
||||
{
|
||||
public interface IHasValves
|
||||
{
|
||||
+10
-3
@@ -1,10 +1,17 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
/// Copyright (c) 2013-2018 Sensus Slovensko a.s.
|
||||
///
|
||||
namespace TBF.BenchControl.Generic
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
public interface IParamsProvider
|
||||
{
|
||||
/// <summary>
|
||||
/// Get XML Serializer
|
||||
/// </summary>
|
||||
XmlSerializer GetSerializer();
|
||||
|
||||
string ComponentName { get; }
|
||||
|
||||
/// <summary>
|
||||
@@ -45,7 +52,7 @@ namespace TBF.BenchControl.Generic
|
||||
/// <param name="strValue">String representation of the parameter</param>
|
||||
void UpdateParam(int ix, string strValue);
|
||||
|
||||
void UpdateDbEntity();
|
||||
void UpdateEmbeddedDbEntity();
|
||||
|
||||
/// <summary>
|
||||
/// Creates an object copy
|
||||
@@ -0,0 +1,22 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2018 Sensus Slovensko a.s.
|
||||
///
|
||||
using System;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class MeasurementCorrection
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual int RangeIx { get; set; } /// 0..5
|
||||
public virtual float Measurement { get; set; }
|
||||
public virtual float Correction { get; set; }
|
||||
|
||||
public MeasurementCorrection() { }
|
||||
|
||||
public MeasurementCorrection(int rangeIx)
|
||||
{
|
||||
RangeIx = rangeIx;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,18 +1,17 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
/// Copyright (c) 2013-2017 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace TBF.Entities
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class MetersPath : IHasItemNr
|
||||
public class MetersPath : IHasName, IHasItemNr
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual int ItemNr { get; set; }
|
||||
public virtual string Name { get; set; }
|
||||
public virtual float Qfrom { get; set; } /// Water flow in [m3/h]
|
||||
public virtual float Qto { get; set; } /// Water flow in [m3/h]
|
||||
public virtual string OriName { get; set; } /// Not mapped to database
|
||||
|
||||
/// Sensors
|
||||
public virtual string Sensor1 { get; set; }
|
||||
@@ -35,7 +34,6 @@ namespace TBF.Entities
|
||||
public virtual string Sensor18 { get; set; }
|
||||
public virtual string Sensor19 { get; set; }
|
||||
public virtual string Sensor20 { get; set; }
|
||||
#if IPERLST
|
||||
public virtual string Sensor21 { get; set; }
|
||||
public virtual string Sensor22 { get; set; }
|
||||
public virtual string Sensor23 { get; set; }
|
||||
@@ -56,7 +54,6 @@ namespace TBF.Entities
|
||||
public virtual string Sensor38 { get; set; }
|
||||
public virtual string Sensor39 { get; set; }
|
||||
public virtual string Sensor40 { get; set; }
|
||||
#endif
|
||||
|
||||
/// ------------- Additional stuff not mapped into the database -------------
|
||||
|
||||
@@ -71,62 +68,9 @@ namespace TBF.Entities
|
||||
ItemNr = itemNr;
|
||||
}
|
||||
|
||||
public MetersPath(BenchControl.MetersPath path)
|
||||
: this(path.Name, path.ItemNr)
|
||||
{
|
||||
Qfrom = path.Qfrom;
|
||||
Qto = path.Qto;
|
||||
Sensor1 = (path.RegisterReaders[0] != null) ? path.RegisterReaders[0].Cfg.Name : null;
|
||||
#pragma warning disable
|
||||
if (Program.WMsCount >= 2) Sensor2 = (path.RegisterReaders[1] != null) ? path.RegisterReaders[1].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 3) Sensor3 = (path.RegisterReaders[2] != null) ? path.RegisterReaders[2].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 4) Sensor4 = (path.RegisterReaders[3] != null) ? path.RegisterReaders[3].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 5) Sensor5 = (path.RegisterReaders[4] != null) ? path.RegisterReaders[4].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 6) Sensor6 = (path.RegisterReaders[5] != null) ? path.RegisterReaders[5].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 7) Sensor7 = (path.RegisterReaders[6] != null) ? path.RegisterReaders[6].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 8) Sensor8 = (path.RegisterReaders[7] != null) ? path.RegisterReaders[7].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 9) Sensor9 = (path.RegisterReaders[8] != null) ? path.RegisterReaders[8].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 10) Sensor10 = (path.RegisterReaders[9] != null) ? path.RegisterReaders[9].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 11) Sensor11 = (path.RegisterReaders[10] != null) ? path.RegisterReaders[10].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 12) Sensor12 = (path.RegisterReaders[11] != null) ? path.RegisterReaders[11].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 13) Sensor13 = (path.RegisterReaders[12] != null) ? path.RegisterReaders[12].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 14) Sensor14 = (path.RegisterReaders[13] != null) ? path.RegisterReaders[13].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 15) Sensor15 = (path.RegisterReaders[14] != null) ? path.RegisterReaders[14].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 16) Sensor16 = (path.RegisterReaders[15] != null) ? path.RegisterReaders[15].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 17) Sensor17 = (path.RegisterReaders[16] != null) ? path.RegisterReaders[16].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 18) Sensor18 = (path.RegisterReaders[17] != null) ? path.RegisterReaders[17].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 19) Sensor19 = (path.RegisterReaders[18] != null) ? path.RegisterReaders[18].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 20) Sensor20 = (path.RegisterReaders[19] != null) ? path.RegisterReaders[19].Cfg.Name : null;
|
||||
#if IPERLST
|
||||
if (Program.WMsCount >= 21) Sensor21 = (path.RegisterReaders[20] != null) ? path.RegisterReaders[20].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 22) Sensor22 = (path.RegisterReaders[21] != null) ? path.RegisterReaders[21].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 23) Sensor23 = (path.RegisterReaders[22] != null) ? path.RegisterReaders[22].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 24) Sensor24 = (path.RegisterReaders[23] != null) ? path.RegisterReaders[23].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 25) Sensor25 = (path.RegisterReaders[24] != null) ? path.RegisterReaders[24].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 26) Sensor26 = (path.RegisterReaders[25] != null) ? path.RegisterReaders[25].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 27) Sensor27 = (path.RegisterReaders[26] != null) ? path.RegisterReaders[26].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 28) Sensor28 = (path.RegisterReaders[27] != null) ? path.RegisterReaders[27].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 29) Sensor29 = (path.RegisterReaders[28] != null) ? path.RegisterReaders[28].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 30) Sensor30 = (path.RegisterReaders[29] != null) ? path.RegisterReaders[29].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 31) Sensor31 = (path.RegisterReaders[30] != null) ? path.RegisterReaders[30].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 32) Sensor32 = (path.RegisterReaders[31] != null) ? path.RegisterReaders[31].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 33) Sensor33 = (path.RegisterReaders[32] != null) ? path.RegisterReaders[32].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 34) Sensor34 = (path.RegisterReaders[33] != null) ? path.RegisterReaders[33].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 35) Sensor35 = (path.RegisterReaders[34] != null) ? path.RegisterReaders[34].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 36) Sensor36 = (path.RegisterReaders[35] != null) ? path.RegisterReaders[35].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 37) Sensor37 = (path.RegisterReaders[36] != null) ? path.RegisterReaders[36].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 38) Sensor38 = (path.RegisterReaders[37] != null) ? path.RegisterReaders[37].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 39) Sensor39 = (path.RegisterReaders[38] != null) ? path.RegisterReaders[38].Cfg.Name : null;
|
||||
if (Program.WMsCount >= 40) Sensor40 = (path.RegisterReaders[39] != null) ? path.RegisterReaders[39].Cfg.Name : null;
|
||||
#endif
|
||||
#pragma warning restore
|
||||
}
|
||||
|
||||
public virtual MetersPath Clone(string name, int itemNr)
|
||||
{
|
||||
MetersPath result = new MetersPath(name, itemNr);
|
||||
result.Qfrom = Qfrom;
|
||||
result.Qto = Qto;
|
||||
result.Sensor1 = Sensor1;
|
||||
result.Sensor2 = Sensor2;
|
||||
result.Sensor3 = Sensor3;
|
||||
@@ -147,7 +91,6 @@ namespace TBF.Entities
|
||||
result.Sensor18 = Sensor18;
|
||||
result.Sensor19 = Sensor19;
|
||||
result.Sensor20 = Sensor20;
|
||||
#if IPERLST
|
||||
result.Sensor21 = Sensor21;
|
||||
result.Sensor22 = Sensor22;
|
||||
result.Sensor23 = Sensor23;
|
||||
@@ -168,7 +111,7 @@ namespace TBF.Entities
|
||||
result.Sensor38 = Sensor38;
|
||||
result.Sensor39 = Sensor39;
|
||||
result.Sensor40 = Sensor40;
|
||||
#endif
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -195,7 +138,6 @@ namespace TBF.Entities
|
||||
else if (i == 17) return Sensor18;
|
||||
else if (i == 18) return Sensor19;
|
||||
else if (i == 19) return Sensor20;
|
||||
#if IPERLST
|
||||
else if (i == 20) return Sensor21;
|
||||
else if (i == 21) return Sensor22;
|
||||
else if (i == 22) return Sensor23;
|
||||
@@ -216,7 +158,6 @@ namespace TBF.Entities
|
||||
else if (i == 37) return Sensor38;
|
||||
else if (i == 38) return Sensor39;
|
||||
else if (i == 39) return Sensor40;
|
||||
#endif
|
||||
else return null;
|
||||
}
|
||||
|
||||
@@ -243,7 +184,6 @@ namespace TBF.Entities
|
||||
else if (i == 17) Sensor18 = cmpntName;
|
||||
else if (i == 18) Sensor19 = cmpntName;
|
||||
else if (i == 19) Sensor20 = cmpntName;
|
||||
#if IPERLST
|
||||
else if (i == 20) Sensor21 = cmpntName;
|
||||
else if (i == 21) Sensor22 = cmpntName;
|
||||
else if (i == 22) Sensor23 = cmpntName;
|
||||
@@ -264,7 +204,6 @@ namespace TBF.Entities
|
||||
else if (i == 37) Sensor38 = cmpntName;
|
||||
else if (i == 38) Sensor39 = cmpntName;
|
||||
else if (i == 39) Sensor40 = cmpntName;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2017 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class OutputPath : IHasName, IHasItemNr, IHasValves
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual int ItemNr { get; set; }
|
||||
public virtual string Name { get; set; }
|
||||
public virtual string OriName { get; set; } /// Not mapped to database
|
||||
public virtual float Qfrom { get; set; } /// Water flow in [m3/h]
|
||||
public virtual float Qto { get; set; } /// Water flow in [m3/h]
|
||||
public virtual string RegulValve { get; set; }
|
||||
public virtual string FlowMeter { get; set; }
|
||||
public virtual float PidCoef { get; set; } /// PID coefficient for the regulation path
|
||||
public virtual string StartValve { get; set; }
|
||||
public virtual string Diverter { get; set; }
|
||||
public virtual string TempDiv { get; set; }
|
||||
public virtual string Scale { get; set; }
|
||||
public virtual string EmptyTankValve { get; set; } /// Not used anywhere
|
||||
|
||||
/// Valves
|
||||
public virtual string ValvesOpen { get; set; }
|
||||
public virtual string ValvesClose { get; set; }
|
||||
|
||||
/// ------------- Additional stuff not mapped into the database -------------
|
||||
|
||||
public OutputPath()
|
||||
{
|
||||
ValvesOpen = string.Empty;
|
||||
ValvesClose = string.Empty;
|
||||
}
|
||||
|
||||
public OutputPath(string name, int itemNr)
|
||||
: this()
|
||||
{
|
||||
Name = name;
|
||||
ItemNr = itemNr;
|
||||
}
|
||||
|
||||
public virtual OutputPath Clone(string name, int itemNr)
|
||||
{
|
||||
OutputPath result = new OutputPath(name, itemNr);
|
||||
|
||||
result.Name = Name;
|
||||
result.Qfrom = Qfrom;
|
||||
result.Qto = Qto;
|
||||
result.RegulValve = RegulValve;
|
||||
result.FlowMeter = FlowMeter;
|
||||
result.PidCoef = PidCoef;
|
||||
result.StartValve = StartValve;
|
||||
result.Diverter = Diverter;
|
||||
result.TempDiv = TempDiv;
|
||||
result.Scale = Scale;
|
||||
result.EmptyTankValve = EmptyTankValve;
|
||||
result.ValvesOpen = ValvesOpen;
|
||||
result.ValvesClose = ValvesClose;
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,242 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2017 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
/// <summary>
|
||||
/// Stores one test procedure, supports revisions and history log
|
||||
/// </summary>
|
||||
public class Procedure : IHasName, IHasItemNr
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual int ItemNr { get; set; }
|
||||
public virtual string Name { get; set; }
|
||||
|
||||
public virtual string Description { get; set; } /// Short description
|
||||
public virtual string CreationUser { get; set; } /// Name of the user who has created or changed this procedure
|
||||
public virtual DateTime CreationTime { get; set; } /// Date and time of the creation or change
|
||||
public virtual string LastChgUser { get; set; } /// Name of the user who has created or changed this procedure
|
||||
public virtual DateTime LastChgTime { get; set; } /// Date and time of the creation or change
|
||||
public virtual string LongDescription { get; set; } /// Long description (notes)
|
||||
|
||||
public virtual ProcedureState ProcedureState { get; set; }
|
||||
public virtual int Revision { get; set; }
|
||||
public virtual int PredecessorId { get; set; }
|
||||
public virtual bool ObtainedByCopy { get; set; } /// Initial version of this procedure was a copy of another procedure
|
||||
///
|
||||
public virtual MetersKind MetersKind { get; set; } /// single / compound / heat meters
|
||||
public virtual string Watermeters { get; set; } /// Water meter name or Id
|
||||
public virtual bool Protected { get; set; } /// true = procedure cannot be changed by a testing specialist
|
||||
public virtual bool MustBeComplete { get; set; } /// true = procedure can be finished just when all tests were finished
|
||||
public virtual bool ManualCtrlDisabled { get; set; } /// true = manual control of valves, etc. is disabled
|
||||
|
||||
public virtual string DataEntry { get; set; } /// Component to use for data entry
|
||||
public virtual string ResultsPrinter { get; set; } /// Component to use for printing the results
|
||||
public virtual string ResultsWriter { get; set; } /// Component to use for saving the results into the file
|
||||
public virtual string TransitionStart { get; set; }
|
||||
public virtual string TransitionEnd { get; set; }
|
||||
|
||||
public virtual string AltProcName { get; set; } /// Alternative procedure name (null or string.Empty = no alt. procedure)
|
||||
public virtual int AltProcPeriod { get; set; } /// Period of alternative procedures (0 = no alt. procedure)
|
||||
|
||||
public virtual IList<ComponentProcedure> MoreParams { get; set; }
|
||||
public virtual IList<Test> Tests { get; set; }
|
||||
|
||||
/// ------------- Additional stuff not mapped into the database -------------
|
||||
|
||||
public Procedure()
|
||||
{
|
||||
MoreParams = new List<ComponentProcedure>();
|
||||
Tests = new List<Test>();
|
||||
|
||||
///
|
||||
/// Default values
|
||||
///
|
||||
CreationUser = (Users.GlobalData.CurrentUser != null) ? Users.GlobalData.CurrentUser.UserName : null;
|
||||
CreationTime = DateTime.Now;
|
||||
LastChgUser = CreationUser;
|
||||
LastChgTime = CreationTime;
|
||||
MetersKind = Entities.MetersKind.Single;
|
||||
Watermeters = string.Empty;
|
||||
Description = string.Empty;
|
||||
LongDescription = string.Empty;
|
||||
}
|
||||
|
||||
public Procedure(string name, int itemNr)
|
||||
: this()
|
||||
{
|
||||
Name = name;
|
||||
ItemNr = itemNr;
|
||||
}
|
||||
|
||||
public virtual Procedure Clone()
|
||||
{
|
||||
Procedure result = new Procedure();
|
||||
|
||||
result.ItemNr = ItemNr;
|
||||
result.Name = Name;
|
||||
result.Description = Description;
|
||||
result.CreationUser = CreationUser;
|
||||
result.CreationTime = CreationTime;
|
||||
result.LastChgUser = LastChgUser;
|
||||
result.LastChgTime = LastChgTime;
|
||||
result.LongDescription = LongDescription;
|
||||
|
||||
result.ProcedureState = ProcedureState;
|
||||
result.Revision = Revision;
|
||||
result.PredecessorId = Id;
|
||||
result.ObtainedByCopy = ObtainedByCopy;
|
||||
|
||||
result.MetersKind = MetersKind;
|
||||
result.Watermeters = Watermeters;
|
||||
result.Protected = Protected;
|
||||
result.MustBeComplete = MustBeComplete;
|
||||
result.ManualCtrlDisabled = ManualCtrlDisabled;
|
||||
result.DataEntry = DataEntry;
|
||||
result.ResultsPrinter = ResultsPrinter;
|
||||
result.ResultsWriter = ResultsWriter;
|
||||
result.TransitionStart = TransitionStart;
|
||||
result.TransitionEnd = TransitionEnd;
|
||||
|
||||
foreach (var prms in MoreParams) { result.MoreParams.Add(prms.Clone(result)); }
|
||||
foreach (var test in Tests) { result.Tests.Add(test.Clone()); }
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public virtual void Export(StreamWriter output)
|
||||
{
|
||||
output.WriteLine(ItemNr.ToString(CultureInfo.InvariantCulture));
|
||||
output.WriteLine(Name);
|
||||
output.WriteLine(Description);
|
||||
output.WriteLine(CreationUser);
|
||||
output.WriteLine(CreationTime.ToString(CultureInfo.InvariantCulture));
|
||||
output.WriteLine(LastChgUser);
|
||||
output.WriteLine(LastChgTime.ToString(CultureInfo.InvariantCulture));
|
||||
output.WriteLine(MetersKind.ToString());
|
||||
output.WriteLine(Watermeters);
|
||||
output.WriteLine(Protected.ToString());
|
||||
output.WriteLine(MustBeComplete.ToString());
|
||||
output.WriteLine(ManualCtrlDisabled.ToString());
|
||||
output.WriteLine(DataEntry);
|
||||
output.WriteLine(ResultsPrinter);
|
||||
output.WriteLine(ResultsWriter);
|
||||
output.WriteLine(TransitionStart);
|
||||
output.WriteLine(TransitionEnd);
|
||||
|
||||
foreach (var prms in MoreParams) { prms.Export(output); }
|
||||
output.WriteLine();
|
||||
|
||||
foreach (var test in Tests) { test.Export(output); }
|
||||
output.WriteLine();
|
||||
|
||||
output.Close();
|
||||
}
|
||||
|
||||
public static Procedure Import(StreamReader input)
|
||||
{
|
||||
Procedure result = new Procedure();
|
||||
|
||||
result.ItemNr = int.Parse(input.ReadLine(), CultureInfo.InvariantCulture);
|
||||
result.Name = input.ReadLine();
|
||||
result.Description = input.ReadLine();
|
||||
result.CreationUser = input.ReadLine();
|
||||
result.CreationTime = DateTime.Parse(input.ReadLine(), CultureInfo.InvariantCulture);
|
||||
result.LastChgUser = input.ReadLine();
|
||||
result.LastChgTime = DateTime.Parse(input.ReadLine(), CultureInfo.InvariantCulture);
|
||||
string line = input.ReadLine();
|
||||
result.MetersKind = line.Equals(MetersKind.Single.ToString()) ? MetersKind.Single : (line.Equals(MetersKind.Combined.ToString()) ? MetersKind.Combined : MetersKind.HeatMeter);
|
||||
result.Watermeters = input.ReadLine();
|
||||
result.Protected = bool.Parse(input.ReadLine());
|
||||
result.MustBeComplete = bool.Parse(input.ReadLine());
|
||||
result.ManualCtrlDisabled = bool.Parse(input.ReadLine());
|
||||
result.DataEntry = input.ReadLine();
|
||||
result.ResultsPrinter = input.ReadLine();
|
||||
result.ResultsWriter = input.ReadLine();
|
||||
result.TransitionStart = input.ReadLine();
|
||||
result.TransitionEnd = input.ReadLine();
|
||||
|
||||
while(true)
|
||||
{
|
||||
ComponentProcedure prms = ComponentProcedure.Import(input, result);
|
||||
if (prms == null)
|
||||
break;
|
||||
else
|
||||
result.MoreParams.Add(prms);
|
||||
}
|
||||
|
||||
while (true)
|
||||
{
|
||||
Test tst = Test.Import(input, result);
|
||||
if (tst == null)
|
||||
break;
|
||||
else
|
||||
result.Tests.Add(tst);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public virtual string Compare(StreamReader inp)
|
||||
{
|
||||
System.Text.StringBuilder diff = new System.Text.StringBuilder();
|
||||
const string fmt = "{0} = {1}\r\n (in the file {2})\r\n";
|
||||
string ln;
|
||||
|
||||
ln = inp.ReadLine(); /// skip ItemNr
|
||||
ln = inp.ReadLine(); if (ln != Name) { diff.AppendFormat(fmt, "Name", Name, ln); };
|
||||
ln = inp.ReadLine(); if (ln != Description) { diff.AppendFormat(fmt, "Description", Description, ln); };
|
||||
ln = inp.ReadLine(); /// skip CreationUser
|
||||
ln = inp.ReadLine(); /// skip CreationTime
|
||||
ln = inp.ReadLine(); /// skip LastChgUser
|
||||
ln = inp.ReadLine(); /// skip LastChgTime
|
||||
ln = inp.ReadLine(); if (ln != MetersKind.ToString()) { diff.AppendFormat(fmt, "MetersKind", MetersKind, ln); };
|
||||
ln = inp.ReadLine(); if (ln != Watermeters) { diff.AppendFormat(fmt, "Watermeters", Watermeters, ln); };
|
||||
|
||||
ln = inp.ReadLine(); if (ln != Protected.ToString()) { diff.AppendFormat(fmt, "Protected", Protected, ln); };
|
||||
ln = inp.ReadLine(); if (ln != MustBeComplete.ToString()) { diff.AppendFormat(fmt, "MustBeComplete", MustBeComplete, ln); };
|
||||
ln = inp.ReadLine(); if (ln != ManualCtrlDisabled.ToString()) { diff.AppendFormat(fmt, "ManualCtrlDisabled", ManualCtrlDisabled, ln); };
|
||||
ln = inp.ReadLine(); if (ln != DataEntry) { diff.AppendFormat(fmt, "DataEntry", DataEntry, ln); };
|
||||
ln = inp.ReadLine(); if (ln != ResultsPrinter) { diff.AppendFormat(fmt, "ResultsPrinter", ResultsPrinter, ln); };
|
||||
ln = inp.ReadLine(); if (ln != ResultsWriter) { diff.AppendFormat(fmt, "ResultsWriter", ResultsWriter, ln); };
|
||||
ln = inp.ReadLine(); if (ln != TransitionStart) { diff.AppendFormat(fmt, "TransitionStart", TransitionStart, ln); };
|
||||
ln = inp.ReadLine(); if (ln != TransitionEnd) { diff.AppendFormat(fmt, "TransitionEnd", TransitionEnd, ln); };
|
||||
|
||||
/// TODO Compare componentprocedure-s
|
||||
while (ComponentProcedure.Import(inp, null) != null)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//foreach (var test in Tests)
|
||||
//{
|
||||
// string testDiff = test.Compare(inp);
|
||||
// if (testDiff.Contains(
|
||||
//}
|
||||
|
||||
//bool extraTestsInFile = true;
|
||||
//while (Test.Import(inp, null) != null) { extraTestsInFile = true; }
|
||||
|
||||
return diff.ToString();
|
||||
}
|
||||
|
||||
public virtual ComponentProcedure GetProcedureParamsEntity(string cmpntName)
|
||||
{
|
||||
foreach (var procPrms in MoreParams)
|
||||
{
|
||||
if (procPrms.CmpntName == cmpntName) return procPrms;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return string.Format("{0}, rev.{1}", Name, Revision);
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace TBF.Entities
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class ProcedureHistory
|
||||
{
|
||||
@@ -0,0 +1,369 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2017 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
/// <summary>
|
||||
/// Test, consisting of one or more repetitions of the test 'SingleTest'.
|
||||
/// </summary>
|
||||
public class Test : IHasName, IHasItemNr
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual int ItemNr { 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 sbyte Publish { get; set; } /// 0=no, 1=in all protocols, 2=on screen, 3=internal
|
||||
public virtual bool DoEvaluate { get; set; }
|
||||
public virtual float Qfrom { get; set; } /// Water flow low limit in [m3/h]
|
||||
public virtual float Qto { get; set; } /// Water flow high limit in [m3/h]
|
||||
public virtual float Volume { get; set; } /// Test volume (target) in [l]
|
||||
public virtual float TstTime { get; set; } /// Test time (estimate) in [s]
|
||||
public virtual string Method { get; set; }
|
||||
public virtual float ErrLimLo { get; set; } /// in [%] (usually < 0) or 1=class1, 2=class2, 3=class3
|
||||
public virtual float ErrLimHi { get; set; } /// in [%] (usually > 0) or -Qn in m3/h
|
||||
public virtual float Uncertainty { get; set; } /// int [%] makes error limits tighter: 0 <= Uncertainty <= abs(ErrLimXx)
|
||||
public virtual int Repeats { get; set; }
|
||||
public virtual bool DoDraining { get; set; }
|
||||
public virtual bool DoZeroing { get; set; }
|
||||
public virtual bool DoControlWaterTemp { get; set; }
|
||||
public virtual float TempLimLo { get; set; } /// Lower limit for the controlled temperature
|
||||
public virtual float TempLimHi { get; set; } /// Upper limit for the controlled temperature
|
||||
public virtual float PumpPower { get; set; } /// Power of the pump in [%] in the range 0 .. 100.0f, use values 0% and 100% for non-FM pumps
|
||||
public virtual int MassRepeats { get; set; } /// Number of mass. measurements at the beginning/end of test, 0 = default (=5)
|
||||
public virtual float MassSpread { get; set; } /// Max spread of mass. measurements at the beginning/end of test, 0 = default
|
||||
public virtual MassMethod MassMethod { get; set; } /// method of mass. measurement at the beginning/end of test: false=slow (precise), true=using immediate mass measurement and evaluation
|
||||
public virtual int TimeBeforeFlow { get; set; } /// Delay time before the start of flow control 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 TimeStop2Mass { get; set; } /// Delay time from the test end (diverted) to the 2nd mass measuremen in [s]
|
||||
public virtual double TolerRed { get; set; } /// = Filter
|
||||
public virtual TestRedType RedType { get; set; }
|
||||
public virtual string FeedingPath { get; set; }
|
||||
public virtual string BenchPath { get; set; }
|
||||
public virtual string OutputPath { get; set; }
|
||||
public virtual string MetersPath { get; set; }
|
||||
#if HEAT_METERS
|
||||
public virtual string HeatMetersPath { get; set; }
|
||||
#endif
|
||||
public virtual string RelTransBefore { get; set; }
|
||||
public virtual string RelTransBetween { get; set; }
|
||||
public virtual string RelTransAfter { get; set; }
|
||||
public virtual string TransitionAfter { get; set; }
|
||||
|
||||
public virtual IList<ComponentTest> MoreParams { get; set; }
|
||||
|
||||
public virtual Procedure Procedure { get; set; }
|
||||
|
||||
/// ------------- Additional stuff not mapped into the database -------------
|
||||
|
||||
public Test()
|
||||
{
|
||||
MoreParams = new List<ComponentTest>();
|
||||
|
||||
///
|
||||
/// Default values
|
||||
///
|
||||
Publish = (sbyte)Config.Entities.Publish.Always;
|
||||
DoEvaluate = true;
|
||||
Repeats = 1;
|
||||
DoDraining = false;
|
||||
DoZeroing = false;
|
||||
DoControlWaterTemp = false;
|
||||
TempLimLo = 15.0f;
|
||||
TempLimHi = 25.0f;
|
||||
ErrLimLo = -2.0f; /// [%] lower error limit
|
||||
ErrLimHi = 2.0f; /// [%] upper error limit
|
||||
Uncertainty = 0;
|
||||
PumpPower = 60.0f; /// [%]
|
||||
MassRepeats = 0; /// default
|
||||
MassSpread = 0; /// default
|
||||
MassMethod = MassMethod.Scale; /// default
|
||||
TimeBeforeFlow = 10; /// [s] time before the start of flow control in [s]
|
||||
TimeFlow2Mass = 5; /// [s] time from the flow stable to the 1st mass measurement in [s]
|
||||
TimePump2StartV = 1; /// [s] time from the 1st mass measurement to the test start in [s]
|
||||
TimeStop2Mass = 5; /// [s] between the test end and the final mass measurement
|
||||
TolerRed = 0; /// = Filter parameter
|
||||
RelTransBefore = string.Empty;
|
||||
RelTransBetween = string.Empty;
|
||||
RelTransAfter = string.Empty;
|
||||
TransitionAfter = string.Empty;
|
||||
}
|
||||
|
||||
public Test(string name, int itemNr, Procedure procedure)
|
||||
: this()
|
||||
{
|
||||
Name = name;
|
||||
ItemNr = itemNr;
|
||||
Procedure = procedure;
|
||||
}
|
||||
|
||||
// Makes a new copy of this object (not just a reference)
|
||||
public virtual Test Clone()
|
||||
{
|
||||
Test result = new Test(Name, ItemNr, Procedure);
|
||||
|
||||
result.Part = Part;
|
||||
result.Publish = Publish;
|
||||
result.DoEvaluate = DoEvaluate;
|
||||
result.Qfrom = Qfrom;
|
||||
result.Qto = Qto;
|
||||
result.Volume = Volume;
|
||||
result.TstTime = TstTime;
|
||||
result.Method = Method;
|
||||
result.ErrLimLo = ErrLimLo;
|
||||
result.ErrLimHi = ErrLimHi;
|
||||
result.Uncertainty = Uncertainty;
|
||||
result.Repeats = Repeats;
|
||||
result.DoDraining = DoDraining;
|
||||
result.DoZeroing = DoZeroing;
|
||||
result.DoControlWaterTemp = DoControlWaterTemp;
|
||||
result.TempLimLo = TempLimLo;
|
||||
result.TempLimHi = TempLimHi;
|
||||
result.PumpPower = PumpPower;
|
||||
result.MassRepeats = MassRepeats;
|
||||
result.MassSpread = MassSpread;
|
||||
result.MassMethod = MassMethod;
|
||||
result.TimeBeforeFlow = TimeBeforeFlow;
|
||||
result.TimeFlow2Mass = TimeFlow2Mass;
|
||||
result.TimePump2StartV = TimePump2StartV;
|
||||
result.TimeStop2Mass = TimeStop2Mass;
|
||||
result.TolerRed = TolerRed;
|
||||
result.RedType = RedType;
|
||||
result.FeedingPath = FeedingPath;
|
||||
result.BenchPath = BenchPath;
|
||||
result.OutputPath = OutputPath;
|
||||
result.MetersPath = MetersPath;
|
||||
#if HEAT_METERS
|
||||
result.HeatMetersPath = HeatMetersPath;
|
||||
#endif
|
||||
result.RelTransBefore = RelTransBefore;
|
||||
result.RelTransBetween = RelTransBetween;
|
||||
result.RelTransAfter = RelTransAfter;
|
||||
result.TransitionAfter = TransitionAfter;
|
||||
foreach (var prms in MoreParams) { result.MoreParams.Add(prms.Clone()); }
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public virtual void Export(StreamWriter output)
|
||||
{
|
||||
CultureInfo ci = CultureInfo.InvariantCulture;
|
||||
|
||||
output.WriteLine(Name);
|
||||
output.WriteLine(Part.ToString(ci));
|
||||
output.WriteLine(Publish.ToString(ci));
|
||||
output.WriteLine(DoEvaluate.ToString());
|
||||
output.WriteLine(Qfrom.ToString(ci));
|
||||
output.WriteLine(Qto.ToString(ci));
|
||||
output.WriteLine(Volume.ToString(ci));
|
||||
output.WriteLine(TstTime.ToString(ci));
|
||||
output.WriteLine(Method);
|
||||
output.WriteLine(ErrLimLo.ToString(ci));
|
||||
output.WriteLine(ErrLimHi.ToString(ci));
|
||||
output.WriteLine(Uncertainty.ToString(ci));
|
||||
output.WriteLine(Repeats.ToString(ci));
|
||||
output.WriteLine(DoDraining.ToString());
|
||||
output.WriteLine(DoZeroing.ToString());
|
||||
output.WriteLine(DoControlWaterTemp.ToString());
|
||||
output.WriteLine(TempLimLo.ToString(ci));
|
||||
output.WriteLine(TempLimHi.ToString(ci));
|
||||
output.WriteLine(PumpPower.ToString(ci));
|
||||
output.WriteLine(MassRepeats.ToString(ci));
|
||||
output.WriteLine(MassSpread.ToString(ci));
|
||||
output.WriteLine(((byte)MassMethod).ToString(ci));
|
||||
output.WriteLine(TimeBeforeFlow.ToString(ci));
|
||||
output.WriteLine(TimeFlow2Mass.ToString(ci));
|
||||
output.WriteLine(TimePump2StartV.ToString(ci));
|
||||
output.WriteLine(TimeStop2Mass.ToString(ci));
|
||||
output.WriteLine(FeedingPath);
|
||||
output.WriteLine(BenchPath);
|
||||
output.WriteLine(OutputPath);
|
||||
output.WriteLine(MetersPath);
|
||||
output.WriteLine(RelTransBefore);
|
||||
output.WriteLine(RelTransBetween);
|
||||
output.WriteLine(RelTransAfter);
|
||||
output.WriteLine(TransitionAfter);
|
||||
|
||||
foreach (var prms in MoreParams) { prms.Export(output); }
|
||||
output.WriteLine();
|
||||
}
|
||||
|
||||
public static Test Import(StreamReader input, Procedure newProcedure)
|
||||
{
|
||||
string firstLine = input.ReadLine();
|
||||
if (string.IsNullOrEmpty(firstLine))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
CultureInfo ci = CultureInfo.InvariantCulture;
|
||||
Test tst = new Test();
|
||||
|
||||
tst.Name = firstLine;
|
||||
tst.Part = int.Parse(input.ReadLine(), ci);
|
||||
tst.Publish = sbyte.Parse(input.ReadLine(), ci);
|
||||
tst.DoEvaluate = bool.Parse(input.ReadLine());
|
||||
tst.Qfrom = float.Parse(input.ReadLine(), ci);
|
||||
tst.Qto = float.Parse(input.ReadLine(), ci);
|
||||
tst.Volume = float.Parse(input.ReadLine(), ci);
|
||||
tst.TstTime = float.Parse(input.ReadLine(), ci);
|
||||
tst.Method = input.ReadLine();
|
||||
tst.ErrLimLo = float.Parse(input.ReadLine(), ci);
|
||||
tst.ErrLimHi = float.Parse(input.ReadLine(), ci);
|
||||
tst.Uncertainty = float.Parse(input.ReadLine(), ci);
|
||||
tst.Repeats = int.Parse(input.ReadLine(), ci);
|
||||
tst.DoDraining = bool.Parse(input.ReadLine());
|
||||
tst.DoZeroing = bool.Parse(input.ReadLine());
|
||||
tst.DoControlWaterTemp = bool.Parse(input.ReadLine());
|
||||
tst.TempLimLo = float.Parse(input.ReadLine(), ci);
|
||||
tst.TempLimHi = float.Parse(input.ReadLine(), ci);
|
||||
tst.PumpPower = float.Parse(input.ReadLine(), ci);
|
||||
tst.MassRepeats = int.Parse(input.ReadLine(), ci);
|
||||
tst.MassSpread = float.Parse(input.ReadLine(), ci);
|
||||
tst.MassMethod = (MassMethod)byte.Parse(input.ReadLine(), ci);
|
||||
tst.TimeBeforeFlow = int.Parse(input.ReadLine(), ci);
|
||||
tst.TimeFlow2Mass = int.Parse(input.ReadLine(), ci);
|
||||
tst.TimePump2StartV = int.Parse(input.ReadLine(), ci);
|
||||
tst.TimeStop2Mass = int.Parse(input.ReadLine(), ci);
|
||||
tst.FeedingPath = input.ReadLine();
|
||||
tst.BenchPath = input.ReadLine();
|
||||
tst.OutputPath = input.ReadLine();
|
||||
tst.MetersPath = input.ReadLine();
|
||||
tst.RelTransBefore = input.ReadLine();
|
||||
tst.RelTransBetween = input.ReadLine();
|
||||
tst.RelTransAfter = input.ReadLine();
|
||||
tst.TransitionAfter = input.ReadLine();
|
||||
|
||||
while (true)
|
||||
{
|
||||
ComponentTest prms = ComponentTest.Import(input, tst);
|
||||
if (prms == null)
|
||||
break;
|
||||
else
|
||||
tst.MoreParams.Add(prms);
|
||||
}
|
||||
|
||||
tst.Procedure = newProcedure;
|
||||
return tst;
|
||||
}
|
||||
|
||||
public virtual string Compare(StreamReader inp)
|
||||
{
|
||||
System.Text.StringBuilder diff = new System.Text.StringBuilder();
|
||||
string fmt = string.Format("Test {0} : ", Name) + "{0} = {1}\r\n (in the file {2})\r\n";
|
||||
string ln;
|
||||
CultureInfo ci = CultureInfo.InvariantCulture;
|
||||
|
||||
string firstLine = inp.ReadLine();
|
||||
if (string.IsNullOrEmpty(firstLine)) return string.Format("Test {0} is missing in the file\r\n", Name);
|
||||
|
||||
if (Name != firstLine) { diff.AppendFormat(fmt, "Name", Name, firstLine); };
|
||||
ln = inp.ReadLine(); if (ln != Part.ToString(ci)) { diff.AppendFormat(fmt, "Part", Part.ToString(ci), ln); };
|
||||
ln = inp.ReadLine(); if (ln != Publish.ToString(ci)) { diff.AppendFormat(fmt, "Publish", Publish.ToString(ci), ln); };
|
||||
ln = inp.ReadLine(); if (ln != DoEvaluate.ToString(ci)) { diff.AppendFormat(fmt, "Evaluate", DoEvaluate.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 != Volume.ToString(ci)) { diff.AppendFormat(fmt, "Volume", Volume.ToString(ci), ln); };
|
||||
ln = inp.ReadLine(); if (ln != TstTime.ToString(ci)) { diff.AppendFormat(fmt, "TstTime", TstTime.ToString(ci), ln); };
|
||||
ln = inp.ReadLine(); if (ln != Method) { diff.AppendFormat(fmt, "Method", Method, ln); };
|
||||
ln = inp.ReadLine(); if (ln != ErrLimLo.ToString(ci)) { diff.AppendFormat(fmt, "ErrLimLo", ErrLimLo.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 != 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 != DoZeroing.ToString(ci)) { diff.AppendFormat(fmt, "Zeroing", DoZeroing.ToString(ci), ln); };
|
||||
ln = inp.ReadLine(); if (ln != DoControlWaterTemp.ToString()) { diff.AppendFormat(fmt, "DoControlWaterTemp", DoControlWaterTemp.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 != PumpPower.ToString(ci)) { diff.AppendFormat(fmt, "PumpPower", PumpPower.ToString(ci), ln); };
|
||||
ln = inp.ReadLine(); if (ln != MassRepeats.ToString(ci)) { diff.AppendFormat(fmt, "MassRepeats", MassRepeats.ToString(ci), ln); };
|
||||
ln = inp.ReadLine(); if (ln != MassSpread.ToString(ci)) { diff.AppendFormat(fmt, "MassSpread", MassSpread.ToString(ci), ln); };
|
||||
ln = inp.ReadLine(); if (ln != ((byte)MassMethod).ToString(ci)) { diff.AppendFormat(fmt, "MassMethod", ((byte)MassMethod).ToString(ci), ln); };
|
||||
ln = inp.ReadLine(); if (ln != TimeBeforeFlow.ToString(ci)) { diff.AppendFormat(fmt, "TimeBeforeFlow", TimeBeforeFlow.ToString(ci), ln); };
|
||||
ln = inp.ReadLine(); if (ln != TimeFlow2Mass.ToString(ci)) { diff.AppendFormat(fmt, "TimeFlow2Mass", TimeFlow2Mass.ToString(ci), ln); };
|
||||
ln = inp.ReadLine(); if (ln != TimePump2StartV.ToString(ci)) { diff.AppendFormat(fmt, "TimePump2StartV", TimePump2StartV.ToString(ci), ln); };
|
||||
ln = inp.ReadLine(); if (ln != TimeStop2Mass.ToString(ci)) { diff.AppendFormat(fmt, "TimeStop2Mass", TimeStop2Mass.ToString(ci), ln); };
|
||||
ln = inp.ReadLine(); if (ln != FeedingPath) { diff.AppendFormat(fmt, "FeedingPath", FeedingPath, 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 != MetersPath) { diff.AppendFormat(fmt, "MetersPath", MetersPath, ln); };
|
||||
ln = inp.ReadLine(); if (ln != RelTransBefore) { diff.AppendFormat(fmt, "RelTransBefore", RelTransBefore, ln); };
|
||||
ln = inp.ReadLine(); if (ln != RelTransBetween) { diff.AppendFormat(fmt, "RelTransBetween", RelTransBetween, ln); };
|
||||
ln = inp.ReadLine(); if (ln != RelTransAfter) { diff.AppendFormat(fmt, "RelTransAfter", RelTransAfter, ln); };
|
||||
ln = inp.ReadLine(); if (ln != TransitionAfter) { diff.AppendFormat(fmt, "TransitionAfter", TransitionAfter, ln); };
|
||||
|
||||
return diff.ToString();
|
||||
}
|
||||
|
||||
public virtual ComponentTest GetTestParamsEntity(string cmpntName)
|
||||
{
|
||||
foreach (var tstPrms in MoreParams)
|
||||
{
|
||||
if (tstPrms.CmpntName == cmpntName) return tstPrms;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public virtual float GetErrLimLo(float flow)
|
||||
{
|
||||
if (ErrLimLo <= ErrLimHi)
|
||||
{
|
||||
return ErrLimLo; /// Error limit of a water meter
|
||||
}
|
||||
else
|
||||
{
|
||||
/// Metrological class and nominal flow of a heat meter
|
||||
int metrClass = (int)Math.Round(ErrLimLo);
|
||||
float Qp = Math.Abs(ErrLimHi);
|
||||
float Q = Math.Max(flow, 0.00001f); /// to avoid division by zero
|
||||
|
||||
/// Calculate the error limit of a heat meter
|
||||
switch (metrClass)
|
||||
{
|
||||
default:
|
||||
case 1: return -Math.Min(3.5f, 1.0f + 0.01f * Qp / Q);
|
||||
case 2: return -Math.Min(5.0f, 2.0f + 0.02f * Qp / Q);
|
||||
case 3: return -Math.Min(5.0f, 3.0f + 0.05f * Qp / Q);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public virtual float GetErrLimHi(float flow)
|
||||
{
|
||||
if (ErrLimLo <= ErrLimHi)
|
||||
{
|
||||
return ErrLimHi; /// Error limit of a water meter
|
||||
}
|
||||
else
|
||||
{
|
||||
/// Metrological class and nominal flow of a heat meter
|
||||
int metrClass = (int)Math.Round(ErrLimLo);
|
||||
float Qp = Math.Abs(ErrLimHi);
|
||||
float Q = Math.Max(flow, 0.00001f); /// to avoid division by zero
|
||||
|
||||
/// Calculate the error limit of a heat meter
|
||||
switch (metrClass)
|
||||
{
|
||||
default:
|
||||
case 1: return +Math.Min(3.5f, 1.0f + 0.01f * Qp / Q);
|
||||
case 2: return +Math.Min(5.0f, 2.0f + 0.02f * Qp / Q);
|
||||
case 3: return +Math.Min(5.0f, 3.0f + 0.05f * Qp / Q);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
string partStr = (Part > 0) ? string.Format(", part {0}", Part) : string.Empty;
|
||||
|
||||
return string.Format("{0}(P.{1},{2}){3}", Name, ((Publish)Publish).ToString(), DoEvaluate ? "E" : "-", partStr);
|
||||
}
|
||||
}
|
||||
}
|
||||
+4
-3
@@ -3,17 +3,18 @@
|
||||
///
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace TBF.Entities
|
||||
namespace Config.Entities
|
||||
{
|
||||
/// <summary>
|
||||
/// Stores one transition sequence containing a list of transition steps
|
||||
/// </summary>
|
||||
public class TransitionSequence : IHasItemNr
|
||||
public class TransitionSequence : IHasName, IHasItemNr
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual int ItemNr { get; set; }
|
||||
public virtual string Name { get; set; }
|
||||
public virtual string Description { get; set; } /// Short description
|
||||
public virtual string OriName { get; set; } /// Not mapped to database
|
||||
public virtual string Description { get; set; } /// Short description
|
||||
public virtual IList<TransitionStep> TransitionSteps { get; set; }
|
||||
|
||||
public TransitionSequence()
|
||||
@@ -1,10 +1,10 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
/// Copyright (c) 2013-2015, 2017 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace TBF.Entities
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class TransitionStep : IHasItemNr, IHasValves
|
||||
{
|
||||
@@ -12,8 +12,7 @@ namespace TBF.Entities
|
||||
public virtual int ItemNr { get; set; } /// Order of the preparation step
|
||||
public virtual int Duration { get; set; } /// Duration in seconds
|
||||
public virtual string Message { get; set; } /// Message
|
||||
public virtual StepCondition EndCondition { get; set; } /// Condition when transition step is finished (next to the duration)
|
||||
public virtual string Communication { get; set; } /// String specifying type of communication with water meters
|
||||
public virtual string EndCondition { get; set; } /// Condition when transition step is finished (next to the duration)
|
||||
public virtual string ValvesOpen { get; set; } /// List of valves to be opened
|
||||
public virtual string ValvesClose { get; set; } /// List of valves to be closed
|
||||
public virtual string RegulValvesPct { get; set; } /// Positions of regulation valves in % separated by ';'
|
||||
@@ -25,8 +24,8 @@ namespace TBF.Entities
|
||||
|
||||
public TransitionStep()
|
||||
{
|
||||
Duration = 5; /// sec.
|
||||
EndCondition = (int)StepCondition.None;
|
||||
Duration = 5; /// sec.
|
||||
EndCondition = "None";
|
||||
}
|
||||
|
||||
public TransitionStep(int itemNr, TransitionSequence sequence)
|
||||
@@ -42,7 +41,6 @@ namespace TBF.Entities
|
||||
result.Duration = Duration;
|
||||
result.Message = Message;
|
||||
result.EndCondition = EndCondition;
|
||||
result.Communication = Communication;
|
||||
result.ValvesOpen = ValvesOpen;
|
||||
result.ValvesClose = ValvesClose;
|
||||
result.RegulValvesPct = RegulValvesPct;
|
||||
@@ -56,12 +54,11 @@ namespace TBF.Entities
|
||||
result += indent + "ItemNr = " + ItemNr.ToString() + ", ";
|
||||
result += indent + "Duration = " + Duration.ToString() + ", ";
|
||||
result += indent + "Message = " + Message + ", ";
|
||||
result += indent + "EndCondition = " + EndCondition.ToString() + ", ";
|
||||
result += indent + "Communication = " + Communication + ", ";
|
||||
result += indent + "ValvesOpen = " + ValvesOpen.ToString() + ", ";
|
||||
result += indent + "ValvesClose = " + ValvesClose.ToString() + ", ";
|
||||
result += indent + "RegulValvesPct = " + RegulValvesPct.ToString() + ", ";
|
||||
result += indent + "PumpsWithFMPct = " + RegulValvesPct.ToString() + Environment.NewLine;
|
||||
result += indent + "EndCondition = " + EndCondition + ", ";
|
||||
result += indent + "ValvesOpen = " + ValvesOpen + ", ";
|
||||
result += indent + "ValvesClose = " + ValvesClose + ", ";
|
||||
result += indent + "RegulValvesPct = " + RegulValvesPct + ", ";
|
||||
result += indent + "PumpsWithFMPct = " + PumpWithFMPcts + Environment.NewLine;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2017 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class User
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual string UserName { get; set; } /// = name, alias, abbreviation
|
||||
public virtual string FullName { get; set; } /// = description
|
||||
public virtual int Number { get; set; }
|
||||
public virtual string Password { 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 User()
|
||||
{
|
||||
Groups = new List<Group>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds a group to the user.
|
||||
/// </summary>
|
||||
/// <param name="group">Group to be added</param>
|
||||
public virtual void AddGroup(Group group)
|
||||
{
|
||||
Groups.Add(group);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Encrypts and sets users password.
|
||||
/// </summary>
|
||||
/// <param name="password">Unencrypted password</param>
|
||||
public virtual void SetPassword(string password)
|
||||
{
|
||||
Password = Users.Entities.User.getHash(password);
|
||||
LastPwChange = DateTime.Now;
|
||||
}
|
||||
}
|
||||
}
|
||||
+4
-3
@@ -4,14 +4,15 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace TBF.Entities
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class VirtualBenchSequence : IHasItemNr
|
||||
public class VirtualBenchSequence : IHasName, IHasItemNr
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual int ItemNr { get; set; }
|
||||
public virtual string Name { get; set; }
|
||||
public virtual string Description { get; set; } /// Short description
|
||||
public virtual string OriName { get; set; } /// Not mapped to database
|
||||
public virtual string Description { get; set; } /// Short description
|
||||
public virtual IList<VirtualBenchStep> VirtualBenchSteps { get; set; }
|
||||
|
||||
public VirtualBenchSequence()
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace TBF.Entities
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class VirtualBenchStep : IHasItemNr
|
||||
{
|
||||
@@ -9,7 +9,7 @@ using System.Text;
|
||||
/// This class holds the watermeter type specific data
|
||||
/// that have all watermaters of the same type in common
|
||||
|
||||
namespace TBF.Entities
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class WMType
|
||||
{
|
||||
@@ -41,7 +41,7 @@ namespace TBF.Entities
|
||||
WMType procedure = new WMType()
|
||||
{
|
||||
CreateTime = DateTime.Now,
|
||||
CreateUserName = User.CurrentUser.Name,
|
||||
CreateUserName = Users.GlobalData.CurrentUser.UserName,
|
||||
CreateDescription = "A default water meter created.",
|
||||
Name = "Watermeter",
|
||||
PulseRate = 1000,
|
||||
@@ -6,11 +6,10 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
using TBF;
|
||||
using NHibernate;
|
||||
using FluentNHibernate;
|
||||
|
||||
namespace TBF.Entities
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class Watermeter
|
||||
{
|
||||
@@ -30,7 +29,7 @@ namespace TBF.Entities
|
||||
/// </summary>
|
||||
public static Watermeter LoadBySerialnr(string SerialNr)
|
||||
{
|
||||
IList<Watermeter> ListOfWatermeters = FluentCommon.CreateSession(Database.WaterMeters)
|
||||
IList<Watermeter> ListOfWatermeters = FluentCommon.CreateSession(Users.Entities.DBKind.Results)
|
||||
.CreateQuery("FROM Watermeter WHERE Serial = :SerialNrParameter")
|
||||
.SetParameter("SerialNrParameter", SerialNr)
|
||||
.List<Watermeter>();
|
||||
@@ -0,0 +1,242 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
using FluentNHibernate.Cfg;
|
||||
using FluentNHibernate.Cfg.Db;
|
||||
using NHibernate;
|
||||
using NHibernate.Cfg;
|
||||
using NHibernate.Tool.hbm2ddl;
|
||||
using Config.Resources;
|
||||
|
||||
namespace Config
|
||||
{
|
||||
public static class FluentCommon
|
||||
{
|
||||
/// <summary>
|
||||
/// Session factories for regular sessions.
|
||||
/// </summary>
|
||||
public static ISessionFactory[] SessionFactories = new ISessionFactory[(int)Users.Entities.DBKind.Count];
|
||||
|
||||
/// <summary>
|
||||
/// NHibernate session factory (to create the database session 'SessionFactory')
|
||||
/// </summary>
|
||||
/// <returns>A database session</returns>
|
||||
static ISessionFactory CreateSessionFactory(Users.Entities.DBKind database)
|
||||
{
|
||||
Users.Entities.DBType dbType;
|
||||
string connectionString;
|
||||
|
||||
switch (database)
|
||||
{
|
||||
default:
|
||||
case Users.Entities.DBKind.Config:
|
||||
dbType = Data.CurrentBench.ProceduresDBSettings.DbType;
|
||||
connectionString = Data.CurrentBench.ProceduresDBSettings.ConnectionString;
|
||||
break;
|
||||
case Users.Entities.DBKind.Results:
|
||||
dbType = Data.CurrentBench.WaterMetersDBSettings.DbType;
|
||||
connectionString = Data.CurrentBench.WaterMetersDBSettings.ConnectionString;
|
||||
break;
|
||||
}
|
||||
|
||||
return CreateSessionFactory(database, dbType, connectionString, false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// NHibernate session factory (to create the database session 'SessionFactory')
|
||||
/// </summary>
|
||||
/// <returns>A database session</returns>
|
||||
public static ISessionFactory CreateSessionFactory(Users.Entities.DBKind database, Users.Entities.DBType dbType, string connectionString, bool createDB)
|
||||
{
|
||||
try
|
||||
{
|
||||
FluentConfiguration cfg = Fluently.Configure();
|
||||
|
||||
switch (dbType)
|
||||
{
|
||||
default:
|
||||
case Users.Entities.DBType.SQLite:
|
||||
cfg = cfg.Database(SQLiteConfiguration.Standard.UsingFile(connectionString));
|
||||
break;
|
||||
case Users.Entities.DBType.MySql:
|
||||
cfg = cfg.Database(MySQLConfiguration.Standard.ConnectionString(connectionString));
|
||||
break;
|
||||
}
|
||||
|
||||
switch (database)
|
||||
{
|
||||
default:
|
||||
case Users.Entities.DBKind.Config:
|
||||
cfg = cfg.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Data>());
|
||||
break;
|
||||
case Users.Entities.DBKind.Results:
|
||||
cfg = cfg.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Data>());
|
||||
break;
|
||||
}
|
||||
|
||||
if (createDB)
|
||||
{
|
||||
return cfg.ExposeConfiguration(BuildSchemaCreate).BuildSessionFactory();
|
||||
}
|
||||
else
|
||||
{
|
||||
return cfg.ExposeConfiguration(BuildSchema).BuildSessionFactory();
|
||||
}
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
MessageBox.Show(string.Format(Strings.Cannot_open_DB_Cause_0, exc.Message),
|
||||
Strings.Error,
|
||||
MessageBoxButtons.OK,
|
||||
MessageBoxIcon.Error);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public delegate void BuildSchemaDlgt(Configuration config);
|
||||
|
||||
static void BuildSchema(Configuration config)
|
||||
{
|
||||
/// This NHibernate tool takes a configuration (with mapping info in)
|
||||
/// and exports a database schema from it
|
||||
new SchemaExport(config).SetOutputFile("db_schema");
|
||||
}
|
||||
|
||||
static void BuildSchemaCreate(Configuration config)
|
||||
{
|
||||
/// This NHibernate tool takes a configuration (with mapping info in)
|
||||
/// and exports a database schema from it
|
||||
new SchemaExport(config).Create(true, true);
|
||||
}
|
||||
|
||||
/// Create a NHibernate session for the given database
|
||||
public static ISession CreateSession(Users.Entities.DBKind database)
|
||||
{
|
||||
int ix = (int)database;
|
||||
if (ix < 0 || ix >= (int)Users.Entities.DBKind.Count) return null;
|
||||
|
||||
if (SessionFactories[ix] == null) SessionFactories[ix] = CreateSessionFactory(database);
|
||||
|
||||
return SessionFactories[ix].OpenSession();
|
||||
}
|
||||
|
||||
public static void SaveToDb(Users.Entities.DBKind database, object obj)
|
||||
{
|
||||
SaveToDb(CreateSession(database), obj);
|
||||
}
|
||||
|
||||
public static void SaveToDb(ISession session, object obj)
|
||||
{
|
||||
using (var transaction = session.BeginTransaction())
|
||||
{
|
||||
try
|
||||
{
|
||||
session.SaveOrUpdate(obj);
|
||||
transaction.Commit();
|
||||
}
|
||||
catch
|
||||
{
|
||||
transaction.Rollback();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void DeleteFromDb(Users.Entities.DBKind database, object obj)
|
||||
{
|
||||
DeleteFromDb(CreateSession(database), obj);
|
||||
}
|
||||
|
||||
public static void DeleteFromDb(ISession session, object obj)
|
||||
{
|
||||
using (var transaction = session.BeginTransaction())
|
||||
{
|
||||
session.Delete(obj);
|
||||
transaction.Commit();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create an empty users database.
|
||||
/// Database contains only the user 'admin' and the control board component 'CB'.
|
||||
/// </summary>
|
||||
/// <param name="dbType">DBType.SQLite or DBType.MySql</param>
|
||||
/// <param name="connectionString">Connection string</param>
|
||||
/// <returns>true=success, false=error</returns>
|
||||
public static bool CreateEmptyConfigDB(Users.Entities.DBType dbType, string connectionString)
|
||||
{
|
||||
ISessionFactory sessionFactory = CreateSessionFactory(Users.Entities.DBKind.Config, dbType, connectionString, true);
|
||||
if (sessionFactory == null) return false;
|
||||
|
||||
/// Populate the database
|
||||
using (var session = sessionFactory.OpenSession())
|
||||
{
|
||||
using (var transaction = session.BeginTransaction())
|
||||
{
|
||||
///
|
||||
/// Prepare all groups
|
||||
///
|
||||
var testers = new Config.Entities.Group((int)Users.Grp.GID.Testers, Strings.Tester);
|
||||
var testingSpecialists = new Config.Entities.Group((int)Users.Grp.GID.TestingSpecialists, Strings.Testing_Specialist);
|
||||
var headOfLab = new Config.Entities.Group((int)Users.Grp.GID.HeadOfLab, Strings.Head_of_Lab);
|
||||
var maintenanceSpecialists = new Config.Entities.Group((int)Users.Grp.GID.MaintenanceSpecialists, Strings.Maintenance_Specialist);
|
||||
var metrologists = new Config.Entities.Group((int)Users.Grp.GID.Metrologists, Strings.Metrologist);
|
||||
var calibrationSpecialists = new Config.Entities.Group((int)Users.Grp.GID.CalibrationSpecialists, Strings.Calibration_Specialist);
|
||||
var administrators = new Config.Entities.Group((int)Users.Grp.GID.Administrators, Strings.Administrator);
|
||||
|
||||
/// Create the user 'admin' add his groups
|
||||
var admin = new Config.Entities.User
|
||||
{
|
||||
UserName = Data.AdminUsername,
|
||||
FullName = Strings.Administrator,
|
||||
LastPwChange = DateTime.Now
|
||||
};
|
||||
admin.SetPassword(Data.AdminPassword);
|
||||
admin.AddGroup(testers);
|
||||
admin.AddGroup(testingSpecialists);
|
||||
admin.AddGroup(headOfLab);
|
||||
admin.AddGroup(maintenanceSpecialists);
|
||||
admin.AddGroup(metrologists);
|
||||
admin.AddGroup(calibrationSpecialists);
|
||||
admin.AddGroup(administrators);
|
||||
|
||||
session.SaveOrUpdate(admin);
|
||||
|
||||
///// Create the control board component
|
||||
//var cmpnt = (new BenchControl.Elde.ControlBoardCfg(new BenchControl.Elde.ControlBoardFactory())).CreateDbEntity();
|
||||
//session.SaveOrUpdate(cmpnt);
|
||||
|
||||
transaction.Commit();
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create an empty water meters database
|
||||
/// </summary>
|
||||
/// <param name="dbType">DBType.SQLite or DBType.MySql</param>
|
||||
/// <param name="connectionString">Connection string</param>
|
||||
/// <returns>true=success, false=error</returns>
|
||||
public static bool CreateEmptyResultsDB(Users.Entities.DBType dbType, string connectionString)
|
||||
{
|
||||
ISessionFactory sessionFactory = CreateSessionFactory(Users.Entities.DBKind.Results, dbType, connectionString, true);
|
||||
if (sessionFactory == null) return false;
|
||||
|
||||
/// Populate the database
|
||||
//using (var session = sessionFactory.OpenSession())
|
||||
//{
|
||||
// using (var transaction = session.BeginTransaction())
|
||||
// {
|
||||
// /// Create one component
|
||||
// var cmpnt = (new BenchControl.Elde.ControlBoardCfg("CB", 1)).CreateDbEntity();
|
||||
// session.SaveOrUpdate(cmpnt);
|
||||
// transaction.Commit();
|
||||
// }
|
||||
//}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,389 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2018 Sensus Slovensko a.s.
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using log4net;
|
||||
|
||||
namespace Config
|
||||
{
|
||||
public static class Formulas
|
||||
{
|
||||
private static readonly ILog log = LogManager.GetLogger(typeof(Formulas));
|
||||
|
||||
///
|
||||
/// Tables to calculate specific enthalpy
|
||||
///
|
||||
private static readonly int[] Ii;
|
||||
private static readonly int[] Ji;
|
||||
private static readonly double[] ni;
|
||||
|
||||
private static readonly double[] Di;
|
||||
|
||||
/// <summary>
|
||||
/// Constructor
|
||||
/// </summary>
|
||||
static Formulas()
|
||||
{
|
||||
///
|
||||
/// Initialize tables to calculate specific enthalpies
|
||||
///
|
||||
Ii = new int[34] { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 8, 8, 21, 23, 29, 30, 31, 32 };
|
||||
Ji = new int[34] { -2, -1, 0, 1, 2, 3, 4, 5, -9, -7, -1, 0, 1, 3, -3, 0, 1, 3, 17, -4, 0, 6, -5, -2, 10, -8, -11, -6, -29, -31, -38, -39, -40, -41 };
|
||||
ni = new double[34] {
|
||||
0.14632971213167, /// 1
|
||||
-0.84548187169114, /// 2
|
||||
-0.37563603672040E1, /// 3
|
||||
0.33855169168385E1, /// 4
|
||||
-0.95791963387872, /// 5
|
||||
0.15772038513228, /// 6
|
||||
-0.16616417199501E-1, /// 7
|
||||
0.81214629983568E-3, /// 8
|
||||
0.28319080123804E-3, /// 9
|
||||
-0.60706301565874E-3, /// 10
|
||||
-0.18990068218419E-1, /// 11
|
||||
-0.32529748770505E-1, /// 12
|
||||
-0.21841717175414E-1, /// 13
|
||||
-0.52838357969930E-4, /// 14
|
||||
-0.47184321073267E-3, /// 15
|
||||
-0.30001780793026E-3, /// 16
|
||||
0.47661393906987E-4, /// 17
|
||||
-0.44141845330846E-5, /// 18
|
||||
-0.72694996297594E-15, /// 19
|
||||
-0.31679644845054E-4, /// 20
|
||||
-0.28270797985312E-5, /// 21
|
||||
-0.85205128120103E-9, /// 22
|
||||
-0.22425281908000E-5, /// 23
|
||||
-0.65171222895601E-6, /// 24
|
||||
-0.14341729937924E-12, /// 25
|
||||
-0.40516996860117E-6, /// 26
|
||||
-0.12734301741641E-8, /// 27
|
||||
-0.17424871230634E-9, /// 28
|
||||
-0.68762131295531E-18, /// 29
|
||||
0.14478307828521E-19, /// 30
|
||||
0.26335781662795E-22, /// 31
|
||||
-0.11947622640071E-22, /// 32
|
||||
0.18228094581404E-23, /// 33
|
||||
-0.93537087292458E-25, /// 34
|
||||
};
|
||||
|
||||
///
|
||||
/// Initialize a table to calculate temperature of a platinum thermometer from resistance
|
||||
///
|
||||
Di = new double[]
|
||||
{
|
||||
439.932854,
|
||||
472.418020,
|
||||
37.684494,
|
||||
7.472018,
|
||||
2.920828,
|
||||
0.005184,
|
||||
-0.963864,
|
||||
-0.188732,
|
||||
0.191203,
|
||||
0.049025,
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Calculate density of distilled water from temperature
|
||||
/// </summary>
|
||||
/// <param name="t">ITS-90 temperature in [°C]</param>
|
||||
/// <returns>Density in [kg/m3]</returns>
|
||||
public static double DistilledWaterDensityFromTemp(double t)
|
||||
{
|
||||
if (t <= 40)
|
||||
{
|
||||
const double c0 = 999.839564;
|
||||
const double c1 = 0.067998613;
|
||||
const double c2 = -0.0091101468;
|
||||
const double c3 = 0.00010058299;
|
||||
const double c4 = -0.0000011275659;
|
||||
const double c5 = 6.5985371e-09;
|
||||
|
||||
return ((((c5 * t + c4) * t + c3) * t + c2) * t + c1) * t + c0;
|
||||
}
|
||||
else
|
||||
{
|
||||
const double a0 = 9.9983952E2;
|
||||
const double a1 = 1.6952577E1;
|
||||
const double a2 = -7.9905127E-3;
|
||||
const double a3 = -4.6241757E-5;
|
||||
const double a4 = 1.0584601E-7;
|
||||
const double a5 = -2.8103006E-10;
|
||||
const double b = 1.6887236E-2;
|
||||
|
||||
return (((((a5 * t + a4) * t + a3) * t + a2) * t + a1) * t + a0) / (1.0 + b * t);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Calculate density of distilled water from temperature (obsolete)
|
||||
/// </summary>
|
||||
/// <param name="t">IPTS-68 temperature in [°C]</param>
|
||||
/// <returns>Density in [kg/m3]</returns>
|
||||
public static double DistilledWaterDensityFromTempIPTS68(double t)
|
||||
{
|
||||
const double a0 = 999.842594;
|
||||
const double a1 = 0.06793952;
|
||||
const double a2 = -0.009095290;
|
||||
const double a3 = 0.0001001685;
|
||||
const double a4 = -0.000001120083;
|
||||
const double a5 = 6.536332e-09;
|
||||
|
||||
return ((((a5 * t + a4) * t + a3) * t + a2) * t + a1) * t + a0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Calculate density by comparing calculated data and data from a certificate
|
||||
/// </summary>
|
||||
/// <param name="realDensity">Density from a certificate in [kg/m3]</param>
|
||||
/// <param name="atTemperature">Temperature from a certificate in [°C]</param>
|
||||
/// <returns>Density correction in [kg/m3]</returns>
|
||||
public static double DensityCorrection(double realDensity, double atTemperature)
|
||||
{
|
||||
/// Calculated data
|
||||
double calculatedDensity = DistilledWaterDensityFromTemp(atTemperature);
|
||||
|
||||
return realDensity - calculatedDensity;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Calculate corrected (real) water density from temperature
|
||||
/// </summary>
|
||||
/// <param name="t">Temperature in [°C]</param>
|
||||
/// <returns>Density in [kg/m3]</returns>
|
||||
public static double WaterDensityFromTemp(double t, double realDensity, double atTemperature)
|
||||
{
|
||||
return DistilledWaterDensityFromTemp(t) + DensityCorrection(realDensity, atTemperature);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Calculate corrected (real) water density from temperature
|
||||
/// </summary>
|
||||
/// <param name="t">Temperature in [°C]</param>
|
||||
/// <returns>Density in [kg/m3]</returns>
|
||||
public static double WaterDensityFromTempPress(double temp, double pressure, double realDensity, double atTemperature)
|
||||
{
|
||||
double x0 = 5.08821E-10;
|
||||
double x1 = 1.2639418;
|
||||
double x2 = 0.2660269;
|
||||
double x3 = 0.3734838;
|
||||
double x4 = 2.0205242;
|
||||
double theta = temp / 100.0;
|
||||
double B = x0 * (((x3 * theta + x2) * theta + x1) * theta + 1) / (1 + x4 * theta);
|
||||
|
||||
return WaterDensityFromTemp(temp, realDensity, atTemperature) * (1 + B * Config.Units.ConvertTo(Config.Unit.Pa, pressure));
|
||||
}
|
||||
|
||||
|
||||
public static float AirDensityFromAmbientVales(float tempC, float pressureBar, float humiPct)
|
||||
{
|
||||
double pressurePa = 100000.0 * (double)pressureBar; /// [Pa]
|
||||
double tempKelvin = 273.15 + (double)tempC;
|
||||
double coef1 = 1.2811805 / 10000.0 * tempKelvin * tempKelvin
|
||||
- 1.950987 / 100.0 * tempKelvin
|
||||
+ 34.04926034
|
||||
- 6.353631 * 1000.0 / tempKelvin;
|
||||
double coef3 = humiPct / 100.0 * System.Math.Exp(coef1) / pressurePa;
|
||||
double airDensityKgm3 = 0.00348353 * pressurePa * (1.0 - 0.378 * coef3) / tempKelvin; /// kg/m3
|
||||
return (float)airDensityKgm3;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert 'pulses' to 'volume', prevent division by zero
|
||||
/// </summary>
|
||||
public static double VolumeFromPulses(int pulses, double pulsesPerLiter)
|
||||
{
|
||||
if (pulsesPerLiter <= double.Epsilon) return 0;
|
||||
return Convert.ToDouble(pulses) / pulsesPerLiter;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Calculate the error in % from 'measured' and 'true' volume, prevent division by zero
|
||||
/// </summary>
|
||||
public static double ErrorFromVolumes(double measuredVolume, double trueVolume)
|
||||
{
|
||||
if (trueVolume <= float.Epsilon)
|
||||
{
|
||||
if (measuredVolume <= float.Epsilon)
|
||||
{
|
||||
log.WarnFormat("ErrorFromVolumes({0},{1}) returns {2}", measuredVolume, trueVolume, -100.0);
|
||||
return -100.0;
|
||||
}
|
||||
|
||||
log.WarnFormat("ErrorFromVolumes({0},{1}) returns {2}", measuredVolume, trueVolume, 99.0);
|
||||
return 99.0;
|
||||
}
|
||||
|
||||
double error = 100.0 * (measuredVolume - trueVolume) / trueVolume;
|
||||
log.InfoFormat("ErrorFromVolumes({0},{1}) returns {2}", measuredVolume, trueVolume, error);
|
||||
return error;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Calculates corrected value form a list of corrections by interpolation.
|
||||
/// It is assumed that values in the list 'corrections' are sorted.
|
||||
/// </summary>
|
||||
/// <param name="rawMeasurement">Raw uncorrected value</param>
|
||||
/// <param name="corrections">Sorted (value, correction) pairs</param>
|
||||
/// <returns>Corrected value</returns>
|
||||
public static double CorrectedValue(double rawValue, IList<Config.Entities.MeasurementCorrection> corrections)
|
||||
{
|
||||
if (corrections == null || corrections.Count == 0) return rawValue;
|
||||
|
||||
if (rawValue < corrections[0].Measurement)
|
||||
{
|
||||
return rawValue + corrections[0].Correction;
|
||||
}
|
||||
|
||||
int count = corrections.Count;
|
||||
for (int i = 1; i < count; i++)
|
||||
{
|
||||
if (rawValue < corrections[i].Measurement)
|
||||
{
|
||||
double d1 = rawValue - corrections[i-1].Measurement;
|
||||
double d2 = corrections[i].Measurement - rawValue;
|
||||
|
||||
double corr;
|
||||
if (d1 + d2 <= float.Epsilon)
|
||||
{
|
||||
corr = (corrections[i - 1].Correction + corrections[i].Correction) / 2.0;
|
||||
}
|
||||
else
|
||||
{
|
||||
corr = (corrections[i - 1].Correction * d2 + corrections[i].Correction * d1) / (d1 + d2);
|
||||
}
|
||||
return rawValue + corr;
|
||||
}
|
||||
}
|
||||
|
||||
return rawValue + corrections[count - 1].Correction;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Converts a measurement error to a correction (used when preparing correction tables).
|
||||
/// </summary>
|
||||
/// <param name="measuredValue">Measured value (in arbitrary units)</param>
|
||||
/// <param name="error">Measurement error in %</param>
|
||||
/// <returns>Correction in the same units as the measured value</returns>
|
||||
public static double CorrectionFromError(double measuredValue, double error)
|
||||
{
|
||||
double trueValue = measuredValue / (1 + error/100);
|
||||
double correction = trueValue - measuredValue;
|
||||
return correction;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Calculates the heat coefficient for water
|
||||
/// </summary>
|
||||
/// <param name="pressure">Pressure [bar]</param>
|
||||
/// <param name="T_in">Inlet temperature [°C]</param>
|
||||
/// <param name="T_out">Outlet temperature [°C]</param>
|
||||
/// <param name="flowMeasuredAtInlet">true = flow measured @inlet, false = flow measured @outlet</param>
|
||||
/// <returns> Heat coefficient for water [J/(m3 K)]</returns>
|
||||
public static double HeatCoefficientWater(double pressure, double T_in, double T_out, bool flowMeasuredAtInlet)
|
||||
{
|
||||
if (T_in == T_out) return 0;
|
||||
|
||||
const double R = 461.526; /// [J kg^-1 K^-1]
|
||||
const double p_star_Pa = 16.53E6; /// [Pa] (=16.53 MPa)
|
||||
const double T_star = 1386.0; /// [K]
|
||||
|
||||
double T_in_K = Config.Units.ConvertTo(Config.Unit.K, T_in);
|
||||
double T_out_K = Config.Units.ConvertTo(Config.Unit.K, T_out);
|
||||
double tau_in = T_star / T_in_K;
|
||||
double tau_out = T_star / T_out_K;
|
||||
double pi = Config.Units.ConvertTo(Config.Unit.Pa, pressure) / p_star_Pa;
|
||||
|
||||
double h_in = tau_in * GammaTau(pi, tau_in) * R * T_in_K;
|
||||
double h_out = tau_out * GammaTau(pi, tau_out) * R * T_out_K;
|
||||
|
||||
double ni = flowMeasuredAtInlet ? GammaPi(pi, tau_in) * R * T_in_K / p_star_Pa
|
||||
: GammaPi(pi, tau_out) * R * T_out_K / p_star_Pa;
|
||||
|
||||
return (h_in - h_out) / (ni * (T_in - T_out));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// gamma(pi) see also STN EN 1434-1 Annex A (A.4)
|
||||
/// </summary>
|
||||
/// <param name="pi">pi = p / p* where p* = 16.53 MPa</param>
|
||||
/// <param name="tau">tau = T* / T where T* = 1386 K</param>
|
||||
/// <returns>gamma(pi)</returns>
|
||||
static double GammaPi(double pi, double tau)
|
||||
{
|
||||
double result = 0;
|
||||
for (int i = 0; i < 34; i++)
|
||||
{
|
||||
result -= ni[i] * Ii[i] * Math.Pow(7.1 - pi, Ii[i] - 1) * Math.Pow(tau - 1.222, Ji[i]);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// gamma(tau) see also STN EN 1434-1 Annex A (A.7)
|
||||
/// </summary>
|
||||
/// <param name="pi">pi = p / p* where p* = 16.53 MPa</param>
|
||||
/// <param name="tau">tau = T* / T where T* = 1386 K</param>
|
||||
/// <returns>gamma(tau)</returns>
|
||||
static double GammaTau(double pi, double tau)
|
||||
{
|
||||
double result = 0;
|
||||
for (int i = 0; i < 34; i++)
|
||||
{
|
||||
result += ni[i] * Math.Pow(7.1 - pi, Ii[i]) * Ji[i] * Math.Pow(tau - 1.222, Ji[i] - 1);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Conversion of measured resistance of a platinum thermometer to temperature according to ITS-90
|
||||
/// </summary>
|
||||
/// <param name="R">Measured resistance in [°C]</param>
|
||||
/// <param name="R001C">Calibrated resistance in Ohm at 0.01°C</param>
|
||||
/// <param name="a7">Calibrated ITS-90 coefficient a7</param>
|
||||
/// <param name="b7">Calibrated ITS-90 coefficient b7</param>
|
||||
/// <param name="c7">Calibrated ITS-90 coefficient c7</param>
|
||||
/// <returns>Temperature in [°C]</returns>
|
||||
public static double PlatinumResistanceTM_ITS90_R2T(double R, double R001C, double a7, double b7, double c7)
|
||||
{
|
||||
double w = R / R001C; /// ratio
|
||||
double r1 = w - 1.0;
|
||||
double dw = r1 * (a7 + r1 * (b7 + r1 * c7)); /// = a7*r1 + b7*r1^2 + c7*r1^3
|
||||
double wr = w - dw;
|
||||
double x = (wr - 2.64) / 1.64;
|
||||
|
||||
double sum = 0;
|
||||
for (int i = Di.Length - 1; i >= 0; i--)
|
||||
{
|
||||
sum = sum * x + Di[i];
|
||||
}
|
||||
|
||||
return sum;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Conversion of measured resistance of a platinum thermometer to temperature using Callendar-Van Dusen equations
|
||||
/// </summary>
|
||||
/// <param name="R">Measured resistance in [°C]</param>
|
||||
/// <param name="R0">Calibrated resistance in Ohm at 0°C</param>
|
||||
/// <param name="A">Calibration coefficient a</param>
|
||||
/// <param name="B">Calibration coefficient b</param>
|
||||
/// <returns>Temperature in [°C]</returns>
|
||||
public static double PlatinumResistanceTM_ITS27_R2T(double R, double R0, double A, double B)
|
||||
{
|
||||
if (R0 * R0 * A * A - 4 * R0 * B * (R0 - R) <= 0) return 0; /// Out of range
|
||||
|
||||
return (-(R0 * A) + Math.Sqrt(R0 * R0 * A * A - 4 * R0 * B * (R0 - R))) / (2 * R0 * B);
|
||||
}
|
||||
|
||||
|
||||
public static double Buoyancy()
|
||||
{
|
||||
return 1.00103;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,9 +2,9 @@
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using TBF.Entities;
|
||||
using Config.Entities;
|
||||
|
||||
namespace TBF.Mappings
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class BenchPathMap : ClassMap<BenchPath>
|
||||
{
|
||||
@@ -15,10 +15,12 @@ namespace TBF.Mappings
|
||||
Map(x => x.Name);
|
||||
Map(x => x.Qfrom);
|
||||
Map(x => x.Qto);
|
||||
Map(x => x.TempIn);
|
||||
Map(x => x.TempOut);
|
||||
Map(x => x.PressIn);
|
||||
Map(x => x.PressOut);
|
||||
Map(x => x.TempMtrUp).Column("TempIn");
|
||||
Map(x => x.TempMtrDown).Column("TempOut");
|
||||
Map(x => x.PressMtrUp).Column("PressIn");
|
||||
Map(x => x.PressMtrDown).Column("PressOut");
|
||||
Map(x => x.PressMtrDelta);
|
||||
Map(x => x.StopBFValve);
|
||||
Map(x => x.ValvesOpen)
|
||||
.CustomType("StringClob")
|
||||
.CustomSqlType("varchar(8000)");
|
||||
@@ -2,9 +2,9 @@
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using TBF.Entities;
|
||||
using Config.Entities;
|
||||
|
||||
namespace TBF.Mappings
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class ComponentMap : ClassMap<Component>
|
||||
{
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using TBF.Entities;
|
||||
using Config.Entities;
|
||||
|
||||
namespace TBF.Mappings
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class ComponentProcedureMap : ClassMap<ComponentProcedure>
|
||||
{
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using TBF.Entities;
|
||||
using Config.Entities;
|
||||
|
||||
namespace TBF.Mappings
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class ComponentTestMap : ClassMap<ComponentTest>
|
||||
{
|
||||
@@ -2,9 +2,9 @@
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using TBF.Entities;
|
||||
using Config.Entities;
|
||||
|
||||
namespace TBF.Mappings
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class FeedingPathMap : ClassMap<FeedingPath>
|
||||
{
|
||||
@@ -16,6 +16,7 @@ namespace TBF.Mappings
|
||||
Map(x => x.Qfrom);
|
||||
Map(x => x.Qto);
|
||||
Map(x => x.Pump);
|
||||
Map(x => x.RegulValvesPct);
|
||||
Map(x => x.ValvesOpen)
|
||||
.CustomType("StringClob")
|
||||
.CustomSqlType("varchar(8000)");
|
||||
@@ -3,7 +3,7 @@
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
|
||||
namespace TBF.Mappings
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class GroupMap : ClassMap<Entities.Group>
|
||||
{
|
||||
@@ -0,0 +1,35 @@
|
||||
///
|
||||
/// Copyright (c) 2016 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using Config.Entities;
|
||||
|
||||
namespace Config.Mappings
|
||||
{
|
||||
#if HEAT_METERS
|
||||
class HeatMetersPathMap : ClassMap<HeatMetersPath>
|
||||
{
|
||||
public HeatMetersPathMap()
|
||||
{
|
||||
Id(x => x.Id);
|
||||
Map(x => x.ItemNr);
|
||||
Map(x => x.Name);
|
||||
|
||||
Map(x => x.TempWarmFrom);
|
||||
Map(x => x.TempWarmTo);
|
||||
Map(x => x.TempColdFrom);
|
||||
Map(x => x.TempColdTo);
|
||||
|
||||
Map(x => x.TMeterRefWarm1);
|
||||
Map(x => x.TMeterRefWarm2);
|
||||
Map(x => x.TMeterRefCold1);
|
||||
Map(x => x.TMeterRefCold2);
|
||||
|
||||
Map(x => x.TMeterWorkWarm1);
|
||||
Map(x => x.TMeterWorkWarm2);
|
||||
Map(x => x.TMeterWorkCold1);
|
||||
Map(x => x.TMeterWorkCold2);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
+4
-3
@@ -1,16 +1,17 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
/// Copyright (c) 2013-2018 Sensus Slovensko a.s.
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using TBF.Entities;
|
||||
using Config.Entities;
|
||||
|
||||
namespace TBF.Mappings
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class MeasurementCorrectionMap : ClassMap<MeasurementCorrection>
|
||||
{
|
||||
public MeasurementCorrectionMap()
|
||||
{
|
||||
Id(x => x.Id);
|
||||
Map(x => x.RangeIx);
|
||||
Map(x => x.Measurement);
|
||||
Map(x => x.Correction);
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using Config.Entities;
|
||||
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class MetersPathMap : ClassMap<MetersPath>
|
||||
{
|
||||
public MetersPathMap()
|
||||
{
|
||||
Id(x => x.Id);
|
||||
Map(x => x.ItemNr);
|
||||
Map(x => x.Name);
|
||||
|
||||
#pragma warning disable
|
||||
if (Config.Data.WMsCount >= 1) Map(x => x.Sensor1);
|
||||
if (Config.Data.WMsCount >= 2) Map(x => x.Sensor2);
|
||||
if (Config.Data.WMsCount >= 3) Map(x => x.Sensor3);
|
||||
if (Config.Data.WMsCount >= 4) Map(x => x.Sensor4);
|
||||
if (Config.Data.WMsCount >= 5) Map(x => x.Sensor5);
|
||||
if (Config.Data.WMsCount >= 6) Map(x => x.Sensor6);
|
||||
if (Config.Data.WMsCount >= 7) Map(x => x.Sensor7);
|
||||
if (Config.Data.WMsCount >= 8) Map(x => x.Sensor8);
|
||||
if (Config.Data.WMsCount >= 9) Map(x => x.Sensor9);
|
||||
if (Config.Data.WMsCount >= 10) Map(x => x.Sensor10);
|
||||
if (Config.Data.WMsCount >= 11) Map(x => x.Sensor11);
|
||||
if (Config.Data.WMsCount >= 12) Map(x => x.Sensor12);
|
||||
if (Config.Data.WMsCount >= 13) Map(x => x.Sensor13);
|
||||
if (Config.Data.WMsCount >= 14) Map(x => x.Sensor14);
|
||||
if (Config.Data.WMsCount >= 15) Map(x => x.Sensor15);
|
||||
if (Config.Data.WMsCount >= 16) Map(x => x.Sensor16);
|
||||
if (Config.Data.WMsCount >= 17) Map(x => x.Sensor17);
|
||||
if (Config.Data.WMsCount >= 18) Map(x => x.Sensor18);
|
||||
if (Config.Data.WMsCount >= 19) Map(x => x.Sensor19);
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,9 +2,9 @@
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using TBF.Entities;
|
||||
using Config.Entities;
|
||||
|
||||
namespace TBF.Mappings
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class OutputPathMap : ClassMap<OutputPath>
|
||||
{
|
||||
@@ -21,7 +21,8 @@ namespace TBF.Mappings
|
||||
Map(x => x.StartValve);
|
||||
Map(x => x.Diverter);
|
||||
Map(x => x.TempDiv);
|
||||
Map(x => x.Balance);
|
||||
Map(x => x.Scale)
|
||||
.Column("Balance");
|
||||
Map(x => x.EmptyTankValve);
|
||||
Map(x => x.ValvesOpen)
|
||||
.CustomType("StringClob")
|
||||
@@ -2,9 +2,9 @@
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using TBF.Entities;
|
||||
using Config.Entities;
|
||||
|
||||
namespace TBF.Mappings
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class ProcedureMap : ClassMap<Procedure>
|
||||
{
|
||||
@@ -13,20 +13,34 @@ namespace TBF.Mappings
|
||||
Id(x => x.Id);
|
||||
Map(x => x.ItemNr);
|
||||
Map(x => x.Name);
|
||||
Map(x => x.MetersKind);
|
||||
|
||||
Map(x => x.Description);
|
||||
Map(x => x.CreationUser);
|
||||
Map(x => x.CreationTime);
|
||||
Map(x => x.LastChgUser);
|
||||
Map(x => x.LastChgTime);
|
||||
Map(x => x.LongDescription);
|
||||
|
||||
Map(x => x.ProcedureState);
|
||||
Map(x => x.Revision);
|
||||
Map(x => x.PredecessorId);
|
||||
Map(x => x.ObtainedByCopy);
|
||||
|
||||
Map(x => x.MetersKind);
|
||||
Map(x => x.Watermeters);
|
||||
Map(x => x.ProtocolTitle);
|
||||
Map(x => x.DataEntry);
|
||||
Map(x => x.Protected);
|
||||
Map(x => x.MustBeComplete);
|
||||
Map(x => x.ManualCtrlDisabled);
|
||||
|
||||
Map(x => x.DataEntry);
|
||||
Map(x => x.ResultsPrinter);
|
||||
Map(x => x.ResultsWriter);
|
||||
Map(x => x.TransitionStart);
|
||||
Map(x => x.TransitionEnd);
|
||||
|
||||
Map(x => x.AltProcName);
|
||||
Map(x => x.AltProcPeriod);
|
||||
|
||||
////Map(x => x.MetrologicalClass);
|
||||
////HasOne(x => x.WMType);
|
||||
HasMany(x => x.MoreParams)
|
||||
@@ -1,11 +1,10 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
/// Author: Milan Hanajik
|
||||
/// Copyright (c) 2013-2017 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using TBF.Entities;
|
||||
using Config.Entities;
|
||||
|
||||
namespace TBF.Mappings
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class TestMap : ClassMap<Test>
|
||||
{
|
||||
@@ -15,28 +14,46 @@ namespace TBF.Mappings
|
||||
Map(x => x.ItemNr);
|
||||
Map(x => x.Name);
|
||||
Map(x => x.Part);
|
||||
Map(x => x.Publish);
|
||||
Map(x => x.DoEvaluate)
|
||||
.Column("Evaluate");
|
||||
Map(x => x.Qfrom);
|
||||
Map(x => x.Qto);
|
||||
Map(x => x.Volume);
|
||||
Map(x => x.TstTime);
|
||||
Map(x => x.Repeats);
|
||||
Map(x => x.Emptying);
|
||||
Map(x => x.Zeroing);
|
||||
Map(x => x.DoDraining)
|
||||
.Column("Emptying");
|
||||
Map(x => x.DoZeroing)
|
||||
.Column("Zeroing");
|
||||
Map(x => x.DoControlWaterTemp);
|
||||
Map(x => x.TempLimLo);
|
||||
Map(x => x.TempLimHi);
|
||||
Map(x => x.PumpPower);
|
||||
Map(x => x.MassRepeats);
|
||||
Map(x => x.MassSpread);
|
||||
Map(x => x.MassMethod)
|
||||
.CustomType<byte>();
|
||||
Map(x => x.TimeBeforeFlow);
|
||||
Map(x => x.TimeFlow2Mass);
|
||||
Map(x => x.TimeMass2Start);
|
||||
Map(x => x.TimePump2StartV)
|
||||
.Column("TimeMass2Start");
|
||||
Map(x => x.TimeStop2Mass);
|
||||
Map(x => x.Method);
|
||||
Map(x => x.ErrLimLo);
|
||||
Map(x => x.ErrLimHi);
|
||||
Map(x => x.TolerRed); /// ???
|
||||
Map(x => x.RedType); /// ???
|
||||
Map(x => x.Uncertainty);
|
||||
Map(x => x.TolerRed)
|
||||
.Column("TolerRed"); /// ???
|
||||
Map(x => x.RedType); /// ???
|
||||
Map(x => x.FeedingPath);
|
||||
Map(x => x.BenchPath);
|
||||
Map(x => x.OutputPath);
|
||||
Map(x => x.MetersPath);
|
||||
Map(x => x.RelTransBefore);
|
||||
#if HEAT_METERS
|
||||
Map(x => x.HeatMetersPath);
|
||||
#endif
|
||||
Map(x => x.RelTransBefore);
|
||||
Map(x => x.RelTransBetween);
|
||||
Map(x => x.RelTransAfter);
|
||||
Map(x => x.TransitionAfter);
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using TBF.Entities;
|
||||
using Config.Entities;
|
||||
|
||||
namespace TBF.Mappings
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class TransitionSequenceMap : ClassMap<TransitionSequence>
|
||||
{
|
||||
+2
-3
@@ -2,9 +2,9 @@
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using TBF.Entities;
|
||||
using Config.Entities;
|
||||
|
||||
namespace TBF.Mappings
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class TransitionStepMap : ClassMap<TransitionStep>
|
||||
{
|
||||
@@ -15,7 +15,6 @@ namespace TBF.Mappings
|
||||
Map(x => x.Duration);
|
||||
Map(x => x.Message);
|
||||
Map(x => x.EndCondition);
|
||||
Map(x => x.Communication);
|
||||
Map(x => x.ValvesOpen)
|
||||
.CustomType("StringClob")
|
||||
.CustomSqlType("varchar(8000)");
|
||||
@@ -3,16 +3,17 @@
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
|
||||
namespace TBF.Mappings
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class UserMap : ClassMap<Entities.User>
|
||||
{
|
||||
public UserMap()
|
||||
{
|
||||
Id(x => x.Id);
|
||||
Map(x => x.Name);
|
||||
Map(x => x.Password);
|
||||
Map(x => x.Description);
|
||||
Map(x => x.UserName).Column("Name");
|
||||
Map(x => x.Number);
|
||||
Map(x => x.Password);
|
||||
Map(x => x.FullName).Column("Description");
|
||||
Map(x => x.LastPwChange);
|
||||
HasMany(x => x.Groups)
|
||||
.Cascade.All();
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using TBF.Entities;
|
||||
using Config.Entities;
|
||||
|
||||
namespace TBF.Mappings
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class VirtualBenchSequenceMap : ClassMap<VirtualBenchSequence>
|
||||
{
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using TBF.Entities;
|
||||
using Config.Entities;
|
||||
|
||||
namespace TBF.Mappings
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class VirtualBenchStepMap : ClassMap<VirtualBenchStep>
|
||||
{
|
||||
@@ -3,7 +3,7 @@
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
|
||||
namespace TBF.Mappings
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class WMTypeMap : ClassMap<Entities.WMType>
|
||||
{
|
||||
@@ -3,7 +3,7 @@
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
|
||||
namespace TBF.Mappings
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class WatermeterMap : ClassMap<Entities.Watermeter>
|
||||
{
|
||||
@@ -0,0 +1,36 @@
|
||||
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("Config")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("Sensus")]
|
||||
[assembly: AssemblyProduct("Config")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2013 - 2018 Sensus Slovensko a.s.")]
|
||||
[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("3fc3ff67-7386-4aff-9855-bef33d5fa0d3")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("2.18.893.0")]
|
||||
[assembly: AssemblyFileVersion("2.18.893.0")]
|
||||
Generated
+164
@@ -0,0 +1,164 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <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 Config.Resources {
|
||||
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", "4.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Strings {
|
||||
|
||||
private static global::System.Resources.ResourceManager resourceMan;
|
||||
|
||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||
|
||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
internal Strings() {
|
||||
}
|
||||
|
||||
/// <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("Config.Resources.Strings", typeof(Strings).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 string similar to Administrator.
|
||||
/// </summary>
|
||||
internal static string Administrator {
|
||||
get {
|
||||
return ResourceManager.GetString("Administrator", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Calibration Specialist.
|
||||
/// </summary>
|
||||
internal static string Calibration_Specialist {
|
||||
get {
|
||||
return ResourceManager.GetString("Calibration_Specialist", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Cannot open DB Cause 0.
|
||||
/// </summary>
|
||||
internal static string Cannot_open_DB_Cause_0 {
|
||||
get {
|
||||
return ResourceManager.GetString("Cannot_open_DB_Cause_0", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Error.
|
||||
/// </summary>
|
||||
internal static string Error
|
||||
{
|
||||
get
|
||||
{
|
||||
return ResourceManager.GetString("Error", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Failed.
|
||||
/// </summary>
|
||||
internal static string Failed {
|
||||
get {
|
||||
return ResourceManager.GetString("Failed", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Head of Lab.
|
||||
/// </summary>
|
||||
internal static string Head_of_Lab {
|
||||
get {
|
||||
return ResourceManager.GetString("Head_of_Lab", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Maintenance Specialist.
|
||||
/// </summary>
|
||||
internal static string Maintenance_Specialist {
|
||||
get {
|
||||
return ResourceManager.GetString("Maintenance_Specialist", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Metrologist.
|
||||
/// </summary>
|
||||
internal static string Metrologist {
|
||||
get {
|
||||
return ResourceManager.GetString("Metrologist", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Passed.
|
||||
/// </summary>
|
||||
internal static string Passed {
|
||||
get {
|
||||
return ResourceManager.GetString("Passed", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Tester.
|
||||
/// </summary>
|
||||
internal static string Tester {
|
||||
get {
|
||||
return ResourceManager.GetString("Tester", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Testing Specialist.
|
||||
/// </summary>
|
||||
internal static string Testing_Specialist {
|
||||
get {
|
||||
return ResourceManager.GetString("Testing_Specialist", resourceCulture);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -117,7 +117,7 @@
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Activity" xml:space="preserve">
|
||||
<value>Attività</value>
|
||||
<data name="Error" xml:space="preserve">
|
||||
<value>Chyba</value>
|
||||
</data>
|
||||
</root>
|
||||
+23
-20
@@ -117,34 +117,37 @@
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Activity" xml:space="preserve">
|
||||
<value>活动 / Activity</value>
|
||||
<data name="Administrator" xml:space="preserve">
|
||||
<value>Administrator</value>
|
||||
</data>
|
||||
<data name="Ambient_humidity_" xml:space="preserve">
|
||||
<value>空气温度 / Ambient humidity :</value>
|
||||
<data name="Calibration_Specialist" xml:space="preserve">
|
||||
<value>Kalibriertechniker</value>
|
||||
</data>
|
||||
<data name="Ambient_pressure_" xml:space="preserve">
|
||||
<value>大气压强 / Ambient pressure :</value>
|
||||
<data name="Head_of_Lab" xml:space="preserve">
|
||||
<value>Laborleiter</value>
|
||||
</data>
|
||||
<data name="Ambient_temperature_" xml:space="preserve">
|
||||
<value>空气温度 / Ambient temperature :</value>
|
||||
<data name="Maintenance_Specialist" xml:space="preserve">
|
||||
<value>Wartungstechniker</value>
|
||||
</data>
|
||||
<data name="Approval_" xml:space="preserve">
|
||||
<value>审核 / Approval :</value>
|
||||
<data name="Metrologist" xml:space="preserve">
|
||||
<value>Messtechniker</value>
|
||||
</data>
|
||||
<data name="Date_and_time_" xml:space="preserve">
|
||||
<value>日期及时间 / Date and time :</value>
|
||||
<data name="Tester" xml:space="preserve">
|
||||
<value>Prüfer</value>
|
||||
</data>
|
||||
<data name="Page" xml:space="preserve">
|
||||
<value>页面 / Page </value>
|
||||
<data name="Testing_Specialist" xml:space="preserve">
|
||||
<value>Prüftechniker</value>
|
||||
</data>
|
||||
<data name="Procedure_" xml:space="preserve">
|
||||
<value>测试程序 / Procedure :</value>
|
||||
<data name="Failed" xml:space="preserve">
|
||||
<value>NiO</value>
|
||||
</data>
|
||||
<data name="Purchase_order_" xml:space="preserve">
|
||||
<value>采购订单 / Purchase order :</value>
|
||||
<data name="Passed" xml:space="preserve">
|
||||
<value>iO</value>
|
||||
</data>
|
||||
<data name="Tester_" xml:space="preserve">
|
||||
<value>测试者 / Tester :</value>
|
||||
<data name="Error" xml:space="preserve">
|
||||
<value>Fehler</value>
|
||||
</data>
|
||||
<data name="Cannot_open_DB_Cause_0" xml:space="preserve">
|
||||
<value>Datenbank kann nicht geöffnet.\\r\\nUrsache:\\r\\n{0}</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -0,0 +1,153 @@
|
||||
<?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>
|
||||
<data name="Administrator" xml:space="preserve">
|
||||
<value>Amministratore</value>
|
||||
</data>
|
||||
<data name="Calibration_Specialist" xml:space="preserve">
|
||||
<value>esperto in calibrazione</value>
|
||||
</data>
|
||||
<data name="Head_of_Lab" xml:space="preserve">
|
||||
<value>capo di laboratorio</value>
|
||||
</data>
|
||||
<data name="Maintenance_Specialist" xml:space="preserve">
|
||||
<value>esperto di manutenzione</value>
|
||||
</data>
|
||||
<data name="Metrologist" xml:space="preserve">
|
||||
<value>metrologo</value>
|
||||
</data>
|
||||
<data name="Tester" xml:space="preserve">
|
||||
<value>tester</value>
|
||||
</data>
|
||||
<data name="Testing_Specialist" xml:space="preserve">
|
||||
<value>esperto di prove </value>
|
||||
</data>
|
||||
<data name="Failed" xml:space="preserve">
|
||||
<value>NOK</value>
|
||||
</data>
|
||||
<data name="Passed" xml:space="preserve">
|
||||
<value>ok</value>
|
||||
</data>
|
||||
<data name="Cannot_open_DB_Cause_0" xml:space="preserve">
|
||||
<value>Impossibile aprire il database\\r\\nCause:\\r\\n{0}</value>
|
||||
</data>
|
||||
<data name="Error" xml:space="preserve">
|
||||
<value>Errore</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
@@ -117,32 +117,37 @@
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="languageLabel.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>12, 13</value>
|
||||
<data name="Administrator" xml:space="preserve">
|
||||
<value>Administrator</value>
|
||||
</data>
|
||||
<data name="languageLabel.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>47, 13</value>
|
||||
<data name="Calibration_Specialist" xml:space="preserve">
|
||||
<value>Specjalista ds. kalibracji</value>
|
||||
</data>
|
||||
<data name="languageLabel.Text" xml:space="preserve">
|
||||
<value>Sprache</value>
|
||||
<data name="Head_of_Lab" xml:space="preserve">
|
||||
<value>Kierownik Laboratorium</value>
|
||||
</data>
|
||||
<data name="okButton.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>271, 13</value>
|
||||
<data name="Maintenance_Specialist" xml:space="preserve">
|
||||
<value>Konserwator</value>
|
||||
</data>
|
||||
<data name="okButton.Text" xml:space="preserve">
|
||||
<value>&OK</value>
|
||||
<data name="Metrologist" xml:space="preserve">
|
||||
<value>Metrolog</value>
|
||||
</data>
|
||||
<data name="cancelButton.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>271, 52</value>
|
||||
<data name="Tester" xml:space="preserve">
|
||||
<value>Pracownik przeprowadzający testy</value>
|
||||
</data>
|
||||
<data name="cancelButton.Text" xml:space="preserve">
|
||||
<value>&Abbrechen</value>
|
||||
<data name="Testing_Specialist" xml:space="preserve">
|
||||
<value>Specjalista ds. testów</value>
|
||||
</data>
|
||||
<data name="languageListBox.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>89, 13</value>
|
||||
<data name="Failed" xml:space="preserve">
|
||||
<value>Niepowodzenie</value>
|
||||
</data>
|
||||
<data name="$this.Text" xml:space="preserve">
|
||||
<value>Sprache wählen</value>
|
||||
<data name="Passed" xml:space="preserve">
|
||||
<value>OK</value>
|
||||
</data>
|
||||
<data name="Cannot_open_DB_Cause_0" xml:space="preserve">
|
||||
<value>Nie można otworzyć \\r\\nCause:\\r\\n{0}</value>
|
||||
</data>
|
||||
<data name="Error" xml:space="preserve">
|
||||
<value>Błąd</value>
|
||||
</data>
|
||||
</root>
|
||||
+25
-17
@@ -117,29 +117,37 @@
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="label1.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>75, 13</value>
|
||||
<data name="Administrator" xml:space="preserve">
|
||||
<value>Administrator</value>
|
||||
</data>
|
||||
<data name="label1.Text" xml:space="preserve">
|
||||
<value>Benutzername</value>
|
||||
<data name="Calibration_Specialist" xml:space="preserve">
|
||||
<value>Calibration Specialist</value>
|
||||
</data>
|
||||
<data name="label2.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>50, 13</value>
|
||||
<data name="Head_of_Lab" xml:space="preserve">
|
||||
<value>Head of Lab</value>
|
||||
</data>
|
||||
<data name="label2.Text" xml:space="preserve">
|
||||
<value>Passwort</value>
|
||||
<data name="Maintenance_Specialist" xml:space="preserve">
|
||||
<value>Maintenance Specialist</value>
|
||||
</data>
|
||||
<data name="label3.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>52, 13</value>
|
||||
<data name="Metrologist" xml:space="preserve">
|
||||
<value>Metrologist</value>
|
||||
</data>
|
||||
<data name="label3.Text" xml:space="preserve">
|
||||
<value>Prüfstand</value>
|
||||
<data name="Tester" xml:space="preserve">
|
||||
<value>Tester</value>
|
||||
</data>
|
||||
<data name="cancelButton.Text" xml:space="preserve">
|
||||
<value>Abbrechen</value>
|
||||
<data name="Testing_Specialist" xml:space="preserve">
|
||||
<value>Testing Specialist</value>
|
||||
</data>
|
||||
<data name="$this.Text" xml:space="preserve">
|
||||
<value>Anmelden am Prüfstand</value>
|
||||
<data name="Failed" xml:space="preserve">
|
||||
<value>NOK</value>
|
||||
</data>
|
||||
<data name="Passed" xml:space="preserve">
|
||||
<value>OK</value>
|
||||
</data>
|
||||
<data name="Cannot_open_DB_Cause_0" xml:space="preserve">
|
||||
<value>Cannot open database.\\r\\nCause:\\r\\n{0}</value>
|
||||
</data>
|
||||
<data name="Error" xml:space="preserve">
|
||||
<value>Error</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -0,0 +1,153 @@
|
||||
<?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>
|
||||
<data name="Administrator" xml:space="preserve">
|
||||
<value>Администратор</value>
|
||||
</data>
|
||||
<data name="Calibration_Specialist" xml:space="preserve">
|
||||
<value>Специалист по калибровке</value>
|
||||
</data>
|
||||
<data name="Head_of_Lab" xml:space="preserve">
|
||||
<value>Руководитель лаборатории</value>
|
||||
</data>
|
||||
<data name="Maintenance_Specialist" xml:space="preserve">
|
||||
<value>Специалист по техобслуживанию</value>
|
||||
</data>
|
||||
<data name="Metrologist" xml:space="preserve">
|
||||
<value>Метролог</value>
|
||||
</data>
|
||||
<data name="Tester" xml:space="preserve">
|
||||
<value>Контролер</value>
|
||||
</data>
|
||||
<data name="Testing_Specialist" xml:space="preserve">
|
||||
<value>Специалист по тестированию</value>
|
||||
</data>
|
||||
<data name="Failed" xml:space="preserve">
|
||||
<value>NOK</value>
|
||||
</data>
|
||||
<data name="Passed" xml:space="preserve">
|
||||
<value>OK</value>
|
||||
</data>
|
||||
<data name="Cannot_open_DB_Cause_0" xml:space="preserve">
|
||||
<value>Не удается открыть БД.\\r\\nCause:\\r\\n{0}</value>
|
||||
</data>
|
||||
<data name="Error" xml:space="preserve">
|
||||
<value>Ошибка</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -0,0 +1,128 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 1.3
|
||||
|
||||
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">1.3</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1">this is my long string</data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
[base64 mime encoded serialized .NET Framework object]
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
[base64 mime encoded string representing a byte array form of the .NET Framework object]
|
||||
</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.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:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<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" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
</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>1.3</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Administrator" xml:space="preserve">
|
||||
<value>管理员</value>
|
||||
</data>
|
||||
<data name="Calibration_Specialist" xml:space="preserve">
|
||||
<value>校准专员</value>
|
||||
</data>
|
||||
<data name="Failed" xml:space="preserve">
|
||||
<value>NOK</value>
|
||||
</data>
|
||||
<data name="Head_of_Lab" xml:space="preserve">
|
||||
<value>实验室负责人</value>
|
||||
</data>
|
||||
<data name="Maintenance_Specialist" xml:space="preserve">
|
||||
<value>维护专员</value>
|
||||
</data>
|
||||
<data name="Metrologist" xml:space="preserve">
|
||||
<value>计量者</value>
|
||||
</data>
|
||||
<data name="Passed" xml:space="preserve">
|
||||
<value>好</value>
|
||||
</data>
|
||||
<data name="Tester" xml:space="preserve">
|
||||
<value>测试仪</value>
|
||||
</data>
|
||||
<data name="Testing_Specialist" xml:space="preserve">
|
||||
<value>测试专员</value>
|
||||
</data>
|
||||
</root>
|
||||
+478
@@ -0,0 +1,478 @@
|
||||
///
|
||||
/// Copyright (c) 2016-2018 Sensus Slovensko a.s.
|
||||
///
|
||||
using System;
|
||||
using System.Reflection;
|
||||
using Config.Entities;
|
||||
|
||||
namespace Config
|
||||
{
|
||||
public enum Unit
|
||||
{
|
||||
[Description("---")] None,
|
||||
|
||||
[Description("imp.")] pulse,
|
||||
#if LANG_PL
|
||||
[Description("stopień")] degree,
|
||||
#else
|
||||
[Description("degree")] degree,
|
||||
#endif
|
||||
[Description("l")] l, /// * 1 liter
|
||||
[Description("dm3")] dm3, /// 1 dm3 = 1 liter
|
||||
[Description("m3")] m3, /// 1000 l
|
||||
[Description("gal(UK)")] gal_UK, /// 1 gal(UK) = 4.54609 l
|
||||
[Description("gal(US)")] gal_US, /// 1 gal(US) = 3.78541178 l
|
||||
|
||||
[Description("l/h")] lph, /// 1 liter/h
|
||||
[Description("m3/h")] m3ph, /// * 1 m3/h = 1000 l/h
|
||||
|
||||
[Description("g")] g, /// 0.001 kg
|
||||
[Description("kg")] kg, /// * 1 kilogram
|
||||
[Description("t")] t, /// 1000 kg
|
||||
[Description("lb")] lb, /// 0.45359237 kg
|
||||
|
||||
[Description("s")] s, /// * 1 second
|
||||
[Description("min")] min, /// 1 min = 60 s
|
||||
[Description("hr")] hour, /// 1 hour = 60 min = 3600 s
|
||||
[Description("ms")] ms, /// 1 ms = 0.001 s
|
||||
|
||||
[Description("°C")] C, /// * degree Celsius (°C)
|
||||
[Description("°F")] F, /// degree Fahrenheit
|
||||
[Description("K")] K, /// degree Kelvin
|
||||
|
||||
[Description("Pa")] Pa, /// 1 Pa = 0.01 hPa
|
||||
[Description("hPa")] hPa, /// 1 hPa = 100 Pa
|
||||
[Description("kPa")] kPa, /// 1 kPa = 10 HPa
|
||||
[Description("MPa")] MPa, /// 1 MPa = 10000 hPa
|
||||
[Description("mbar")] mbar, /// 1 mbar = 1 hPa = 100 Pa
|
||||
[Description("bar")] bar, /// * 1 Bar = 1000 mbar = 0.1 MPa = 100000 Pa
|
||||
[Description("inHg")] inHg, /// 1 inHg = 33.864 hPa
|
||||
|
||||
[Description("R%")] RPct, /// * 1 R%
|
||||
|
||||
[Description("%")] Pct, /// * 1 %
|
||||
[Description("promile")] Promile, /// 1 promile = 0.1 %
|
||||
|
||||
[Description("mm")] mm, /// * 1 millimeter
|
||||
[Description("cm")] cm, /// 1 cm = 10 mm
|
||||
[Description("m")] m, /// 1 m = 1000 mm
|
||||
[Description("in")] inch, /// 1 inch = 25.4 mm
|
||||
|
||||
[Description("kg/m3")] kgpm3, /// * 1 kg/m3 = 0.001 kg/l
|
||||
[Description("kg/l")] kgpl, /// 1 kg/l = 1000 kg/m3
|
||||
|
||||
[Description("J")] J, /// * 1 Joul
|
||||
[Description("kJ")] kJ, /// 1 kJ = 1000 J
|
||||
[Description("MJ")] MJ, /// 1 MJ = 1000000 J
|
||||
[Description("Wh")] Wh, /// 1 Wh = 3600 J
|
||||
[Description("kWh")] kWh, /// 1 kWh = 3600000 J
|
||||
[Description("MWh")] MWh, /// 1 MWh = 3600000000 J
|
||||
|
||||
#if LANG_PL
|
||||
[Description("imp/l")] ppl, /// * 1 pulse/l
|
||||
[Description("imp/dm3")] ppdm3, /// * 1 pulse/dm3
|
||||
[Description("stopień/l")] degpl, /// * 1 degree/l
|
||||
[Description("stopień/dm3")] degpdm3, /// * 1 degree/dm3
|
||||
[Description("l/imp")] lpp, /// * 1 l/pulse
|
||||
[Description("dm3/imp")] dm3pp, /// * 1 dm3/pulse
|
||||
[Description("l/stopień")] lpdeg, /// * 1 l/degree
|
||||
[Description("dm3/stopień")] dm3pdeg, /// * 1 dm3/degree
|
||||
#else
|
||||
[Description("pulse/l")] ppl, /// * 1 pulse/l
|
||||
[Description("pulse/dm3")] ppdm3, /// * 1 pulse/dm3
|
||||
[Description("degree/l")] degpl, /// * 1 degree/l
|
||||
[Description("degree/dm3")] degpdm3, /// * 1 degree/dm3
|
||||
[Description("l/pulse")] lpp, /// * 1 l/pulse
|
||||
[Description("dm3/pulse")] dm3pp, /// * 1 dm3/pulse
|
||||
[Description("l/degree")] lpdeg, /// * 1 l/degree
|
||||
[Description("dm3/degree")] dm3pdeg, /// * 1 dm3/degree
|
||||
#endif
|
||||
///
|
||||
[Description("pulse/kWh")] ppkWh, /// * 1 pulse/kWh
|
||||
[Description("kWh/pulse")] kWhpp, /// * 1 kWh/pulse
|
||||
|
||||
Count
|
||||
}
|
||||
|
||||
public enum Quantity
|
||||
{
|
||||
/// Quantities with units and conversions (double -> double)
|
||||
#if LANG_DE
|
||||
[Description("Volumen")] Volume,
|
||||
[Description("Durchfluss")] Flow,
|
||||
[Description("Masse")] Mass,
|
||||
[Description("Zeit")] Time,
|
||||
[Description("Temperatur")] Temperature,
|
||||
[Description("Druck")] Pressure,
|
||||
[Description("Feuchtigkeit")] Humidity,
|
||||
[Description("Fehler")] Error,
|
||||
[Description("Länge")] Length,
|
||||
[Description("Dichte")] Density,
|
||||
[Description("Energie")] Energy,
|
||||
[Description("Impulse")] Pulses,
|
||||
[Description("Impulse/l")] PulsePerLtr,
|
||||
[Description("Impulse/kWh")] PulsePerKWh,
|
||||
|
||||
/// Quantities without units and conversions
|
||||
[Description("Nummer")] Number,
|
||||
[Description("Text")] String,
|
||||
[Description("Boolean")] Boolean,
|
||||
[Description("Datum und Uhrzeit")] DateTime,
|
||||
#elif LANG_PL
|
||||
[Description("Objętość")] Volume,
|
||||
[Description("Przepływ")] Flow,
|
||||
[Description("Masa")] Mass,
|
||||
[Description("Czas")] Time,
|
||||
[Description("Temperatura")] Temperature,
|
||||
[Description("Ciśnienie")] Pressure,
|
||||
[Description("Wilgotność")] Humidity,
|
||||
[Description("Błąd")] Error,
|
||||
[Description("Długość")] Length,
|
||||
[Description("Gęstość")] Density,
|
||||
[Description("Energia")] Energy,
|
||||
[Description("Impulsy")] Pulses,
|
||||
[Description("Impulsy/litr")] PulsePerLtr,
|
||||
[Description("Impulsy/kWh")] PulsePerKWh,
|
||||
|
||||
/// Quantities without units and conversions
|
||||
[Description("Numer")] Number,
|
||||
[Description("Tekst")] String,
|
||||
[Description("Boolean")] Boolean,
|
||||
[Description("Data i czas")] DateTime,
|
||||
#elif LANG_CS
|
||||
[Description("Objem")] Volume,
|
||||
[Description("Průtok")] Flow,
|
||||
[Description("Hmotnost")] Mass,
|
||||
[Description("Čas")] Time,
|
||||
[Description("Teplota")] Temperature,
|
||||
[Description("Tlak")] Pressure,
|
||||
[Description("Vlhkost")] Humidity,
|
||||
[Description("Chyba")] Error,
|
||||
[Description("Délka")] Length,
|
||||
[Description("Hustota")] Density,
|
||||
[Description("Energie")] Energy,
|
||||
[Description("Pulzy")] Pulses,
|
||||
[Description("Pulzy/litr")] PulsePerLtr,
|
||||
[Description("Pulzy/kWh")] PulsePerKWh,
|
||||
|
||||
/// Quantities without units and conversions
|
||||
[Description("Počet")] Number,
|
||||
[Description("Text")] String,
|
||||
[Description("Boolean")] Boolean,
|
||||
[Description("Datum a čas")] DateTime,
|
||||
#elif LANG_IT
|
||||
[Description("Volume")] Volume,
|
||||
[Description("Flusso")] Flow,
|
||||
[Description("Massa")] Mass,
|
||||
[Description("Tempo")] Time,
|
||||
[Description("Temperatura")] Temperature,
|
||||
[Description("Pressione")] Pressure,
|
||||
[Description("Umidità")] Humidity,
|
||||
[Description("Errore")] Error,
|
||||
[Description("Lungezza")] Length,
|
||||
[Description("Densità")] Density,
|
||||
[Description("Energia")] Energy,
|
||||
[Description("Impulso")] Pulses,
|
||||
[Description("Impulso/litro")] PulsePerLtr,
|
||||
[Description("Impulso/kWh")] PulsePerKWh,
|
||||
|
||||
/// Quantities without units and conversions
|
||||
[Description("Numero")] Number,
|
||||
[Description("Stringa")] String,
|
||||
[Description("Boolean")] Boolean,
|
||||
[Description("Data e ora")] DateTime,
|
||||
#else
|
||||
[Description("Volume")] Volume,
|
||||
[Description("Flow")] Flow,
|
||||
[Description("Mass")] Mass,
|
||||
[Description("Time")] Time,
|
||||
[Description("Temperature")] Temperature,
|
||||
[Description("Pressure")] Pressure,
|
||||
[Description("Humidity")] Humidity,
|
||||
[Description("Error")] Error,
|
||||
[Description("Length")] Length,
|
||||
[Description("Density")] Density,
|
||||
[Description("Energy")] Energy,
|
||||
[Description("Pulses")] Pulses,
|
||||
[Description("Pulses/liter")] PulsePerLtr,
|
||||
[Description("Pulses/kWh")] PulsePerKWh,
|
||||
|
||||
/// Quantities without units and conversions
|
||||
[Description("Number")] Number,
|
||||
[Description("String")] String,
|
||||
[Description("Boolean")] Boolean,
|
||||
[Description("Date and time")] DateTime,
|
||||
#endif
|
||||
Count,
|
||||
}
|
||||
|
||||
public static class Units
|
||||
{
|
||||
public static bool IsUnitless(Quantity quantity)
|
||||
{
|
||||
return quantity >= Quantity.Number;
|
||||
}
|
||||
|
||||
public static bool IsDefaultUnit(Unit unit)
|
||||
{
|
||||
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.J || unit == Unit.ppl || unit == Unit.ppkWh;
|
||||
}
|
||||
|
||||
public static bool IsQuantity(Unit units, Quantity quantity)
|
||||
{
|
||||
return (quantity == GetQuantity(units));
|
||||
}
|
||||
|
||||
public static Quantity GetQuantity(Unit units)
|
||||
{
|
||||
switch (units)
|
||||
{
|
||||
case Unit.pulse:
|
||||
case Unit.degree:
|
||||
return Config.Quantity.Pulses;
|
||||
|
||||
case Unit.l:
|
||||
case Unit.dm3:
|
||||
case Unit.m3:
|
||||
case Unit.gal_UK:
|
||||
case Unit.gal_US:
|
||||
return Config.Quantity.Volume;
|
||||
|
||||
case Unit.lph:
|
||||
case Unit.m3ph:
|
||||
return Config.Quantity.Flow;
|
||||
|
||||
case Unit.g:
|
||||
case Unit.kg:
|
||||
case Unit.t:
|
||||
case Unit.lb:
|
||||
return Config.Quantity.Mass;
|
||||
|
||||
case Unit.s:
|
||||
case Unit.min:
|
||||
case Unit.hour:
|
||||
case Unit.ms:
|
||||
return Config.Quantity.Time;
|
||||
|
||||
case Unit.C:
|
||||
case Unit.F:
|
||||
case Unit.K:
|
||||
return Config.Quantity.Temperature;
|
||||
|
||||
case Unit.Pa:
|
||||
case Unit.hPa:
|
||||
case Unit.mbar:
|
||||
case Unit.kPa:
|
||||
case Unit.bar:
|
||||
case Unit.MPa:
|
||||
case Unit.inHg:
|
||||
return Config.Quantity.Pressure;
|
||||
|
||||
case Unit.RPct:
|
||||
return Config.Quantity.Humidity;
|
||||
|
||||
case Unit.Pct:
|
||||
case Unit.Promile:
|
||||
return Config.Quantity.Error;
|
||||
|
||||
case Unit.mm:
|
||||
case Unit.cm:
|
||||
case Unit.m:
|
||||
case Unit.inch:
|
||||
return Config.Quantity.Length;
|
||||
|
||||
case Unit.kgpm3:
|
||||
case Unit.kgpl:
|
||||
return Config.Quantity.Density;
|
||||
|
||||
case Unit.J:
|
||||
case Unit.kJ:
|
||||
case Unit.MJ:
|
||||
case Unit.Wh:
|
||||
case Unit.kWh:
|
||||
case Unit.MWh:
|
||||
return Config.Quantity.Energy;
|
||||
|
||||
case Unit.ppl:
|
||||
case Unit.ppdm3:
|
||||
case Unit.degpl:
|
||||
case Unit.degpdm3:
|
||||
case Unit.lpp:
|
||||
case Unit.dm3pp:
|
||||
case Unit.lpdeg:
|
||||
case Unit.dm3pdeg:
|
||||
return Config.Quantity.PulsePerLtr;
|
||||
|
||||
case Unit.ppkWh:
|
||||
case Unit.kWhpp:
|
||||
return Config.Quantity.PulsePerKWh;
|
||||
|
||||
default:
|
||||
return Config.Quantity.Number;
|
||||
}
|
||||
}
|
||||
|
||||
public static bool IsVolume(Unit units) { return IsQuantity(units, Config.Quantity.Volume); }
|
||||
public static bool IsFlow(Unit units) { return IsQuantity(units, Config.Quantity.Flow); }
|
||||
public static bool IsMass(Unit units) { return IsQuantity(units, Config.Quantity.Mass); }
|
||||
public static bool IsTime(Unit units) { return IsQuantity(units, Config.Quantity.Time); }
|
||||
public static bool IsTemperature(Unit units) { return IsQuantity(units, Config.Quantity.Temperature); }
|
||||
public static bool IsPressure(Unit units) { return IsQuantity(units, Config.Quantity.Pressure); }
|
||||
public static bool IsHumidity(Unit units) { return IsQuantity(units, Config.Quantity.Humidity); }
|
||||
public static bool IsError(Unit units) { return IsQuantity(units, Config.Quantity.Error); }
|
||||
public static bool IsLength(Unit units) { return IsQuantity(units, Config.Quantity.Length); }
|
||||
public static bool IsDensity(Unit units) { return IsQuantity(units, Config.Quantity.Density); }
|
||||
public static bool IsEnergy(Unit units) { return IsQuantity(units, Config.Quantity.Energy); }
|
||||
public static bool IsPulses(Unit units) { return IsQuantity(units, Config.Quantity.Pulses); }
|
||||
public static bool IsPulsePerLtr(Unit units) { return IsQuantity(units, Config.Quantity.PulsePerLtr); }
|
||||
public static bool IsPulsePerKWh(Unit units) { return IsQuantity(units, Config.Quantity.PulsePerKWh); }
|
||||
|
||||
|
||||
public static double ConvertTo(Unit units, double v)
|
||||
{
|
||||
switch (units)
|
||||
{
|
||||
/// Volume: internal representation in l
|
||||
case Unit.dm3:
|
||||
case Unit.l: return v; /// 1 liter
|
||||
case Unit.m3: return 0.001 * v; /// 1 m3 = 1000 l
|
||||
case Unit.gal_UK: return 0.21996925 * v; /// 1 gal(UK) = 4.54609 l
|
||||
case Unit.gal_US: return 0.26417205 * v; /// 1 gal(US) = 3.78541178 l
|
||||
|
||||
/// Flow: internal representation in m3/h
|
||||
case Unit.lph: return 1000 * v; /// 1 liter/h
|
||||
case Unit.m3ph: return v; /// 1 m3/h = 1000 l/h
|
||||
|
||||
/// Mass: internal representation in kg
|
||||
case Unit.g: return 1000 * v; /// 1 g = 0.001 kg
|
||||
case Unit.kg: return v; /// 1 kilogram
|
||||
case Unit.t: return 0.001 * v; /// 1 t = 1000 kg
|
||||
case Unit.lb: return 2.2046226 * v; /// 1 lb = 0.45359237 kg
|
||||
|
||||
/// Time or duration: internal representation in seconds [s]
|
||||
case Unit.s: return v;
|
||||
case Unit.min: return v / 60;
|
||||
case Unit.hour: return v / 3600;
|
||||
case Unit.ms: return 1000 * v;
|
||||
|
||||
/// Temperature: internal representation in °C
|
||||
case Unit.C: return v; /// degree Celsius (°C)
|
||||
case Unit.F: return 1.8 * v + 32; /// degree Fahrenheit
|
||||
case Unit.K: return v + 273.15; /// degree Kelvin
|
||||
|
||||
/// Pressure: internal representation in bar = 0.1 MPa
|
||||
case Unit.Pa: return 100000 * v; /// 1 hPa = 100 Pa
|
||||
case Unit.hPa: return 1000 * v; /// 1 hPa = 100 Pa
|
||||
case Unit.mbar: return 1000 * v; /// 1 mbar = 1 hPa = 100 Pa
|
||||
case Unit.kPa: return 100 * v; /// 1 kPa = 10 HPa
|
||||
case Unit.bar: return v; /// 1 bar = 1000 mbar = 100000 Pa
|
||||
case Unit.MPa: return 0.1 * v; /// 1 MPa = 10000 hPa
|
||||
case Unit.inHg: return 29.53 * v; /// 1 inHg = 33.864 hPa
|
||||
|
||||
/// Error: internal representation in %
|
||||
case Unit.Pct: return v; /// 1 %
|
||||
case Unit.Promile: return 10 * v; /// 1 promile = 0.1 %
|
||||
|
||||
/// Diameter, length: internal representation in mm
|
||||
case Unit.mm: return v; /// 1 mm
|
||||
case Unit.cm: return 0.1 * v; /// 1 cm = 10 mm
|
||||
case Unit.m: return 0.001 * v; /// 1 m = 1000 mm
|
||||
case Unit.inch: return v / 25.4; /// 1 inch = 25.4 mm
|
||||
|
||||
/// Density: internal representation in kg/m3
|
||||
case Unit.kgpm3: return v;
|
||||
case Unit.kgpl: return 0.001 * v;
|
||||
|
||||
/// Energy, internal representation in Joul
|
||||
case Unit.J: return v; /// 1 Joul
|
||||
case Unit.kJ: return 0.001 * v; /// 1 kJ = 1000 J
|
||||
case Unit.MJ: return 0.000001 * v; /// 1 kJ = 1000000 J
|
||||
case Unit.Wh: return v / 3600.0; /// 1 Wh = 3600 J
|
||||
case Unit.kWh: return v / 3600000.0; /// 1 kWh = 3600000 J
|
||||
case Unit.MWh: return v / 3600000000.0;/// 1 MWh = 3600000000 J
|
||||
|
||||
case Unit.kWhpp:
|
||||
case Unit.lpp:
|
||||
case Unit.dm3pp:
|
||||
case Unit.lpdeg:
|
||||
case Unit.dm3pdeg: return ((v <= float.Epsilon) ? 0 : 1 / v);
|
||||
|
||||
default: return v;
|
||||
}
|
||||
}
|
||||
|
||||
public static double ConvertFrom(Unit units, double v)
|
||||
{
|
||||
switch (units)
|
||||
{
|
||||
/// Volume: internal representation in l
|
||||
case Unit.dm3:
|
||||
case Unit.l: return v; /// 1 liter
|
||||
case Unit.m3: return 1000 * v; /// 1000 l
|
||||
case Unit.gal_UK: return 4.54609 * v; /// 1 gal(UK) = 4.54609 l
|
||||
case Unit.gal_US: return 3.78541178 * v; /// 1 gal(US) = 3.78541178 l
|
||||
|
||||
/// Flow: internal representation in m3/h
|
||||
case Unit.lph: return 0.001 * v; /// 1 liter/h
|
||||
case Unit.m3ph: return v; /// 1 m3/h = 1000 l/h
|
||||
|
||||
/// Mass: internal representation in kg
|
||||
case Unit.g: return 0.001 * v; /// 1 g = 0.001 kg
|
||||
case Unit.kg: return v; /// 1 kilogram
|
||||
case Unit.t: return 1000 * v; /// 1 t = 1000 kg
|
||||
case Unit.lb: return 0.45359237 * v; /// 1 lb = 0.45359237 kg
|
||||
|
||||
/// Time or duration: internal representation in seconds [s]
|
||||
case Unit.s: return v;
|
||||
case Unit.min: return 60 * v;
|
||||
case Unit.hour: return 3600 * v;
|
||||
case Unit.ms: return v / 1000;
|
||||
|
||||
/// Temperature: internal representation in °C
|
||||
case Unit.C: return v; /// degree Celsius (°C)
|
||||
case Unit.F: return 5 * (v-32) / 9; /// degree Fahrenheit
|
||||
case Unit.K: return v - 273.15; /// degree Kelvin
|
||||
|
||||
/// Pressure: internal representation in bar = 0.1 MPa
|
||||
case Unit.Pa: return 0.00001 * v; /// 1 hPa = 100 Pa
|
||||
case Unit.hPa: return 0.001 * v; /// 1 hPa = 100 Pa
|
||||
case Unit.mbar: return 0.001 * v; /// 1 mbar = 1 hPa = 100 Pa
|
||||
case Unit.kPa: return 0.01 * v; /// 1 kPa = 10 HPa
|
||||
case Unit.bar: return v; /// 1 bar = 1000 mbar = 100000 Pa
|
||||
case Unit.MPa: return 10 * v; /// 1 MPa = 10000 hPa
|
||||
case Unit.inHg: return 0.033864 * v; /// 1 inHg = 33.864 hPa
|
||||
|
||||
/// Error: internal representation in %
|
||||
case Unit.Pct: return v; /// 1 %
|
||||
case Unit.Promile: return 0.1 * v; /// 1 promile = 0.1 %
|
||||
|
||||
/// Diameter, length: internal representation in mm
|
||||
case Unit.mm: return v; /// 1 mm
|
||||
case Unit.cm: return 10 * v; /// 1 cm = 10 mm
|
||||
case Unit.m: return 1000 * v; /// 1 m = 1000 mm
|
||||
case Unit.inch: return 25.4 * v; /// 1 inch = 25.4 mm
|
||||
|
||||
/// Density: internal representation in kg/m3
|
||||
case Unit.kgpm3: return v;
|
||||
case Unit.kgpl: return 1000 * v;
|
||||
|
||||
/// Energy, internal representation in Joul
|
||||
case Unit.J: return v; /// 1 Joul
|
||||
case Unit.kJ: return 1000 * v; /// 1 kJ = 1000 J
|
||||
case Unit.MJ: return 1000000 * v; /// 1 kJ = 1000000 J
|
||||
case Unit.Wh: return 3600 * v; /// 1 Wh = 3600 J
|
||||
case Unit.kWh: return 3600000 * v; /// 1 kWh = 3600000 J
|
||||
case Unit.MWh: return 3600000000 * v; /// 1 kWh = 3600000000 J
|
||||
|
||||
case Unit.kWhpp:
|
||||
case Unit.lpp:
|
||||
case Unit.dm3pp:
|
||||
case Unit.lpdeg:
|
||||
case Unit.dm3pdeg: return ((v == 0) ? 0 : 1 / v);
|
||||
|
||||
default: return v;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Config
|
||||
{
|
||||
public static class Utils
|
||||
{
|
||||
public static string SignificantDigitsToFmt(double value, int sigDigits)
|
||||
{
|
||||
if (sigDigits == 5)
|
||||
{
|
||||
if (value >= 9999.5 || value < -9999.5) return "F0";
|
||||
else if (value >= 999.95 || value < -999.95) return "F1";
|
||||
else if (value >= 99.995 || value < -99.995) return "F2";
|
||||
else if (value >= 9.9995 || value < -9.9995) return "F3";
|
||||
else if (value >= 0.99995 || value < -0.99995) return "F4";
|
||||
else if (value >= 0.099995 || value < -0.099995) return "F5";
|
||||
else if (value >= 0.0099995 || value < -0.0099995) return "F6";
|
||||
else if (value >= 0.00099995 || value < -0.00099995) return "F7";
|
||||
else if (value >= 0.000099995 || value < -0.000099995) return "F8";
|
||||
else return "F9";
|
||||
}
|
||||
else if (sigDigits == 4)
|
||||
{
|
||||
if (value >= 999.5 || value < -999.5) return "F0";
|
||||
else if (value >= 99.95 || value < -99.95) return "F1";
|
||||
else if (value >= 9.995 || value < -9.995) return "F2";
|
||||
else if (value >= 0.9995 || value < -0.9995) return "F3";
|
||||
else if (value >= 0.09995 || value < -0.09995) return "F4";
|
||||
else if (value >= 0.009995 || value < -0.009995) return "F5";
|
||||
else if (value >= 0.0009995 || value < -0.0009995) return "F6";
|
||||
else if (value >= 0.00009995 || value < -0.00009995) return "F7";
|
||||
else return "F8";
|
||||
}
|
||||
else if (sigDigits == 3)
|
||||
{
|
||||
if (value >= 99.5 || value < -99.5) return "F0";
|
||||
else if (value >= 9.95 || value < -9.95) return "F1";
|
||||
else if (value >= 0.995 || value < -0.995) return "F2";
|
||||
else if (value >= 0.0995 || value < -0.0995) return "F3";
|
||||
else if (value >= 0.00995 || value < -0.00995) return "F4";
|
||||
else if (value >= 0.000995 || value < -0.000995) return "F5";
|
||||
else if (value >= 0.0000995 || value < -0.0000995) return "F6";
|
||||
else return "F7";
|
||||
}
|
||||
else if (sigDigits == 2)
|
||||
{
|
||||
if (value >= 9.5 || value < -9.5) return "F0";
|
||||
else if (value >= 0.95 || value < -0.95) return "F1";
|
||||
else if (value >= 0.095 || value < -0.095) return "F2";
|
||||
else if (value >= 0.0095 || value < -0.0095) return "F3";
|
||||
else if (value >= 0.00095 || value < -0.00095) return "F4";
|
||||
else if (value >= 0.000095 || value < -0.000095) return "F5";
|
||||
else return "F6";
|
||||
}
|
||||
else /// if (sigDigits == 1)
|
||||
{
|
||||
if (value >= 0.95 || value < -0.95) return "F0";
|
||||
else if (value >= 0.095 || value < -0.095) return "F1";
|
||||
else if (value >= 0.0095 || value < -0.0095) return "F2";
|
||||
else if (value >= 0.00095 || value < -0.00095) return "F3";
|
||||
else if (value >= 0.000095 || value < -0.000095) return "F4";
|
||||
else return "F5";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
|
||||
<ProductVersion>8.0.30703</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{6D3384DC-4638-4A92-91A8-F39D900377C6}</ProjectGuid>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>DeviceTest</RootNamespace>
|
||||
<AssemblyName>DeviceTest</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<TargetFrameworkProfile>
|
||||
</TargetFrameworkProfile>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
|
||||
<PlatformTarget>x86</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|x86' ">
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<StartupObject>DeviceTest.Program</StartupObject>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="log4net, Version=1.2.12.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\log4net.2.0.2\lib\net40-full\log4net.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.Deployment" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="DeviceTestDlg.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="DeviceTestDlg.Designer.cs">
|
||||
<DependentUpon>DeviceTestDlg.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="LocalSettings.cs" />
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<EmbeddedResource Include="DeviceTestDlg.resx">
|
||||
<DependentUpon>DeviceTestDlg.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="app.config" />
|
||||
<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>
|
||||
<ProjectReference Include="..\Config\Config.csproj">
|
||||
<Project>{743DF7DB-C7B6-42EB-986D-0F485E5588E4}</Project>
|
||||
<Name>Config</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\TBF\TBF.csproj">
|
||||
<Project>{8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48}</Project>
|
||||
<Name>TBF</Name>
|
||||
</ProjectReference>
|
||||
</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>
|
||||
Generated
+584
@@ -0,0 +1,584 @@
|
||||
namespace DeviceTest
|
||||
{
|
||||
partial class DeviceTestDlg
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.parentClassNameComboBox = new System.Windows.Forms.ComboBox();
|
||||
this.classLabel = new System.Windows.Forms.Label();
|
||||
this.nameLabel = new System.Windows.Forms.Label();
|
||||
this.parentNameTextBox = new System.Windows.Forms.TextBox();
|
||||
this.configureParentButton = new System.Windows.Forms.Button();
|
||||
this.startButton = new System.Windows.Forms.Button();
|
||||
this.groupBox1 = new System.Windows.Forms.GroupBox();
|
||||
this.groupBox2 = new System.Windows.Forms.GroupBox();
|
||||
this.configureComponent1Button = new System.Windows.Forms.Button();
|
||||
this.componentNameTextBox = new System.Windows.Forms.TextBox();
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.component1ClassNameComboBox = new System.Windows.Forms.ComboBox();
|
||||
this.radioButton4 = new System.Windows.Forms.RadioButton();
|
||||
this.radioButton3 = new System.Windows.Forms.RadioButton();
|
||||
this.radioButton2 = new System.Windows.Forms.RadioButton();
|
||||
this.radioButton1 = new System.Windows.Forms.RadioButton();
|
||||
this.radioButton0 = new System.Windows.Forms.RadioButton();
|
||||
this.stopButton = new System.Windows.Forms.Button();
|
||||
this.groupBox3 = new System.Windows.Forms.GroupBox();
|
||||
this.configureComponent2Button = new System.Windows.Forms.Button();
|
||||
this.component2NameTextBox = new System.Windows.Forms.TextBox();
|
||||
this.label3 = new System.Windows.Forms.Label();
|
||||
this.label4 = new System.Windows.Forms.Label();
|
||||
this.component2ClassNameComboBox = new System.Windows.Forms.ComboBox();
|
||||
this.radioButton24 = new System.Windows.Forms.RadioButton();
|
||||
this.radioButton23 = new System.Windows.Forms.RadioButton();
|
||||
this.radioButton22 = new System.Windows.Forms.RadioButton();
|
||||
this.radioButton21 = new System.Windows.Forms.RadioButton();
|
||||
this.groupBox4 = new System.Windows.Forms.GroupBox();
|
||||
this.radioButton34 = new System.Windows.Forms.RadioButton();
|
||||
this.radioButton33 = new System.Windows.Forms.RadioButton();
|
||||
this.radioButton32 = new System.Windows.Forms.RadioButton();
|
||||
this.radioButton31 = new System.Windows.Forms.RadioButton();
|
||||
this.groupBox5 = new System.Windows.Forms.GroupBox();
|
||||
this.configureComponent3Button = new System.Windows.Forms.Button();
|
||||
this.component3NameTextBox = new System.Windows.Forms.TextBox();
|
||||
this.label5 = new System.Windows.Forms.Label();
|
||||
this.label6 = new System.Windows.Forms.Label();
|
||||
this.component3ClassNameComboBox = new System.Windows.Forms.ComboBox();
|
||||
this.groupBox1.SuspendLayout();
|
||||
this.groupBox2.SuspendLayout();
|
||||
this.groupBox3.SuspendLayout();
|
||||
this.groupBox4.SuspendLayout();
|
||||
this.groupBox5.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// parentClassNameComboBox
|
||||
//
|
||||
this.parentClassNameComboBox.FormattingEnabled = true;
|
||||
this.parentClassNameComboBox.Location = new System.Drawing.Point(77, 19);
|
||||
this.parentClassNameComboBox.Name = "parentClassNameComboBox";
|
||||
this.parentClassNameComboBox.Size = new System.Drawing.Size(299, 21);
|
||||
this.parentClassNameComboBox.TabIndex = 0;
|
||||
//
|
||||
// classLabel
|
||||
//
|
||||
this.classLabel.AutoSize = true;
|
||||
this.classLabel.Location = new System.Drawing.Point(11, 22);
|
||||
this.classLabel.Name = "classLabel";
|
||||
this.classLabel.Size = new System.Drawing.Size(32, 13);
|
||||
this.classLabel.TabIndex = 1;
|
||||
this.classLabel.Text = "Class";
|
||||
//
|
||||
// nameLabel
|
||||
//
|
||||
this.nameLabel.AutoSize = true;
|
||||
this.nameLabel.Location = new System.Drawing.Point(11, 47);
|
||||
this.nameLabel.Name = "nameLabel";
|
||||
this.nameLabel.Size = new System.Drawing.Size(35, 13);
|
||||
this.nameLabel.TabIndex = 2;
|
||||
this.nameLabel.Text = "Name";
|
||||
//
|
||||
// parentNameTextBox
|
||||
//
|
||||
this.parentNameTextBox.Enabled = false;
|
||||
this.parentNameTextBox.Location = new System.Drawing.Point(77, 44);
|
||||
this.parentNameTextBox.Name = "parentNameTextBox";
|
||||
this.parentNameTextBox.Size = new System.Drawing.Size(299, 20);
|
||||
this.parentNameTextBox.TabIndex = 3;
|
||||
//
|
||||
// configureParentButton
|
||||
//
|
||||
this.configureParentButton.Location = new System.Drawing.Point(395, 19);
|
||||
this.configureParentButton.Name = "configureParentButton";
|
||||
this.configureParentButton.Size = new System.Drawing.Size(73, 45);
|
||||
this.configureParentButton.TabIndex = 4;
|
||||
this.configureParentButton.Text = "Configure";
|
||||
this.configureParentButton.UseVisualStyleBackColor = true;
|
||||
this.configureParentButton.Click += new System.EventHandler(this.configureParentButton_Click);
|
||||
//
|
||||
// startButton
|
||||
//
|
||||
this.startButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.startButton.Location = new System.Drawing.Point(520, 19);
|
||||
this.startButton.Name = "startButton";
|
||||
this.startButton.Size = new System.Drawing.Size(73, 45);
|
||||
this.startButton.TabIndex = 7;
|
||||
this.startButton.Text = "Start";
|
||||
this.startButton.UseVisualStyleBackColor = true;
|
||||
this.startButton.Click += new System.EventHandler(this.startButton_Click);
|
||||
//
|
||||
// groupBox1
|
||||
//
|
||||
this.groupBox1.Controls.Add(this.configureParentButton);
|
||||
this.groupBox1.Controls.Add(this.parentNameTextBox);
|
||||
this.groupBox1.Controls.Add(this.nameLabel);
|
||||
this.groupBox1.Controls.Add(this.classLabel);
|
||||
this.groupBox1.Controls.Add(this.parentClassNameComboBox);
|
||||
this.groupBox1.Location = new System.Drawing.Point(12, 12);
|
||||
this.groupBox1.Name = "groupBox1";
|
||||
this.groupBox1.Size = new System.Drawing.Size(486, 75);
|
||||
this.groupBox1.TabIndex = 8;
|
||||
this.groupBox1.TabStop = false;
|
||||
this.groupBox1.Text = "Parent component";
|
||||
//
|
||||
// groupBox2
|
||||
//
|
||||
this.groupBox2.Controls.Add(this.configureComponent1Button);
|
||||
this.groupBox2.Controls.Add(this.componentNameTextBox);
|
||||
this.groupBox2.Controls.Add(this.label1);
|
||||
this.groupBox2.Controls.Add(this.label2);
|
||||
this.groupBox2.Controls.Add(this.component1ClassNameComboBox);
|
||||
this.groupBox2.Location = new System.Drawing.Point(12, 93);
|
||||
this.groupBox2.Name = "groupBox2";
|
||||
this.groupBox2.Size = new System.Drawing.Size(486, 75);
|
||||
this.groupBox2.TabIndex = 9;
|
||||
this.groupBox2.TabStop = false;
|
||||
this.groupBox2.Text = "Component 1";
|
||||
//
|
||||
// configureComponentButton
|
||||
//
|
||||
this.configureComponent1Button.Location = new System.Drawing.Point(395, 19);
|
||||
this.configureComponent1Button.Name = "configureComponentButton";
|
||||
this.configureComponent1Button.Size = new System.Drawing.Size(73, 45);
|
||||
this.configureComponent1Button.TabIndex = 4;
|
||||
this.configureComponent1Button.Text = "Configure";
|
||||
this.configureComponent1Button.UseVisualStyleBackColor = true;
|
||||
this.configureComponent1Button.Click += new System.EventHandler(this.configureComponent1Button_Click);
|
||||
//
|
||||
// componentNameTextBox
|
||||
//
|
||||
this.componentNameTextBox.Enabled = false;
|
||||
this.componentNameTextBox.Location = new System.Drawing.Point(77, 44);
|
||||
this.componentNameTextBox.Name = "componentNameTextBox";
|
||||
this.componentNameTextBox.Size = new System.Drawing.Size(299, 20);
|
||||
this.componentNameTextBox.TabIndex = 3;
|
||||
//
|
||||
// label1
|
||||
//
|
||||
this.label1.AutoSize = true;
|
||||
this.label1.Location = new System.Drawing.Point(11, 47);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(35, 13);
|
||||
this.label1.TabIndex = 2;
|
||||
this.label1.Text = "Name";
|
||||
//
|
||||
// label2
|
||||
//
|
||||
this.label2.AutoSize = true;
|
||||
this.label2.Location = new System.Drawing.Point(11, 22);
|
||||
this.label2.Name = "label2";
|
||||
this.label2.Size = new System.Drawing.Size(32, 13);
|
||||
this.label2.TabIndex = 1;
|
||||
this.label2.Text = "Class";
|
||||
//
|
||||
// componentClassNameComboBox
|
||||
//
|
||||
this.component1ClassNameComboBox.FormattingEnabled = true;
|
||||
this.component1ClassNameComboBox.Location = new System.Drawing.Point(77, 19);
|
||||
this.component1ClassNameComboBox.Name = "componentClassNameComboBox";
|
||||
this.component1ClassNameComboBox.Size = new System.Drawing.Size(299, 21);
|
||||
this.component1ClassNameComboBox.TabIndex = 0;
|
||||
//
|
||||
// radioButton4
|
||||
//
|
||||
this.radioButton4.AutoSize = true;
|
||||
this.radioButton4.Location = new System.Drawing.Point(13, 118);
|
||||
this.radioButton4.Name = "radioButton4";
|
||||
this.radioButton4.Size = new System.Drawing.Size(51, 17);
|
||||
this.radioButton4.TabIndex = 9;
|
||||
this.radioButton4.TabStop = true;
|
||||
this.radioButton4.Text = "spare";
|
||||
this.radioButton4.UseVisualStyleBackColor = true;
|
||||
this.radioButton4.CheckedChanged += new System.EventHandler(this.radioButton4_CheckedChanged);
|
||||
//
|
||||
// radioButton3
|
||||
//
|
||||
this.radioButton3.AutoSize = true;
|
||||
this.radioButton3.Location = new System.Drawing.Point(13, 95);
|
||||
this.radioButton3.Name = "radioButton3";
|
||||
this.radioButton3.Size = new System.Drawing.Size(51, 17);
|
||||
this.radioButton3.TabIndex = 8;
|
||||
this.radioButton3.TabStop = true;
|
||||
this.radioButton3.Text = "spare";
|
||||
this.radioButton3.UseVisualStyleBackColor = true;
|
||||
this.radioButton3.CheckedChanged += new System.EventHandler(this.radioButton3_CheckedChanged);
|
||||
//
|
||||
// radioButton2
|
||||
//
|
||||
this.radioButton2.AutoSize = true;
|
||||
this.radioButton2.Location = new System.Drawing.Point(13, 72);
|
||||
this.radioButton2.Name = "radioButton2";
|
||||
this.radioButton2.Size = new System.Drawing.Size(51, 17);
|
||||
this.radioButton2.TabIndex = 7;
|
||||
this.radioButton2.TabStop = true;
|
||||
this.radioButton2.Text = "spare";
|
||||
this.radioButton2.UseVisualStyleBackColor = true;
|
||||
this.radioButton2.CheckedChanged += new System.EventHandler(this.radioButton2_CheckedChanged);
|
||||
//
|
||||
// radioButton1
|
||||
//
|
||||
this.radioButton1.AutoSize = true;
|
||||
this.radioButton1.Location = new System.Drawing.Point(13, 49);
|
||||
this.radioButton1.Name = "radioButton1";
|
||||
this.radioButton1.Size = new System.Drawing.Size(106, 17);
|
||||
this.radioButton1.TabIndex = 6;
|
||||
this.radioButton1.TabStop = true;
|
||||
this.radioButton1.Text = "ReadPressureOp";
|
||||
this.radioButton1.UseVisualStyleBackColor = true;
|
||||
this.radioButton1.CheckedChanged += new System.EventHandler(this.radioButton1_CheckedChanged);
|
||||
//
|
||||
// radioButton0
|
||||
//
|
||||
this.radioButton0.AutoSize = true;
|
||||
this.radioButton0.Location = new System.Drawing.Point(13, 26);
|
||||
this.radioButton0.Name = "radioButton0";
|
||||
this.radioButton0.Size = new System.Drawing.Size(94, 17);
|
||||
this.radioButton0.TabIndex = 5;
|
||||
this.radioButton0.TabStop = true;
|
||||
this.radioButton0.Text = "Stop operation";
|
||||
this.radioButton0.UseVisualStyleBackColor = true;
|
||||
this.radioButton0.CheckedChanged += new System.EventHandler(this.radioButton0_CheckedChanged);
|
||||
//
|
||||
// stopButton
|
||||
//
|
||||
this.stopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.stopButton.Location = new System.Drawing.Point(520, 77);
|
||||
this.stopButton.Name = "stopButton";
|
||||
this.stopButton.Size = new System.Drawing.Size(73, 45);
|
||||
this.stopButton.TabIndex = 10;
|
||||
this.stopButton.Text = "Stop";
|
||||
this.stopButton.UseVisualStyleBackColor = true;
|
||||
this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
|
||||
//
|
||||
// groupBox3
|
||||
//
|
||||
this.groupBox3.Controls.Add(this.configureComponent2Button);
|
||||
this.groupBox3.Controls.Add(this.component2NameTextBox);
|
||||
this.groupBox3.Controls.Add(this.label3);
|
||||
this.groupBox3.Controls.Add(this.label4);
|
||||
this.groupBox3.Controls.Add(this.component2ClassNameComboBox);
|
||||
this.groupBox3.Location = new System.Drawing.Point(12, 174);
|
||||
this.groupBox3.Name = "groupBox3";
|
||||
this.groupBox3.Size = new System.Drawing.Size(486, 75);
|
||||
this.groupBox3.TabIndex = 11;
|
||||
this.groupBox3.TabStop = false;
|
||||
this.groupBox3.Text = "Component 2";
|
||||
//
|
||||
// configureComponent2Button
|
||||
//
|
||||
this.configureComponent2Button.Location = new System.Drawing.Point(395, 19);
|
||||
this.configureComponent2Button.Name = "configureComponent2Button";
|
||||
this.configureComponent2Button.Size = new System.Drawing.Size(73, 45);
|
||||
this.configureComponent2Button.TabIndex = 4;
|
||||
this.configureComponent2Button.Text = "Configure";
|
||||
this.configureComponent2Button.UseVisualStyleBackColor = true;
|
||||
this.configureComponent2Button.Click += new System.EventHandler(this.configureComponent2Button_Click);
|
||||
//
|
||||
// component2NameTextBox
|
||||
//
|
||||
this.component2NameTextBox.Enabled = false;
|
||||
this.component2NameTextBox.Location = new System.Drawing.Point(77, 44);
|
||||
this.component2NameTextBox.Name = "component2NameTextBox";
|
||||
this.component2NameTextBox.Size = new System.Drawing.Size(299, 20);
|
||||
this.component2NameTextBox.TabIndex = 3;
|
||||
//
|
||||
// label3
|
||||
//
|
||||
this.label3.AutoSize = true;
|
||||
this.label3.Location = new System.Drawing.Point(11, 47);
|
||||
this.label3.Name = "label3";
|
||||
this.label3.Size = new System.Drawing.Size(35, 13);
|
||||
this.label3.TabIndex = 2;
|
||||
this.label3.Text = "Name";
|
||||
//
|
||||
// label4
|
||||
//
|
||||
this.label4.AutoSize = true;
|
||||
this.label4.Location = new System.Drawing.Point(11, 22);
|
||||
this.label4.Name = "label4";
|
||||
this.label4.Size = new System.Drawing.Size(32, 13);
|
||||
this.label4.TabIndex = 1;
|
||||
this.label4.Text = "Class";
|
||||
//
|
||||
// component2ClassNameComboBox
|
||||
//
|
||||
this.component2ClassNameComboBox.FormattingEnabled = true;
|
||||
this.component2ClassNameComboBox.Location = new System.Drawing.Point(77, 19);
|
||||
this.component2ClassNameComboBox.Name = "component2ClassNameComboBox";
|
||||
this.component2ClassNameComboBox.Size = new System.Drawing.Size(299, 21);
|
||||
this.component2ClassNameComboBox.TabIndex = 0;
|
||||
//
|
||||
// radioButton24
|
||||
//
|
||||
this.radioButton24.AutoSize = true;
|
||||
this.radioButton24.Location = new System.Drawing.Point(212, 118);
|
||||
this.radioButton24.Name = "radioButton24";
|
||||
this.radioButton24.Size = new System.Drawing.Size(51, 17);
|
||||
this.radioButton24.TabIndex = 9;
|
||||
this.radioButton24.TabStop = true;
|
||||
this.radioButton24.Text = "spare";
|
||||
this.radioButton24.UseVisualStyleBackColor = true;
|
||||
this.radioButton24.CheckedChanged += new System.EventHandler(this.radioButton24_CheckedChanged);
|
||||
//
|
||||
// radioButton23
|
||||
//
|
||||
this.radioButton23.AutoSize = true;
|
||||
this.radioButton23.Location = new System.Drawing.Point(212, 95);
|
||||
this.radioButton23.Name = "radioButton23";
|
||||
this.radioButton23.Size = new System.Drawing.Size(51, 17);
|
||||
this.radioButton23.TabIndex = 8;
|
||||
this.radioButton23.TabStop = true;
|
||||
this.radioButton23.Text = "spare";
|
||||
this.radioButton23.UseVisualStyleBackColor = true;
|
||||
this.radioButton23.CheckedChanged += new System.EventHandler(this.radioButton23_CheckedChanged);
|
||||
//
|
||||
// radioButton22
|
||||
//
|
||||
this.radioButton22.AutoSize = true;
|
||||
this.radioButton22.Location = new System.Drawing.Point(212, 72);
|
||||
this.radioButton22.Name = "radioButton22";
|
||||
this.radioButton22.Size = new System.Drawing.Size(51, 17);
|
||||
this.radioButton22.TabIndex = 7;
|
||||
this.radioButton22.TabStop = true;
|
||||
this.radioButton22.Text = "spare";
|
||||
this.radioButton22.UseVisualStyleBackColor = true;
|
||||
this.radioButton22.CheckedChanged += new System.EventHandler(this.radioButton22_CheckedChanged);
|
||||
//
|
||||
// radioButton21
|
||||
//
|
||||
this.radioButton21.AutoSize = true;
|
||||
this.radioButton21.Location = new System.Drawing.Point(212, 49);
|
||||
this.radioButton21.Name = "radioButton21";
|
||||
this.radioButton21.Size = new System.Drawing.Size(106, 17);
|
||||
this.radioButton21.TabIndex = 6;
|
||||
this.radioButton21.TabStop = true;
|
||||
this.radioButton21.Text = "ReadPressureOp";
|
||||
this.radioButton21.UseVisualStyleBackColor = true;
|
||||
this.radioButton21.CheckedChanged += new System.EventHandler(this.radioButton21_CheckedChanged);
|
||||
//
|
||||
// groupBox4
|
||||
//
|
||||
this.groupBox4.Controls.Add(this.radioButton34);
|
||||
this.groupBox4.Controls.Add(this.radioButton33);
|
||||
this.groupBox4.Controls.Add(this.radioButton32);
|
||||
this.groupBox4.Controls.Add(this.radioButton31);
|
||||
this.groupBox4.Controls.Add(this.radioButton24);
|
||||
this.groupBox4.Controls.Add(this.radioButton4);
|
||||
this.groupBox4.Controls.Add(this.radioButton23);
|
||||
this.groupBox4.Controls.Add(this.radioButton0);
|
||||
this.groupBox4.Controls.Add(this.radioButton22);
|
||||
this.groupBox4.Controls.Add(this.radioButton3);
|
||||
this.groupBox4.Controls.Add(this.radioButton21);
|
||||
this.groupBox4.Controls.Add(this.radioButton1);
|
||||
this.groupBox4.Controls.Add(this.radioButton2);
|
||||
this.groupBox4.Location = new System.Drawing.Point(12, 349);
|
||||
this.groupBox4.Name = "groupBox4";
|
||||
this.groupBox4.Size = new System.Drawing.Size(581, 145);
|
||||
this.groupBox4.TabIndex = 12;
|
||||
this.groupBox4.TabStop = false;
|
||||
this.groupBox4.Text = "Operations";
|
||||
//
|
||||
// radioButton34
|
||||
//
|
||||
this.radioButton34.AutoSize = true;
|
||||
this.radioButton34.Location = new System.Drawing.Point(405, 118);
|
||||
this.radioButton34.Name = "radioButton34";
|
||||
this.radioButton34.Size = new System.Drawing.Size(51, 17);
|
||||
this.radioButton34.TabIndex = 13;
|
||||
this.radioButton34.TabStop = true;
|
||||
this.radioButton34.Text = "spare";
|
||||
this.radioButton34.UseVisualStyleBackColor = true;
|
||||
this.radioButton34.CheckedChanged += new System.EventHandler(this.radioButton34_CheckedChanged);
|
||||
//
|
||||
// radioButton33
|
||||
//
|
||||
this.radioButton33.AutoSize = true;
|
||||
this.radioButton33.Location = new System.Drawing.Point(405, 95);
|
||||
this.radioButton33.Name = "radioButton33";
|
||||
this.radioButton33.Size = new System.Drawing.Size(51, 17);
|
||||
this.radioButton33.TabIndex = 12;
|
||||
this.radioButton33.TabStop = true;
|
||||
this.radioButton33.Text = "spare";
|
||||
this.radioButton33.UseVisualStyleBackColor = true;
|
||||
this.radioButton33.CheckedChanged += new System.EventHandler(this.radioButton33_CheckedChanged);
|
||||
//
|
||||
// radioButton32
|
||||
//
|
||||
this.radioButton32.AutoSize = true;
|
||||
this.radioButton32.Location = new System.Drawing.Point(405, 72);
|
||||
this.radioButton32.Name = "radioButton32";
|
||||
this.radioButton32.Size = new System.Drawing.Size(51, 17);
|
||||
this.radioButton32.TabIndex = 11;
|
||||
this.radioButton32.TabStop = true;
|
||||
this.radioButton32.Text = "spare";
|
||||
this.radioButton32.UseVisualStyleBackColor = true;
|
||||
this.radioButton32.CheckedChanged += new System.EventHandler(this.radioButton32_CheckedChanged);
|
||||
//
|
||||
// radioButton31
|
||||
//
|
||||
this.radioButton31.AutoSize = true;
|
||||
this.radioButton31.Location = new System.Drawing.Point(405, 49);
|
||||
this.radioButton31.Name = "radioButton31";
|
||||
this.radioButton31.Size = new System.Drawing.Size(106, 17);
|
||||
this.radioButton31.TabIndex = 10;
|
||||
this.radioButton31.TabStop = true;
|
||||
this.radioButton31.Text = "ReadPressureOp";
|
||||
this.radioButton31.UseVisualStyleBackColor = true;
|
||||
this.radioButton31.CheckedChanged += new System.EventHandler(this.radioButton31_CheckedChanged);
|
||||
//
|
||||
// groupBox5
|
||||
//
|
||||
this.groupBox5.Controls.Add(this.configureComponent3Button);
|
||||
this.groupBox5.Controls.Add(this.component3NameTextBox);
|
||||
this.groupBox5.Controls.Add(this.label5);
|
||||
this.groupBox5.Controls.Add(this.label6);
|
||||
this.groupBox5.Controls.Add(this.component3ClassNameComboBox);
|
||||
this.groupBox5.Location = new System.Drawing.Point(12, 255);
|
||||
this.groupBox5.Name = "groupBox5";
|
||||
this.groupBox5.Size = new System.Drawing.Size(486, 75);
|
||||
this.groupBox5.TabIndex = 13;
|
||||
this.groupBox5.TabStop = false;
|
||||
this.groupBox5.Text = "Component 3";
|
||||
//
|
||||
// configureComponent3Button
|
||||
//
|
||||
this.configureComponent3Button.Location = new System.Drawing.Point(395, 19);
|
||||
this.configureComponent3Button.Name = "configureComponent3Button";
|
||||
this.configureComponent3Button.Size = new System.Drawing.Size(73, 45);
|
||||
this.configureComponent3Button.TabIndex = 4;
|
||||
this.configureComponent3Button.Text = "Configure";
|
||||
this.configureComponent3Button.UseVisualStyleBackColor = true;
|
||||
this.configureComponent3Button.Click += new System.EventHandler(this.configureComponent3Button_Click);
|
||||
//
|
||||
// component3NameTextBox
|
||||
//
|
||||
this.component3NameTextBox.Enabled = false;
|
||||
this.component3NameTextBox.Location = new System.Drawing.Point(77, 44);
|
||||
this.component3NameTextBox.Name = "component3NameTextBox";
|
||||
this.component3NameTextBox.Size = new System.Drawing.Size(299, 20);
|
||||
this.component3NameTextBox.TabIndex = 3;
|
||||
//
|
||||
// label5
|
||||
//
|
||||
this.label5.AutoSize = true;
|
||||
this.label5.Location = new System.Drawing.Point(11, 47);
|
||||
this.label5.Name = "label5";
|
||||
this.label5.Size = new System.Drawing.Size(35, 13);
|
||||
this.label5.TabIndex = 2;
|
||||
this.label5.Text = "Name";
|
||||
//
|
||||
// label6
|
||||
//
|
||||
this.label6.AutoSize = true;
|
||||
this.label6.Location = new System.Drawing.Point(11, 22);
|
||||
this.label6.Name = "label6";
|
||||
this.label6.Size = new System.Drawing.Size(32, 13);
|
||||
this.label6.TabIndex = 1;
|
||||
this.label6.Text = "Class";
|
||||
//
|
||||
// component3ClassNameComboBox
|
||||
//
|
||||
this.component3ClassNameComboBox.FormattingEnabled = true;
|
||||
this.component3ClassNameComboBox.Location = new System.Drawing.Point(77, 19);
|
||||
this.component3ClassNameComboBox.Name = "component3ClassNameComboBox";
|
||||
this.component3ClassNameComboBox.Size = new System.Drawing.Size(299, 21);
|
||||
this.component3ClassNameComboBox.TabIndex = 0;
|
||||
//
|
||||
// DeviceTestDlg
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(613, 502);
|
||||
this.Controls.Add(this.groupBox5);
|
||||
this.Controls.Add(this.groupBox4);
|
||||
this.Controls.Add(this.groupBox3);
|
||||
this.Controls.Add(this.stopButton);
|
||||
this.Controls.Add(this.groupBox2);
|
||||
this.Controls.Add(this.startButton);
|
||||
this.Controls.Add(this.groupBox1);
|
||||
this.Name = "DeviceTestDlg";
|
||||
this.Text = "Device test";
|
||||
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.DeviceTestDlg_FormClosing);
|
||||
this.Load += new System.EventHandler(this.DeviceTestDlg_Load);
|
||||
this.groupBox1.ResumeLayout(false);
|
||||
this.groupBox1.PerformLayout();
|
||||
this.groupBox2.ResumeLayout(false);
|
||||
this.groupBox2.PerformLayout();
|
||||
this.groupBox3.ResumeLayout(false);
|
||||
this.groupBox3.PerformLayout();
|
||||
this.groupBox4.ResumeLayout(false);
|
||||
this.groupBox4.PerformLayout();
|
||||
this.groupBox5.ResumeLayout(false);
|
||||
this.groupBox5.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.ComboBox parentClassNameComboBox;
|
||||
private System.Windows.Forms.Label classLabel;
|
||||
private System.Windows.Forms.Label nameLabel;
|
||||
private System.Windows.Forms.TextBox parentNameTextBox;
|
||||
private System.Windows.Forms.Button configureParentButton;
|
||||
private System.Windows.Forms.Button startButton;
|
||||
private System.Windows.Forms.GroupBox groupBox1;
|
||||
private System.Windows.Forms.GroupBox groupBox2;
|
||||
private System.Windows.Forms.Button configureComponent1Button;
|
||||
private System.Windows.Forms.TextBox componentNameTextBox;
|
||||
private System.Windows.Forms.Label label1;
|
||||
private System.Windows.Forms.Label label2;
|
||||
private System.Windows.Forms.ComboBox component1ClassNameComboBox;
|
||||
private System.Windows.Forms.RadioButton radioButton4;
|
||||
private System.Windows.Forms.RadioButton radioButton3;
|
||||
private System.Windows.Forms.RadioButton radioButton2;
|
||||
private System.Windows.Forms.RadioButton radioButton1;
|
||||
private System.Windows.Forms.RadioButton radioButton0;
|
||||
private System.Windows.Forms.Button stopButton;
|
||||
private System.Windows.Forms.GroupBox groupBox3;
|
||||
private System.Windows.Forms.RadioButton radioButton24;
|
||||
private System.Windows.Forms.RadioButton radioButton23;
|
||||
private System.Windows.Forms.RadioButton radioButton22;
|
||||
private System.Windows.Forms.RadioButton radioButton21;
|
||||
private System.Windows.Forms.Button configureComponent2Button;
|
||||
private System.Windows.Forms.TextBox component2NameTextBox;
|
||||
private System.Windows.Forms.Label label3;
|
||||
private System.Windows.Forms.Label label4;
|
||||
private System.Windows.Forms.ComboBox component2ClassNameComboBox;
|
||||
private System.Windows.Forms.GroupBox groupBox4;
|
||||
private System.Windows.Forms.GroupBox groupBox5;
|
||||
private System.Windows.Forms.Button configureComponent3Button;
|
||||
private System.Windows.Forms.TextBox component3NameTextBox;
|
||||
private System.Windows.Forms.Label label5;
|
||||
private System.Windows.Forms.Label label6;
|
||||
private System.Windows.Forms.ComboBox component3ClassNameComboBox;
|
||||
private System.Windows.Forms.RadioButton radioButton34;
|
||||
private System.Windows.Forms.RadioButton radioButton33;
|
||||
private System.Windows.Forms.RadioButton radioButton32;
|
||||
private System.Windows.Forms.RadioButton radioButton31;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,835 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Windows.Forms;
|
||||
using TBF.BenchControl;
|
||||
using TBF.BenchControl.Generic;
|
||||
using TBF.BenchControl.GenericDevices;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
|
||||
namespace DeviceTest
|
||||
{
|
||||
public partial class DeviceTestDlg : Form
|
||||
{
|
||||
IList<string> compClasses;
|
||||
|
||||
IComponentFactory parentFactory;
|
||||
IComponentFactory component1Factory;
|
||||
IComponentFactory component2Factory;
|
||||
IComponentFactory component3Factory;
|
||||
|
||||
IComponentCfg parentCfg;
|
||||
IComponentCfg component1Cfg;
|
||||
IComponentCfg component2Cfg;
|
||||
IComponentCfg component3Cfg;
|
||||
|
||||
static IList<TBF.BenchControl.Generic.IDevice> tbfDevices;
|
||||
static IList<TBF.BenchControl.Generic.IComponent> tbfComponents;
|
||||
static TBF.BenchControl.Generic.IComponent tbfComponent1forOp;
|
||||
static TBF.BenchControl.Generic.IComponent tbfComponent2forOp;
|
||||
static TBF.BenchControl.Generic.IComponent tbfComponent3forOp;
|
||||
|
||||
static Thread workerThread;
|
||||
static bool workerThreadRunning;
|
||||
|
||||
|
||||
static int activeOperationId;
|
||||
|
||||
static IOperation operation1;
|
||||
static IOperation operation2;
|
||||
static IOperation operation3;
|
||||
static IOperation operation4;
|
||||
|
||||
static IOperation operation21;
|
||||
static IOperation operation22;
|
||||
static IOperation operation23;
|
||||
static IOperation operation24;
|
||||
|
||||
static IOperation operation31;
|
||||
static IOperation operation32;
|
||||
static IOperation operation33;
|
||||
static IOperation operation34;
|
||||
|
||||
|
||||
static TBF.Boxes.FloatBox floatBox;
|
||||
static Event evnt;
|
||||
|
||||
|
||||
static DeviceTestDlg()
|
||||
{
|
||||
floatBox = new TBF.Boxes.FloatBox();
|
||||
floatBox.Format = "F2";
|
||||
}
|
||||
|
||||
public DeviceTestDlg()
|
||||
{
|
||||
InitializeComponent();
|
||||
radioButton0.Checked = true;
|
||||
stopButton.Enabled = false;
|
||||
|
||||
compClasses = new List<string>();
|
||||
foreach (var componentFactory in TbfComponents.Factories)
|
||||
{
|
||||
compClasses.Add(componentFactory.ClassName);
|
||||
}
|
||||
|
||||
tbfComponents = new List<TBF.BenchControl.Generic.IComponent>();
|
||||
tbfDevices = new List<IDevice>();
|
||||
}
|
||||
|
||||
private void DeviceTestDlg_Load(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
foreach (var clName in compClasses)
|
||||
{
|
||||
parentClassNameComboBox.Items.Add(clName);
|
||||
component1ClassNameComboBox.Items.Add(clName);
|
||||
component2ClassNameComboBox.Items.Add(clName);
|
||||
component3ClassNameComboBox.Items.Add(clName);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if (!string.IsNullOrEmpty(Program.LocalSettings.ParentClassName) &&
|
||||
!string.IsNullOrEmpty(Program.LocalSettings.ParentName) &&
|
||||
!string.IsNullOrEmpty(Program.LocalSettings.ParentSettings))
|
||||
{
|
||||
FactoryFromClassName(Program.LocalSettings.ParentClassName, ref parentFactory);
|
||||
|
||||
using (var reader = new StringReader(Program.LocalSettings.ParentSettings))
|
||||
{
|
||||
IComponentCfg config = (IComponentCfg)(new XmlSerializer(parentFactory.DefaultConfig().GetType())).Deserialize(reader);
|
||||
config.Name = Program.LocalSettings.ParentName;
|
||||
config.ParentName = string.Empty;
|
||||
config.ItemNr = 0;
|
||||
config.DebugLevel = Config.Entities.DebugMode.Normal;
|
||||
config.LogLevel = Config.Entities.LogLevel.Debug;
|
||||
config.Corrections = null;
|
||||
config.Factory = parentFactory;
|
||||
parentCfg = config;
|
||||
}
|
||||
|
||||
parentClassNameComboBox.Text = Program.LocalSettings.ParentClassName;
|
||||
parentNameTextBox.Text = Program.LocalSettings.ParentName;
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
parentFactory = null;
|
||||
parentCfg = null;
|
||||
parentClassNameComboBox.Text = string.Empty;
|
||||
parentNameTextBox.Text = string.Empty;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if (!string.IsNullOrEmpty(Program.LocalSettings.ComponentClassName) &&
|
||||
!string.IsNullOrEmpty(Program.LocalSettings.ComponentName) &&
|
||||
!string.IsNullOrEmpty(Program.LocalSettings.ComponentSettings))
|
||||
{
|
||||
FactoryFromClassName(Program.LocalSettings.ComponentClassName, ref component1Factory);
|
||||
|
||||
using (var reader = new StringReader(Program.LocalSettings.ComponentSettings))
|
||||
{
|
||||
IComponentCfg config = (IComponentCfg)(new XmlSerializer(component1Factory.DefaultConfig().GetType())).Deserialize(reader);
|
||||
config.Name = Program.LocalSettings.ComponentName;
|
||||
config.ParentName = string.IsNullOrEmpty(Program.LocalSettings.ComponentParentName) ? string.Empty : Program.LocalSettings.ComponentParentName;
|
||||
config.ItemNr = 1;
|
||||
config.DebugLevel = Config.Entities.DebugMode.Normal;
|
||||
config.LogLevel = Config.Entities.LogLevel.Debug;
|
||||
config.Corrections = null;
|
||||
config.Factory = component1Factory;
|
||||
component1Cfg = config;
|
||||
}
|
||||
|
||||
component1ClassNameComboBox.Text = Program.LocalSettings.ComponentClassName;
|
||||
componentNameTextBox.Text = Program.LocalSettings.ComponentName;
|
||||
|
||||
UpdateOperations(component1ClassNameComboBox.Text);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
component1Factory = null;
|
||||
component1Cfg = null;
|
||||
component1ClassNameComboBox.Text = string.Empty;
|
||||
componentNameTextBox.Text = string.Empty;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if (!string.IsNullOrEmpty(Program.LocalSettings.Component2ClassName) &&
|
||||
!string.IsNullOrEmpty(Program.LocalSettings.Component2Name) &&
|
||||
!string.IsNullOrEmpty(Program.LocalSettings.Component2Settings))
|
||||
{
|
||||
FactoryFromClassName(Program.LocalSettings.Component2ClassName, ref component2Factory);
|
||||
|
||||
using (var reader = new StringReader(Program.LocalSettings.Component2Settings))
|
||||
{
|
||||
IComponentCfg config = (IComponentCfg)(new XmlSerializer(component2Factory.DefaultConfig().GetType())).Deserialize(reader);
|
||||
config.Name = Program.LocalSettings.Component2Name;
|
||||
config.ParentName = string.IsNullOrEmpty(Program.LocalSettings.Component2ParentName) ? string.Empty : Program.LocalSettings.Component2ParentName;
|
||||
config.ItemNr = 2;
|
||||
config.DebugLevel = Config.Entities.DebugMode.Normal;
|
||||
config.LogLevel = Config.Entities.LogLevel.Debug;
|
||||
config.Corrections = null;
|
||||
config.Factory = component2Factory;
|
||||
component2Cfg = config;
|
||||
}
|
||||
|
||||
component2ClassNameComboBox.Text = Program.LocalSettings.Component2ClassName;
|
||||
component2NameTextBox.Text = Program.LocalSettings.Component2Name;
|
||||
|
||||
UpdateOperations2(component2ClassNameComboBox.Text);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
component2Factory = null;
|
||||
component2Cfg = null;
|
||||
component2ClassNameComboBox.Text = string.Empty;
|
||||
component2NameTextBox.Text = string.Empty;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if (!string.IsNullOrEmpty(Program.LocalSettings.Component3ClassName) &&
|
||||
!string.IsNullOrEmpty(Program.LocalSettings.Component3Name) &&
|
||||
!string.IsNullOrEmpty(Program.LocalSettings.Component3Settings))
|
||||
{
|
||||
FactoryFromClassName(Program.LocalSettings.Component3ClassName, ref component3Factory);
|
||||
|
||||
using (var reader = new StringReader(Program.LocalSettings.Component3Settings))
|
||||
{
|
||||
IComponentCfg config = (IComponentCfg)(new XmlSerializer(component3Factory.DefaultConfig().GetType())).Deserialize(reader);
|
||||
config.Name = Program.LocalSettings.Component3Name;
|
||||
config.ParentName = string.IsNullOrEmpty(Program.LocalSettings.Component3ParentName) ? string.Empty : Program.LocalSettings.Component3ParentName;
|
||||
config.ItemNr = 3;
|
||||
config.DebugLevel = Config.Entities.DebugMode.Normal;
|
||||
config.LogLevel = Config.Entities.LogLevel.Debug;
|
||||
config.Corrections = null;
|
||||
config.Factory = component3Factory;
|
||||
component3Cfg = config;
|
||||
}
|
||||
|
||||
component3ClassNameComboBox.Text = Program.LocalSettings.Component3ClassName;
|
||||
component3NameTextBox.Text = Program.LocalSettings.Component3Name;
|
||||
|
||||
UpdateOperations3(component3ClassNameComboBox.Text);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
component3Factory = null;
|
||||
component3Cfg = null;
|
||||
component3ClassNameComboBox.Text = string.Empty;
|
||||
component3NameTextBox.Text = string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
void SaveSettings()
|
||||
{
|
||||
Program.LocalSettings.ParentClassName = parentClassNameComboBox.Text;
|
||||
Program.LocalSettings.ParentName = parentNameTextBox.Text;
|
||||
Program.LocalSettings.ParentSettings = (parentCfg != null) ? parentCfg.CreateDbEntity().Parameters : string.Empty;
|
||||
|
||||
Program.LocalSettings.ComponentClassName = component1ClassNameComboBox.Text;
|
||||
Program.LocalSettings.ComponentName = componentNameTextBox.Text;
|
||||
Program.LocalSettings.ComponentParentName = (component1Cfg != null) ? component1Cfg.ParentName : string.Empty;
|
||||
Program.LocalSettings.ComponentSettings = (component1Cfg != null) ? component1Cfg.CreateDbEntity().Parameters : string.Empty;
|
||||
|
||||
Program.LocalSettings.Component2ClassName = component2ClassNameComboBox.Text;
|
||||
Program.LocalSettings.Component2Name = component2NameTextBox.Text;
|
||||
Program.LocalSettings.Component2ParentName = (component2Cfg != null) ? component2Cfg.ParentName : string.Empty;
|
||||
Program.LocalSettings.Component2Settings = (component2Cfg != null) ? component2Cfg.CreateDbEntity().Parameters : string.Empty;
|
||||
|
||||
Program.LocalSettings.Component3ClassName = component3ClassNameComboBox.Text;
|
||||
Program.LocalSettings.Component3Name = component3NameTextBox.Text;
|
||||
Program.LocalSettings.Component3ParentName = (component3Cfg != null) ? component3Cfg.ParentName : string.Empty;
|
||||
Program.LocalSettings.Component3Settings = (component3Cfg != null) ? component3Cfg.CreateDbEntity().Parameters : string.Empty;
|
||||
|
||||
Program.LocalSettings.Save();
|
||||
}
|
||||
|
||||
|
||||
void UpdateOperations(string className)
|
||||
{
|
||||
if (className == "Keithley.TempMeter") radioButton1.Text = "ReadPressureOp";
|
||||
else if (className == "Network.Camera.CLP1611") radioButton1.Text = "Livestream";
|
||||
else if (className == "Network.Camera.Roi") radioButton1.Text = "RoiDetection";
|
||||
else if (className == "Modbus.Easytherm")
|
||||
{
|
||||
radioButton1.Text = "SetTemperature(10)";
|
||||
radioButton2.Text = "SetTemperature(20)";
|
||||
}
|
||||
else if (className == "Modbus.TankSelector")
|
||||
{
|
||||
radioButton1.Text = "SelectTank 1";
|
||||
radioButton2.Text = "SelectTank 2";
|
||||
radioButton3.Text = "SelectTank 3";
|
||||
radioButton4.Text = "SelectTank -";
|
||||
}
|
||||
else radioButton1.Text = "spare";
|
||||
}
|
||||
///
|
||||
void UpdateOperations2(string className)
|
||||
{
|
||||
if (className == "Keithley.TempMeter") radioButton21.Text = "ReadPressureOp";
|
||||
else if (className == "Network.Camera.CLP1611") radioButton21.Text = "Livestream";
|
||||
else if (className == "Network.Camera.Roi") radioButton21.Text = "RoiDetection";
|
||||
else if (className == "Modbus.Easytherm")
|
||||
{
|
||||
radioButton21.Text = "SetTemperature(10)";
|
||||
radioButton22.Text = "SetTemperature(20)";
|
||||
}
|
||||
else if (className == "Modbus.TankSelector")
|
||||
{
|
||||
radioButton21.Text = "SelectTank 1";
|
||||
radioButton22.Text = "SelectTank 2";
|
||||
radioButton23.Text = "SelectTank 3";
|
||||
radioButton24.Text = "SelectTank -";
|
||||
}
|
||||
else radioButton21.Text = "spare";
|
||||
}
|
||||
///
|
||||
void UpdateOperations3(string className)
|
||||
{
|
||||
if (className == "Keithley.TempMeter") radioButton31.Text = "ReadPressureOp";
|
||||
else if (className == "Network.Camera.CLP1611") radioButton31.Text = "Livestream";
|
||||
else if (className == "Network.Camera.Roi") radioButton31.Text = "RoiDetection";
|
||||
else if (className == "Modbus.Easytherm")
|
||||
{
|
||||
radioButton31.Text = "SetTemperature(10)";
|
||||
radioButton32.Text = "SetTemperature(20)";
|
||||
}
|
||||
else if (className == "Modbus.TankSelector")
|
||||
{
|
||||
radioButton31.Text = "SelectTank 1";
|
||||
radioButton32.Text = "SelectTank 2";
|
||||
radioButton33.Text = "SelectTank 3";
|
||||
radioButton34.Text = "SelectTank -";
|
||||
}
|
||||
else radioButton31.Text = "spare";
|
||||
}
|
||||
|
||||
|
||||
int GetActiveOperationId()
|
||||
{
|
||||
if (radioButton1.Checked) { return 1; }
|
||||
else if (radioButton2.Checked) { return 2; }
|
||||
else if (radioButton3.Checked) { return 3; }
|
||||
else if (radioButton4.Checked) { return 4; }
|
||||
else if (radioButton21.Checked) { return 21; }
|
||||
else if (radioButton22.Checked) { return 22; }
|
||||
else if (radioButton23.Checked) { return 23; }
|
||||
else if (radioButton24.Checked) { return 24; }
|
||||
else if (radioButton31.Checked) { return 31; }
|
||||
else if (radioButton32.Checked) { return 32; }
|
||||
else if (radioButton33.Checked) { return 33; }
|
||||
else if (radioButton34.Checked) { return 34; }
|
||||
else return 0; /// stopOperationRadioButton.Checked
|
||||
}
|
||||
|
||||
|
||||
private void radioButton0_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
|
||||
private void radioButton1_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
|
||||
private void radioButton2_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
|
||||
private void radioButton3_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
|
||||
private void radioButton4_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
|
||||
///
|
||||
private void radioButton21_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
|
||||
private void radioButton22_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
|
||||
private void radioButton23_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
|
||||
private void radioButton24_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
|
||||
///
|
||||
private void radioButton31_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
|
||||
private void radioButton32_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
|
||||
private void radioButton33_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
|
||||
private void radioButton34_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Updates component factory
|
||||
/// </summary>
|
||||
/// <param name="className">Component class name</param>
|
||||
/// <param name="factory">Reference to a factory</param>
|
||||
/// <returns>true when factory changed</returns>
|
||||
bool FactoryFromClassName(string className, ref IComponentFactory factory)
|
||||
{
|
||||
foreach (var fac in TbfComponents.Factories)
|
||||
{
|
||||
if (className == fac.ClassName)
|
||||
{
|
||||
if (factory != fac)
|
||||
{
|
||||
factory = fac;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (factory != null)
|
||||
{
|
||||
factory = null;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private void configureParentButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
bool factoryChanged = FactoryFromClassName(parentClassNameComboBox.Text, ref parentFactory);
|
||||
if (parentFactory == null)
|
||||
{
|
||||
MessageBox.Show("Invalid parent class", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
|
||||
return;
|
||||
}
|
||||
|
||||
if (factoryChanged || parentCfg == null)
|
||||
{
|
||||
parentCfg = parentFactory.DefaultConfig();
|
||||
}
|
||||
IComponentCfgCtrl cfgControl = parentCfg.GetControl();
|
||||
cfgControl.Config = parentCfg;
|
||||
cfgControl.Config.ItemNr = 0;
|
||||
|
||||
TBF.ComponentParametersDlg cfgForm = new TBF.ComponentParametersDlg();
|
||||
cfgForm.TbfComponents = new List<Config.Entities.Component>();
|
||||
|
||||
cfgForm.ComponentCfgCtrl = cfgControl;
|
||||
cfgForm.UnlockAfterStart = true;
|
||||
DialogResult dr = cfgForm.ShowDialog();
|
||||
if (dr != DialogResult.OK) return;
|
||||
|
||||
parentNameTextBox.Text = parentCfg.Name;
|
||||
}
|
||||
|
||||
|
||||
private void configureComponent1Button_Click(object sender, EventArgs e)
|
||||
{
|
||||
bool factoryChanged = FactoryFromClassName(component1ClassNameComboBox.Text, ref component1Factory);
|
||||
if (component1Factory == null)
|
||||
{
|
||||
MessageBox.Show("Invalid component class", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
|
||||
return;
|
||||
}
|
||||
|
||||
if (factoryChanged || component1Cfg == null)
|
||||
{
|
||||
component1Cfg = component1Factory.DefaultConfig();
|
||||
}
|
||||
IComponentCfgCtrl cfgControl = component1Cfg.GetControl();
|
||||
cfgControl.Config = component1Cfg;
|
||||
cfgControl.Config.ItemNr = 1;
|
||||
|
||||
TBF.ComponentParametersDlg cfgForm = new TBF.ComponentParametersDlg();
|
||||
///
|
||||
IList<Config.Entities.Component> compEntities = new List<Config.Entities.Component>();
|
||||
if (parentFactory != null && parentCfg != null) compEntities.Add(parentCfg.CreateDbEntity());
|
||||
cfgForm.TbfComponents = compEntities;
|
||||
|
||||
cfgForm.ComponentCfgCtrl = cfgControl;
|
||||
cfgForm.UnlockAfterStart = true;
|
||||
DialogResult dr = cfgForm.ShowDialog();
|
||||
if (dr != DialogResult.OK) return;
|
||||
|
||||
componentNameTextBox.Text = component1Cfg.Name;
|
||||
|
||||
UpdateOperations(component1ClassNameComboBox.Text);
|
||||
}
|
||||
|
||||
|
||||
private void configureComponent2Button_Click(object sender, EventArgs e)
|
||||
{
|
||||
bool factoryChanged = FactoryFromClassName(component2ClassNameComboBox.Text, ref component2Factory);
|
||||
if (component2Factory == null)
|
||||
{
|
||||
MessageBox.Show("Invalid component class", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
|
||||
return;
|
||||
}
|
||||
|
||||
if (factoryChanged || component2Cfg == null)
|
||||
{
|
||||
component2Cfg = component2Factory.DefaultConfig();
|
||||
}
|
||||
IComponentCfgCtrl cfgControl = component2Cfg.GetControl();
|
||||
cfgControl.Config = component2Cfg;
|
||||
cfgControl.Config.ItemNr = 1;
|
||||
|
||||
TBF.ComponentParametersDlg cfgForm = new TBF.ComponentParametersDlg();
|
||||
///
|
||||
IList<Config.Entities.Component> compEntities = new List<Config.Entities.Component>();
|
||||
if (parentFactory != null && parentCfg != null) compEntities.Add(parentCfg.CreateDbEntity());
|
||||
if (component1Factory != null && component1Cfg != null) compEntities.Add(component1Cfg.CreateDbEntity());
|
||||
cfgForm.TbfComponents = compEntities;
|
||||
|
||||
cfgForm.ComponentCfgCtrl = cfgControl;
|
||||
cfgForm.UnlockAfterStart = true;
|
||||
DialogResult dr = cfgForm.ShowDialog();
|
||||
if (dr != DialogResult.OK) return;
|
||||
|
||||
component2NameTextBox.Text = component2Cfg.Name;
|
||||
|
||||
UpdateOperations2(component2ClassNameComboBox.Text);
|
||||
}
|
||||
|
||||
|
||||
private void configureComponent3Button_Click(object sender, EventArgs e)
|
||||
{
|
||||
bool factoryChanged = FactoryFromClassName(component3ClassNameComboBox.Text, ref component3Factory);
|
||||
if (component3Factory == null)
|
||||
{
|
||||
MessageBox.Show("Invalid component class", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
|
||||
return;
|
||||
}
|
||||
|
||||
if (factoryChanged || component3Cfg == null)
|
||||
{
|
||||
component3Cfg = component3Factory.DefaultConfig();
|
||||
}
|
||||
IComponentCfgCtrl cfgControl = component3Cfg.GetControl();
|
||||
cfgControl.Config = component3Cfg;
|
||||
cfgControl.Config.ItemNr = 1;
|
||||
|
||||
TBF.ComponentParametersDlg cfgForm = new TBF.ComponentParametersDlg();
|
||||
///
|
||||
IList<Config.Entities.Component> compEntities = new List<Config.Entities.Component>();
|
||||
if (parentFactory != null && parentCfg != null) compEntities.Add(parentCfg.CreateDbEntity());
|
||||
if (component1Factory != null && component1Cfg != null) compEntities.Add(component1Cfg.CreateDbEntity());
|
||||
if (component2Factory != null && component2Cfg != null) compEntities.Add(component2Cfg.CreateDbEntity());
|
||||
cfgForm.TbfComponents = compEntities;
|
||||
|
||||
cfgForm.ComponentCfgCtrl = cfgControl;
|
||||
cfgForm.UnlockAfterStart = true;
|
||||
DialogResult dr = cfgForm.ShowDialog();
|
||||
if (dr != DialogResult.OK) return;
|
||||
|
||||
component3NameTextBox.Text = component3Cfg.Name;
|
||||
|
||||
UpdateOperations3(component3ClassNameComboBox.Text);
|
||||
}
|
||||
|
||||
|
||||
private void startButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
tbfComponents.Clear();
|
||||
tbfDevices.Clear();
|
||||
tbfComponent1forOp = null;
|
||||
operation1 = null;
|
||||
operation2 = null;
|
||||
operation3 = null;
|
||||
operation4 = null;
|
||||
tbfComponent2forOp = null;
|
||||
operation21 = null;
|
||||
operation22 = null;
|
||||
operation23 = null;
|
||||
operation24 = null;
|
||||
tbfComponent3forOp = null;
|
||||
operation31 = null;
|
||||
operation32 = null;
|
||||
operation33 = null;
|
||||
operation34 = null;
|
||||
workerThreadRunning = false;
|
||||
|
||||
string initializedDeviceName = "none";
|
||||
try
|
||||
{
|
||||
if (parentFactory != null && parentCfg != null)
|
||||
{
|
||||
TBF.BenchControl.Generic.IComponent component = parentFactory.GetComponent(parentCfg, tbfComponents);
|
||||
tbfComponents.Add(component);
|
||||
IDevice dev = component as IDevice;
|
||||
if (dev != null)
|
||||
{
|
||||
initializedDeviceName = dev.Name;
|
||||
dev.Initialize();
|
||||
tbfDevices.Add(dev);
|
||||
}
|
||||
}
|
||||
if (component1Factory != null && component1Cfg != null)
|
||||
{
|
||||
TBF.BenchControl.Generic.IComponent component = component1Factory.GetComponent(component1Cfg, tbfComponents);
|
||||
tbfComponents.Add(component);
|
||||
tbfComponent1forOp = component;
|
||||
IDevice dev = component as IDevice;
|
||||
if (dev != null)
|
||||
{
|
||||
initializedDeviceName = dev.Name;
|
||||
dev.Initialize();
|
||||
tbfDevices.Add(dev);
|
||||
}
|
||||
}
|
||||
if (component2Factory != null && component2Cfg != null)
|
||||
{
|
||||
TBF.BenchControl.Generic.IComponent component2 = component2Factory.GetComponent(component2Cfg, tbfComponents);
|
||||
tbfComponents.Add(component2);
|
||||
tbfComponent2forOp = component2;
|
||||
IDevice dev = component2 as IDevice;
|
||||
if (dev != null)
|
||||
{
|
||||
initializedDeviceName = dev.Name;
|
||||
dev.Initialize();
|
||||
tbfDevices.Add(dev);
|
||||
}
|
||||
}
|
||||
if (component3Factory != null && component3Cfg != null)
|
||||
{
|
||||
TBF.BenchControl.Generic.IComponent component3 = component3Factory.GetComponent(component3Cfg, tbfComponents);
|
||||
tbfComponents.Add(component3);
|
||||
tbfComponent3forOp = component3;
|
||||
IDevice dev = component3 as IDevice;
|
||||
if (dev != null)
|
||||
{
|
||||
initializedDeviceName = dev.Name;
|
||||
dev.Initialize();
|
||||
tbfDevices.Add(dev);
|
||||
}
|
||||
}
|
||||
|
||||
if (tbfComponents.Count == 0) throw new Exception("There are no components");
|
||||
|
||||
SaveSettings(); /// Save settings after successful initialization
|
||||
|
||||
workerThread = new Thread(Worker);
|
||||
workerThread.CurrentCulture = Thread.CurrentThread.CurrentCulture;
|
||||
workerThread.CurrentUICulture = Thread.CurrentThread.CurrentUICulture;
|
||||
workerThreadRunning = true;
|
||||
workerThread.Start();
|
||||
|
||||
startButton.Enabled = false;
|
||||
stopButton.Enabled = true;
|
||||
configureComponent2Button.Enabled = false;
|
||||
configureComponent1Button.Enabled = false;
|
||||
configureParentButton.Enabled = false;
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
workerThreadRunning = false;
|
||||
workerThread = null;
|
||||
|
||||
MessageBox.Show(exc.Message,
|
||||
string.Format("'{0}' initialization failed", initializedDeviceName),
|
||||
MessageBoxButtons.OK,
|
||||
MessageBoxIcon.Exclamation);
|
||||
|
||||
foreach (var dev in tbfDevices) dev.StopDevice();
|
||||
tbfDevices.Clear();
|
||||
|
||||
startButton.Enabled = true;
|
||||
stopButton.Enabled = false;
|
||||
configureComponent2Button.Enabled = true;
|
||||
configureComponent1Button.Enabled = true;
|
||||
configureParentButton.Enabled = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void Worker()
|
||||
{
|
||||
int activeOperationLocal = 0;
|
||||
int previousOperation = 0;
|
||||
|
||||
|
||||
if (tbfComponent1forOp is TBF.BenchControl.Modbus.PressureMeter.Meret.PressureMeter)
|
||||
{
|
||||
operation1 = (tbfComponent1forOp as TBF.BenchControl.Modbus.PressureMeter.Meret.PressureMeter).ReadPressureOp(ref floatBox);
|
||||
}
|
||||
else if (tbfComponent1forOp is TBF.BenchControl.Network.Camera.CLP1611.Camera)
|
||||
{
|
||||
operation1 = (tbfComponent1forOp as TBF.BenchControl.Network.Camera.CLP1611.Camera).LiveStreamOp(false);
|
||||
operation2 = (tbfComponent1forOp as TBF.BenchControl.Network.Camera.CLP1611.Camera).LiveStreamOp(true);
|
||||
}
|
||||
else if (tbfComponent1forOp is TBF.BenchControl.Network.Camera.Roi.Roi)
|
||||
{
|
||||
operation1 = (tbfComponent1forOp as TBF.BenchControl.Network.Camera.Roi.Roi).RoiDetectionOp();
|
||||
}
|
||||
else if (tbfComponent1forOp is TBF.BenchControl.Modbus.Easytherm.Easytherm)
|
||||
{
|
||||
operation1 = (tbfComponent1forOp as TBF.BenchControl.Modbus.Easytherm.Easytherm).SetTemperatureOp(10);
|
||||
operation2 = (tbfComponent1forOp as TBF.BenchControl.Modbus.Easytherm.Easytherm).SetTemperatureOp(20);
|
||||
}
|
||||
else if (tbfComponent1forOp is TBF.BenchControl.Modbus.TankSelector.TankSelector)
|
||||
{
|
||||
//operation1 = (tbfComponent1forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(1);
|
||||
//operation2 = (tbfComponent1forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(2);
|
||||
//operation3 = (tbfComponent1forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(3);
|
||||
//operation4 = (tbfComponent1forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(0);
|
||||
}
|
||||
|
||||
|
||||
if (tbfComponent2forOp is TBF.BenchControl.Modbus.PressureMeter.Meret.PressureMeter)
|
||||
{
|
||||
operation21 = (tbfComponent2forOp as TBF.BenchControl.Modbus.PressureMeter.Meret.PressureMeter).ReadPressureOp(ref floatBox);
|
||||
}
|
||||
else if (tbfComponent2forOp is TBF.BenchControl.Network.Camera.CLP1611.Camera)
|
||||
{
|
||||
operation21 = (tbfComponent2forOp as TBF.BenchControl.Network.Camera.CLP1611.Camera).LiveStreamOp(false);
|
||||
operation22 = (tbfComponent2forOp as TBF.BenchControl.Network.Camera.CLP1611.Camera).LiveStreamOp(true);
|
||||
}
|
||||
else if (tbfComponent2forOp is TBF.BenchControl.Network.Camera.Roi.Roi)
|
||||
{
|
||||
operation21 = (tbfComponent2forOp as TBF.BenchControl.Network.Camera.Roi.Roi).RoiDetectionOp();
|
||||
}
|
||||
else if (tbfComponent2forOp is TBF.BenchControl.Modbus.Easytherm.Easytherm)
|
||||
{
|
||||
operation21 = (tbfComponent1forOp as TBF.BenchControl.Modbus.Easytherm.Easytherm).SetTemperatureOp(10);
|
||||
operation22 = (tbfComponent1forOp as TBF.BenchControl.Modbus.Easytherm.Easytherm).SetTemperatureOp(20);
|
||||
}
|
||||
else if (tbfComponent2forOp is TBF.BenchControl.Modbus.TankSelector.TankSelector)
|
||||
{
|
||||
//operation21 = (tbfComponent2forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(1);
|
||||
//operation22 = (tbfComponent2forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(2);
|
||||
//operation23 = (tbfComponent2forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(3);
|
||||
//operation24 = (tbfComponent2forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(0);
|
||||
}
|
||||
|
||||
|
||||
if (tbfComponent3forOp is TBF.BenchControl.Modbus.PressureMeter.Meret.PressureMeter)
|
||||
{
|
||||
operation31 = (tbfComponent3forOp as TBF.BenchControl.Modbus.PressureMeter.Meret.PressureMeter).ReadPressureOp(ref floatBox);
|
||||
}
|
||||
else if (tbfComponent3forOp is TBF.BenchControl.Network.Camera.CLP1611.Camera)
|
||||
{
|
||||
operation31 = (tbfComponent3forOp as TBF.BenchControl.Network.Camera.CLP1611.Camera).LiveStreamOp(false);
|
||||
operation33 = (tbfComponent3forOp as TBF.BenchControl.Network.Camera.CLP1611.Camera).LiveStreamOp(true);
|
||||
}
|
||||
else if (tbfComponent3forOp is TBF.BenchControl.Network.Camera.Roi.Roi)
|
||||
{
|
||||
operation31 = (tbfComponent3forOp as TBF.BenchControl.Network.Camera.Roi.Roi).RoiDetectionOp();
|
||||
}
|
||||
else if (tbfComponent3forOp is TBF.BenchControl.Modbus.Easytherm.Easytherm)
|
||||
{
|
||||
operation31 = (tbfComponent1forOp as TBF.BenchControl.Modbus.Easytherm.Easytherm).SetTemperatureOp(10);
|
||||
operation32 = (tbfComponent1forOp as TBF.BenchControl.Modbus.Easytherm.Easytherm).SetTemperatureOp(20);
|
||||
}
|
||||
else if (tbfComponent3forOp is TBF.BenchControl.Modbus.TankSelector.TankSelector)
|
||||
{
|
||||
//operation31 = (tbfComponent3forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(1);
|
||||
//operation32 = (tbfComponent3forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(2);
|
||||
//operation33 = (tbfComponent3forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(3);
|
||||
//operation34 = (tbfComponent3forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(0);
|
||||
}
|
||||
|
||||
|
||||
while (workerThreadRunning)
|
||||
{
|
||||
Thread.Sleep(1000);
|
||||
|
||||
if (workerThreadRunning)
|
||||
{
|
||||
foreach (var d in tbfDevices) d.RunDeviceBefore();
|
||||
|
||||
if (tbfComponent1forOp != null)
|
||||
{
|
||||
previousOperation = activeOperationLocal;
|
||||
activeOperationLocal = activeOperationId;
|
||||
if (previousOperation == 0 && activeOperationLocal != 0)
|
||||
{
|
||||
switch (activeOperationLocal)
|
||||
{
|
||||
case 1: if (operation1 != null) operation1.Start(); Debug.WriteLine("op1.Start()"); break;
|
||||
case 2: if (operation2 != null) operation2.Start(); Debug.WriteLine("op2.Start()"); break;
|
||||
case 3: if (operation3 != null) operation3.Start(); Debug.WriteLine("op3.Start()"); break;
|
||||
case 4: if (operation4 != null) operation4.Start(); Debug.WriteLine("op4.Start()"); break;
|
||||
case 21: if (operation21 != null) operation21.Start(); Debug.WriteLine("op21.Start()"); break;
|
||||
case 22: if (operation22 != null) operation22.Start(); Debug.WriteLine("op22.Start()"); break;
|
||||
case 23: if (operation23 != null) operation23.Start(); Debug.WriteLine("op23.Start()"); break;
|
||||
case 24: if (operation24 != null) operation24.Start(); Debug.WriteLine("op24.Start()"); break;
|
||||
case 31: if (operation31 != null) operation31.Start(); Debug.WriteLine("op31.Start()"); break;
|
||||
case 32: if (operation32 != null) operation32.Start(); Debug.WriteLine("op32.Start()"); break;
|
||||
case 33: if (operation33 != null) operation33.Start(); Debug.WriteLine("op33.Start()"); break;
|
||||
case 34: if (operation34 != null) operation34.Start(); Debug.WriteLine("op34.Start()"); break;
|
||||
}
|
||||
}
|
||||
else if (previousOperation == activeOperationLocal && activeOperationLocal != 0)
|
||||
{
|
||||
switch (activeOperationLocal)
|
||||
{
|
||||
case 1: if (operation1 != null) evnt = operation1.Run(); Debug.WriteLine("op1.Run() -> {0}", evnt); break;
|
||||
case 2: if (operation2 != null) evnt = operation2.Run(); Debug.WriteLine("op2.Run() -> {0}", evnt); break;
|
||||
case 3: if (operation3 != null) evnt = operation3.Run(); Debug.WriteLine("op3.Run() -> {0}", evnt); break;
|
||||
case 4: if (operation4 != null) evnt = operation4.Run(); Debug.WriteLine("op4.Run() -> {0}", evnt); break;
|
||||
case 21: if (operation21 != null) evnt = operation21.Run(); Debug.WriteLine("op21.Run() -> {0}", evnt); break;
|
||||
case 22: if (operation22 != null) evnt = operation22.Run(); Debug.WriteLine("op22.Run() -> {0}", evnt); break;
|
||||
case 23: if (operation23 != null) evnt = operation23.Run(); Debug.WriteLine("op23.Run() -> {0}", evnt); break;
|
||||
case 24: if (operation24 != null) evnt = operation24.Run(); Debug.WriteLine("op24.Run() -> {0}", evnt); break;
|
||||
case 31: if (operation31 != null) evnt = operation31.Run(); Debug.WriteLine("op31.Run() -> {0}", evnt); break;
|
||||
case 32: if (operation32 != null) evnt = operation32.Run(); Debug.WriteLine("op32.Run() -> {0}", evnt); break;
|
||||
case 33: if (operation33 != null) evnt = operation33.Run(); Debug.WriteLine("op33.Run() -> {0}", evnt); break;
|
||||
case 34: if (operation34 != null) evnt = operation34.Run(); Debug.WriteLine("op34.Run() -> {0}", evnt); break;
|
||||
default: evnt = Event.None; break;
|
||||
}
|
||||
}
|
||||
else if (previousOperation != 0 && activeOperationLocal == 0)
|
||||
{
|
||||
switch (previousOperation)
|
||||
{
|
||||
case 1: if (operation1 != null) operation1.Stop(); Debug.WriteLine("op1.Stop()"); break;
|
||||
case 2: if (operation2 != null) operation2.Stop(); Debug.WriteLine("op2.Stop()"); break;
|
||||
case 3: if (operation3 != null) operation3.Stop(); Debug.WriteLine("op3.Stop()"); break;
|
||||
case 4: if (operation4 != null) operation4.Stop(); Debug.WriteLine("op4.Stop()"); break;
|
||||
case 21: if (operation21 != null) operation21.Stop(); Debug.WriteLine("op21.Stop()"); break;
|
||||
case 22: if (operation22 != null) operation22.Stop(); Debug.WriteLine("op22.Stop()"); break;
|
||||
case 23: if (operation23 != null) operation23.Stop(); Debug.WriteLine("op23.Stop()"); break;
|
||||
case 24: if (operation24 != null) operation24.Stop(); Debug.WriteLine("op24.Stop()"); break;
|
||||
case 31: if (operation31 != null) operation31.Stop(); Debug.WriteLine("op31.Stop()"); break;
|
||||
case 32: if (operation32 != null) operation32.Stop(); Debug.WriteLine("op32.Stop()"); break;
|
||||
case 33: if (operation33 != null) operation33.Stop(); Debug.WriteLine("op33.Stop()"); break;
|
||||
case 34: if (operation34 != null) operation34.Stop(); Debug.WriteLine("op34.Stop()"); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var d in tbfDevices) d.RunDeviceAfter();
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var d in tbfDevices) d.StopDevice();
|
||||
}
|
||||
|
||||
private void stopButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
Cursor = Cursors.WaitCursor;
|
||||
|
||||
workerThreadRunning = false;
|
||||
workerThread.Join(5000);
|
||||
workerThread = null;
|
||||
|
||||
Cursor = Cursors.Default;
|
||||
|
||||
startButton.Enabled = true;
|
||||
stopButton.Enabled = false;
|
||||
configureParentButton.Enabled = true;
|
||||
configureComponent1Button.Enabled = true;
|
||||
configureComponent2Button.Enabled = true;
|
||||
configureComponent3Button.Enabled = true;
|
||||
}
|
||||
|
||||
private void DeviceTestDlg_FormClosing(object sender, FormClosingEventArgs e)
|
||||
{
|
||||
Cursor = Cursors.WaitCursor;
|
||||
|
||||
if (workerThread != null)
|
||||
{
|
||||
workerThreadRunning = false;
|
||||
workerThread.Join(3000);
|
||||
workerThread = null;
|
||||
}
|
||||
|
||||
Cursor = Cursors.Default;
|
||||
|
||||
SaveSettings();
|
||||
|
||||
Cursor = Cursors.Default;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,126 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace DeviceTest
|
||||
{
|
||||
/// <summary>
|
||||
/// Class to be serialized to an XML file...
|
||||
/// </summary>
|
||||
[XmlRootAttribute("DeviceTest")]
|
||||
public class LocalSettings
|
||||
{
|
||||
public string ParentClassName;
|
||||
public string ParentName;
|
||||
public string ParentSettings;
|
||||
|
||||
public string ComponentClassName;
|
||||
public string ComponentName;
|
||||
public string ComponentParentName;
|
||||
public string ComponentSettings;
|
||||
|
||||
public string Component2ClassName;
|
||||
public string Component2Name;
|
||||
public string Component2ParentName;
|
||||
public string Component2Settings;
|
||||
|
||||
public string Component3ClassName;
|
||||
public string Component3Name;
|
||||
public string Component3ParentName;
|
||||
public string Component3Settings;
|
||||
|
||||
public LocalSettings()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Load public fields of this class from the XML file.
|
||||
/// </summary>
|
||||
/// <returns>LocalSettings object or null when Load() fails</returns>
|
||||
public static LocalSettings Load(string fileName)
|
||||
{
|
||||
try
|
||||
{
|
||||
using (TextReader reader = new StreamReader(fileName))
|
||||
{
|
||||
LocalSettings ls = (new XmlSerializer(typeof(LocalSettings))).Deserialize(reader) as LocalSettings;
|
||||
// Copy the settings just in case De-serialize() completes OK
|
||||
return ls;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
string msg = e.Message;
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Save public fields of this class to the XML file.
|
||||
/// </summary>
|
||||
public void Save()
|
||||
{
|
||||
try
|
||||
{
|
||||
using (TextWriter writer = new StreamWriter(Program.LocalSettingsFileName))
|
||||
{
|
||||
(new XmlSerializer(typeof(LocalSettings))).Serialize(writer, this);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
string msg = e.Message;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates history stored in a string array by a new latest string.
|
||||
/// </summary>
|
||||
/// <param name="lastStrValue">Last entered string</param>
|
||||
/// <returns>true = updated and saved</returns>
|
||||
public bool UpdateHistory(string lastStrValue, ref string[] history)
|
||||
{
|
||||
const int MaxHistoryLen = 10;
|
||||
|
||||
if (string.IsNullOrEmpty(lastStrValue)) return false;
|
||||
|
||||
int currentHistoryLength = (history != null) ? history.Length : 0;
|
||||
|
||||
int match = -1;
|
||||
for (int i = 0; i < currentHistoryLength; i++)
|
||||
{
|
||||
if (history[i] == lastStrValue)
|
||||
{
|
||||
match = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (match >= 0 || currentHistoryLength >= MaxHistoryLen)
|
||||
{
|
||||
/// History does not have to be extended (because of a match) or should not be extended (because of the lenght)
|
||||
if (match < 0) match = currentHistoryLength - 1;
|
||||
|
||||
for (int j = match; j > 0; j--)
|
||||
{
|
||||
history[j] = history[j - 1];
|
||||
}
|
||||
history[0] = lastStrValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
/// History will be extended, new item inserted at the beginning
|
||||
string[] newHistory = new string[currentHistoryLength + 1];
|
||||
newHistory[0] = lastStrValue;
|
||||
for (int j = 1; j <= currentHistoryLength; j++)
|
||||
{
|
||||
newHistory[j] = history[j - 1];
|
||||
}
|
||||
history = newHistory;
|
||||
}
|
||||
Save();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,111 @@
|
||||
///
|
||||
/// Copyright (c) 2016-2017 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Windows.Forms;
|
||||
using log4net;
|
||||
|
||||
namespace DeviceTest
|
||||
{
|
||||
static class Program
|
||||
{
|
||||
/// Program information
|
||||
public static string Version; /// version string
|
||||
public static DateTime BuildDateTime; /// date and time of program build
|
||||
|
||||
/// log4net
|
||||
static ILog log;
|
||||
const string log4netConfigFName = "log4netConfig.xml";
|
||||
|
||||
/// Local settings
|
||||
public static readonly string LocAppDataDir;
|
||||
public static readonly string LocalSettingsFileName;
|
||||
public static readonly string LocalSettingsBackupName;
|
||||
public static LocalSettings LocalSettings;
|
||||
|
||||
static Program()
|
||||
{
|
||||
/// Program version string
|
||||
System.Reflection.Assembly thisAssembly = System.Reflection.Assembly.GetExecutingAssembly();
|
||||
Version ver = thisAssembly.GetName().Version;
|
||||
Version = string.Format("{0}.{1}.{2}", ver.Major, ver.Minor, ver.Build);
|
||||
BuildDateTime = new System.IO.FileInfo(thisAssembly.Location).LastWriteTime;
|
||||
|
||||
/// Local program configuration directory including the trailing backslash
|
||||
LocAppDataDir = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) +
|
||||
Path.DirectorySeparatorChar + "TestBenchFramework" + Path.DirectorySeparatorChar;
|
||||
LocalSettingsFileName = LocAppDataDir + "DeviceTest.xml";
|
||||
LocalSettingsBackupName = LocAppDataDir + "DeviceTest.backup.xml";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The main entry point for the application.
|
||||
/// </summary>
|
||||
[STAThread]
|
||||
static void Main()
|
||||
{
|
||||
///
|
||||
/// Load the local settings
|
||||
///
|
||||
Program.LocalSettings = LocalSettings.Load(Program.LocalSettingsFileName);
|
||||
if (Program.LocalSettings == null)
|
||||
{
|
||||
/// Loading local seetings from regular config file failed. Use the backup
|
||||
Program.LocalSettings = LocalSettings.Load(Program.LocalSettingsBackupName);
|
||||
if (Program.LocalSettings == null)
|
||||
{
|
||||
MessageBox.Show("Na tomto počítači nebol tento program ani raz spustený.\r\nPoužijú sa základné nastavenia.", "Upozornenie", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
|
||||
Program.LocalSettings = new LocalSettings();
|
||||
Directory.CreateDirectory(LocAppDataDir);
|
||||
Program.LocalSettings.Save();
|
||||
}
|
||||
else
|
||||
{
|
||||
LocalSettings.Save(); /// Save the settings to overwrite the wrong file
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/// Loading local seetings from the regular config file was successful. Update the backup
|
||||
File.Copy(Program.LocalSettingsFileName, Program.LocalSettingsBackupName, true);
|
||||
}
|
||||
|
||||
/// Configure and start logging
|
||||
log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(LocAppDataDir + log4netConfigFName));
|
||||
log = LogManager.GetLogger(typeof(Program));
|
||||
log.Fatal("--------------------------------------------------------------------------------");
|
||||
log.Fatal(string.Format("TBF ver.{0}", Version));
|
||||
|
||||
Application.EnableVisualStyles();
|
||||
Application.SetCompatibleTextRenderingDefault(false);
|
||||
|
||||
try
|
||||
{
|
||||
DeviceTestDlg dlg = new DeviceTestDlg();
|
||||
Application.Run(dlg);
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
LogException(log, "Exception in Application.Run(DeviceTestDlg)", exc);
|
||||
MessageBox.Show("Program havaroval:" +
|
||||
Environment.NewLine + Environment.NewLine + exc.Message +
|
||||
((exc.InnerException == null) ? string.Empty : (Environment.NewLine + exc.InnerException.Message)) +
|
||||
Environment.NewLine + exc.StackTrace,
|
||||
"Pozor!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
|
||||
}
|
||||
}
|
||||
|
||||
static void LogException(ILog log, string description, Exception e)
|
||||
{
|
||||
log.FatalFormat("---------------( {0} )---------------", description);
|
||||
log.FatalFormat("Message : {0}", e.Message);
|
||||
if (e.InnerException != null)
|
||||
{
|
||||
log.FatalFormat("InnerMessage : {0}", e.InnerException.Message);
|
||||
}
|
||||
log.FatalFormat("StackTrace : {0}{1}", Environment.NewLine, e.StackTrace);
|
||||
log.Fatal("--------------------------------------");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
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("DeviceTest")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("DeviceTest")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2016")]
|
||||
[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("a3e8ad92-6617-4f5c-88ce-346d28120fb7")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <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 DeviceTest.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", "4.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("DeviceTest.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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,117 @@
|
||||
<?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.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: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" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
</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" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
</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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <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 DeviceTest.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.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,3 @@
|
||||
<?xml version="1.0"?>
|
||||
<configuration>
|
||||
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
|
||||
@@ -0,0 +1,51 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>8.0.30703</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{439D0878-C76E-452B-B17D-209A89E91D36}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Dirichlet.Numerics</RootNamespace>
|
||||
<AssemblyName>Dirichlet.Numerics</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<TargetFrameworkProfile>Client</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="System" />
|
||||
<Reference Include="System.Numerics" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Int128.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="UInt128.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>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,36 @@
|
||||
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("Dirichlet.Numerics")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("Dirichlet.Numerics")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2012")]
|
||||
[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("a588abc0-c631-4475-9eab-4163d9f81fed")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,13 @@
|
||||
Copyright 2014 Rick Sladkey
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
@@ -0,0 +1,94 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
|
||||
namespace GemCard
|
||||
{
|
||||
/// <summary>
|
||||
/// This class represents a command APDU
|
||||
/// </summary>
|
||||
public class APDUCommand
|
||||
{
|
||||
/// <summary>
|
||||
/// Minimun size of an APDU command in bytes
|
||||
/// </summary>
|
||||
public const int APDU_MIN_LENGTH = 4;
|
||||
|
||||
public byte Class; /// Class byte
|
||||
public byte Ins; /// Instruction byte
|
||||
public byte P1; /// Parameter P1 byte
|
||||
public byte P2; /// Parameter P2 byte
|
||||
public byte[] Data; /// Data to send to the card if any, null if no data to send
|
||||
public byte Le; /// Number of data expected, 0 if none
|
||||
|
||||
/// <summary>
|
||||
/// Constructor
|
||||
/// </summary>
|
||||
/// <param name="bCla">Class byte</param>
|
||||
/// <param name="bIns">Instruction byte</param>
|
||||
/// <param name="bP1">Parameter P1 byte</param>
|
||||
/// <param name="bP2">Parameter P2 byte</param>
|
||||
/// <param name="baData">Data to send to the card if any, null if no data to send</param>
|
||||
/// <param name="bLe">Number of data expected, 0 if none</param>
|
||||
public APDUCommand(byte bCla, byte bIns, byte bP1, byte bP2, byte[] baData, byte bLe)
|
||||
{
|
||||
this.Class = bCla;
|
||||
this.Ins = bIns;
|
||||
this.P1 = bP1;
|
||||
this.P2 = bP2;
|
||||
this.Data = baData;
|
||||
this.Le = bLe;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Update the current APDU with selected parameters
|
||||
/// </summary>
|
||||
/// <param name="apduParam">APDU parameters</param>
|
||||
public void Update(APDUParam apduParam)
|
||||
{
|
||||
if (apduParam.UseData) Data = apduParam.Data;
|
||||
if (apduParam.UseLe) Le = apduParam.Le;
|
||||
if (apduParam.UseP1) P1 = apduParam.P1;
|
||||
if (apduParam.UseP2) P2 = apduParam.P2;
|
||||
if (apduParam.UseChannel) Class += apduParam.Channel;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Overrides the ToString method to format to a string the APDUCommand object
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public override string ToString()
|
||||
{
|
||||
string strData = null;
|
||||
byte bLc = 0;
|
||||
byte bP3 = Le;
|
||||
|
||||
if (Data != null)
|
||||
{
|
||||
StringBuilder sData = new StringBuilder(Data.Length * 2);
|
||||
for (int nI = 0; nI < Data.Length; nI++)
|
||||
{
|
||||
sData.AppendFormat("{0:X02}", Data[nI]);
|
||||
}
|
||||
|
||||
strData = "Data=" + sData.ToString();
|
||||
bLc = (byte) Data.Length;
|
||||
bP3 = bLc;
|
||||
}
|
||||
|
||||
//string strApdu = string.Format("Class={0:X02} Ins={1:X02} P1={2:X02} P2={3:X02} Le={4:X02} Lc={5:X02} ",
|
||||
//m_bCla, m_bIns, m_bP1, m_bP2, m_bLe, bLc);
|
||||
StringBuilder strApdu = new StringBuilder();
|
||||
|
||||
strApdu.AppendFormat("Class={0:X02} Ins={1:X02} P1={2:X02} P2={3:X02} P3={4:X02} ",
|
||||
Class, Ins, P1, P2, bP3);
|
||||
|
||||
if (Data != null)
|
||||
{
|
||||
strApdu.Append(strData);
|
||||
}
|
||||
|
||||
return strApdu.ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,147 @@
|
||||
using System;
|
||||
|
||||
namespace GemCard
|
||||
{
|
||||
/// <summary>
|
||||
/// This class is used to update a set of parameters of an APDUCommand object
|
||||
/// </summary>
|
||||
public class APDUParam
|
||||
{
|
||||
byte bClass;
|
||||
byte bChannel;
|
||||
byte bP2;
|
||||
byte bP1;
|
||||
|
||||
byte[] baData;
|
||||
short nLe;
|
||||
|
||||
bool fUseP1;
|
||||
bool fUseP2;
|
||||
bool fChannel;
|
||||
bool fData;
|
||||
bool fClass;
|
||||
bool fLe;
|
||||
|
||||
/// <summary>
|
||||
/// Resets the current instance, all flags are set to false
|
||||
/// </summary>
|
||||
public void Reset()
|
||||
{
|
||||
bClass = 0;
|
||||
bChannel = 0;
|
||||
bP2 = 0;
|
||||
bP1 = 0;
|
||||
|
||||
baData = null;
|
||||
nLe = -1;
|
||||
|
||||
fUseP1 = false;
|
||||
fUseP2 = false;
|
||||
fChannel = false;
|
||||
fData = false;
|
||||
fClass = false;
|
||||
fLe = false;
|
||||
}
|
||||
|
||||
#region Constructors
|
||||
|
||||
public APDUParam()
|
||||
{
|
||||
Reset();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Copy constructor (used for cloning)
|
||||
/// </summary>
|
||||
/// <param name="param"></param>
|
||||
public APDUParam(APDUParam param)
|
||||
{
|
||||
// Copy field
|
||||
if (param.baData != null)
|
||||
{
|
||||
param.baData.CopyTo(baData, 0);
|
||||
}
|
||||
|
||||
this.bClass = param.bClass;
|
||||
this.bChannel = param.bChannel;
|
||||
this.bP1 = param.bP1;
|
||||
this.bP2 = param.bP2;
|
||||
this.nLe = param.nLe;
|
||||
|
||||
// Copy flags field
|
||||
this.fChannel = param.fChannel;
|
||||
this.fClass = param.fClass;
|
||||
this.fData = param.fData;
|
||||
this.fLe = param.fLe;
|
||||
this.fUseP1 = param.fUseP1;
|
||||
this.fUseP2 = param.fUseP2;
|
||||
}
|
||||
|
||||
public APDUParam(byte bClass, byte bP1, byte bP2, byte[] baData, short nLe)
|
||||
{
|
||||
this.Class = bClass;
|
||||
this.P1 = bP1;
|
||||
this.P2 = bP2;
|
||||
this.Data = baData;
|
||||
this.Le = (byte)nLe;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// Clones the current APDUParam instance
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public APDUParam Clone()
|
||||
{
|
||||
return new APDUParam(this);
|
||||
}
|
||||
|
||||
#region Properties
|
||||
|
||||
public bool UseClass { get { return fClass; } }
|
||||
public bool UseChannel { get { return fChannel; } }
|
||||
public bool UseLe { get { return fLe; } }
|
||||
public bool UseData { get { return fData; } }
|
||||
public bool UseP1 { get { return fUseP1; } }
|
||||
public bool UseP2 { get { return fUseP2; } }
|
||||
|
||||
public byte P1
|
||||
{
|
||||
get { return bP1; }
|
||||
set { bP1 = value; fUseP1 = true; }
|
||||
}
|
||||
|
||||
public byte P2
|
||||
{
|
||||
get { return bP2; }
|
||||
set { bP2 = value; fUseP2 = true; }
|
||||
}
|
||||
|
||||
public byte[] Data
|
||||
{
|
||||
get { return baData; }
|
||||
set { baData = value; fData = true; }
|
||||
}
|
||||
|
||||
public byte Le
|
||||
{
|
||||
get { return (byte)nLe; }
|
||||
set { nLe = value; fLe = true; }
|
||||
}
|
||||
|
||||
public byte Channel
|
||||
{
|
||||
get { return bChannel; }
|
||||
set { bChannel = value; fChannel = true; }
|
||||
}
|
||||
|
||||
public byte Class
|
||||
{
|
||||
get { return bClass; }
|
||||
set { bClass = value; fClass = true; }
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
|
||||
namespace GemCard
|
||||
{
|
||||
/// <summary>
|
||||
/// This class represents the APDU response sent by the card
|
||||
/// </summary>
|
||||
public class APDUResponse
|
||||
{
|
||||
/// <summary>
|
||||
/// Status bytes length
|
||||
/// </summary>
|
||||
public const int SW_LENGTH = 2;
|
||||
|
||||
/// <summary>
|
||||
/// Response data. Contains the data sent by the card minus the 2 status bytes (SW1, SW2)
|
||||
/// null if no data were sent by the card
|
||||
/// </summary>
|
||||
public byte[] Data;
|
||||
public byte SW1;
|
||||
public byte SW2;
|
||||
|
||||
/// <summary>
|
||||
/// Status get property
|
||||
/// </summary>
|
||||
public ushort Status
|
||||
{
|
||||
get { return (ushort)(((short)SW1 << 8) + (short)SW2); }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Constructor from the byte data sent back by the card
|
||||
/// </summary>
|
||||
/// <param name="baData">Buffer of data from the card</param>
|
||||
public APDUResponse(byte[] baData)
|
||||
{
|
||||
if (baData.Length > SW_LENGTH)
|
||||
{
|
||||
Data = new byte[baData.Length - SW_LENGTH];
|
||||
|
||||
for (int nI = 0; nI < baData.Length - SW_LENGTH; nI++)
|
||||
{
|
||||
this.Data[nI] = baData[nI];
|
||||
}
|
||||
}
|
||||
|
||||
this.SW1 = baData[baData.Length - 2];
|
||||
this.SW2 = baData[baData.Length - 1];
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Overrides the ToString method to format to a string the APDUResponse object
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public override string ToString()
|
||||
{
|
||||
if (Data != null)
|
||||
{
|
||||
StringBuilder sData = new StringBuilder(Data.Length * 2);
|
||||
for (int nI = 0; nI < Data.Length; nI++)
|
||||
{
|
||||
sData.AppendFormat("{0:X02}", Data[nI]);
|
||||
}
|
||||
|
||||
return sData.ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
|
||||
//
|
||||
// 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("")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("")]
|
||||
[assembly: AssemblyCopyright("")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
//
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Revision and Build Numbers
|
||||
// by using the '*' as shown below:
|
||||
|
||||
[assembly: AssemblyVersion("1.0.*")]
|
||||
|
||||
//
|
||||
// In order to sign your assembly you must specify a key to use. Refer to the
|
||||
// Microsoft .NET Framework documentation for more information on assembly signing.
|
||||
//
|
||||
// Use the attributes below to control which key is used for signing.
|
||||
//
|
||||
// Notes:
|
||||
// (*) If no key is specified, the assembly is not signed.
|
||||
// (*) KeyName refers to a key that has been installed in the Crypto Service
|
||||
// Provider (CSP) on your machine. KeyFile refers to a file which contains
|
||||
// a key.
|
||||
// (*) If the KeyFile and the KeyName values are both specified, the
|
||||
// following processing occurs:
|
||||
// (1) If the KeyName can be found in the CSP, that key is used.
|
||||
// (2) If the KeyName does not exist and the KeyFile does exist, the key
|
||||
// in the KeyFile is installed into the CSP and used.
|
||||
// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
|
||||
// When specifying the KeyFile, the location of the KeyFile should be
|
||||
// relative to the project output directory which is
|
||||
// %Project Directory%\obj\<configuration>. For example, if your KeyFile is
|
||||
// located in the project directory, you would specify the AssemblyKeyFile
|
||||
// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
|
||||
// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
|
||||
// documentation for more information on this.
|
||||
//
|
||||
[assembly: AssemblyDelaySign(false)]
|
||||
[assembly: AssemblyKeyFile("")]
|
||||
[assembly: AssemblyKeyName("")]
|
||||
@@ -0,0 +1,162 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
|
||||
namespace GemCard
|
||||
{
|
||||
/// <summary>
|
||||
/// Values for AttrId of SCardGetAttrib
|
||||
/// </summary>
|
||||
public class SCARD_ATTR_VALUE
|
||||
{
|
||||
private const uint
|
||||
SCARD_CLASS_COMMUNICATIONS = 2,
|
||||
SCARD_CLASS_PROTOCOL = 3,
|
||||
SCARD_CLASS_MECHANICAL = 6,
|
||||
SCARD_CLASS_VENDOR_DEFINED = 7,
|
||||
SCARD_CLASS_IFD_PROTOCOL = 8,
|
||||
SCARD_CLASS_ICC_STATE = 9,
|
||||
SCARD_CLASS_SYSTEM = 0x7fff;
|
||||
|
||||
private static UInt32 SCardAttrValue(UInt32 attrClass, UInt32 val)
|
||||
{
|
||||
return (attrClass << 16) | val;
|
||||
}
|
||||
|
||||
public static UInt32 CHANNEL_ID { get { return SCardAttrValue(SCARD_CLASS_COMMUNICATIONS, 0x0110); } }
|
||||
|
||||
public static UInt32 CHARACTERISTICS { get { return SCardAttrValue(SCARD_CLASS_MECHANICAL, 0x0150); } }
|
||||
|
||||
public static UInt32 CURRENT_PROTOCOL_TYPE { get { return SCardAttrValue(SCARD_CLASS_IFD_PROTOCOL, 0x0201); } }
|
||||
|
||||
public static UInt32 DEVICE_UNIT { get { return SCardAttrValue(SCARD_CLASS_SYSTEM, 0x0001); } }
|
||||
public static UInt32 DEVICE_FRIENDLY_NAME { get { return SCardAttrValue(SCARD_CLASS_SYSTEM, 0x0003); } }
|
||||
public UInt32 DEVICE_SYSTEM_NAME { get { return SCardAttrValue(SCARD_CLASS_SYSTEM, 0x0004); } }
|
||||
|
||||
public static UInt32 ICC_PRESENCE { get { return SCardAttrValue(SCARD_CLASS_ICC_STATE, 0x0300); } }
|
||||
public static UInt32 ICC_INTERFACE_STATUS { get { return SCardAttrValue(SCARD_CLASS_ICC_STATE, 0x0301); } }
|
||||
public static UInt32 ATR_STRING { get { return SCardAttrValue(SCARD_CLASS_ICC_STATE, 0x0303); } }
|
||||
public static UInt32 ICC_TYPE_PER_ATR { get { return SCardAttrValue(SCARD_CLASS_ICC_STATE, 0x0304); } }
|
||||
|
||||
public static UInt32 PROTOCOL_TYPES { get { return SCardAttrValue(SCARD_CLASS_PROTOCOL, 0x0120); } }
|
||||
|
||||
public static UInt32 VENDOR_NAME { get { return SCardAttrValue(SCARD_CLASS_VENDOR_DEFINED, 0x0100); } }
|
||||
public static UInt32 VENDOR_IFD_TYPE { get { return SCardAttrValue(SCARD_CLASS_VENDOR_DEFINED, 0x0101); } }
|
||||
public static UInt32 VENDOR_IFD_VERSION { get { return SCardAttrValue(SCARD_CLASS_VENDOR_DEFINED, 0x0102); } }
|
||||
public static UInt32 VENDOR_IFD_SERIAL_NO { get { return SCardAttrValue(SCARD_CLASS_VENDOR_DEFINED, 0x0103); } }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Abstract class that adds a basic event management to the ICard interface.
|
||||
/// </summary>
|
||||
abstract public class CardBase : ICard
|
||||
{
|
||||
protected const uint INFINITE = 0xFFFFFFFF;
|
||||
protected const uint WAIT_TIME = 250;
|
||||
|
||||
protected bool m_bRunCardDetection = true;
|
||||
protected Thread m_thread = null;
|
||||
|
||||
/// <summary>
|
||||
/// Event handler for the card insertion
|
||||
/// </summary>
|
||||
public event EventHandler<CardInsertedEventArgs> OnCardInserted = null;
|
||||
|
||||
/// <summary>
|
||||
/// Event handler for the card removal
|
||||
/// </summary>
|
||||
public event EventHandler<CardRemovedEventArgs> OnCardRemoved = null;
|
||||
|
||||
~CardBase()
|
||||
{
|
||||
// Stop any eventual card detection thread
|
||||
StopCardEvents();
|
||||
}
|
||||
|
||||
#region Abstract method that implement the ICard interface
|
||||
abstract public string[] ListReaders();
|
||||
abstract public void Connect(string Reader, SHARE ShareMode, PROTOCOL PreferredProtocols);
|
||||
abstract public void Disconnect(DISCONNECT Disposition);
|
||||
abstract public APDUResponse Transmit(APDUCommand ApduCmd);
|
||||
abstract public void BeginTransaction();
|
||||
abstract public void EndTransaction(DISCONNECT Disposition);
|
||||
abstract public byte[] GetAttribute(UInt32 AttribId);
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// This method should start a thread that checks for card insertion or removal
|
||||
/// </summary>
|
||||
/// <param name="Reader"></param>
|
||||
public void StartCardEvents(string Reader)
|
||||
{
|
||||
if (m_thread == null)
|
||||
{
|
||||
m_bRunCardDetection = true;
|
||||
|
||||
m_thread = new Thread(new ParameterizedThreadStart(RunCardDetection));
|
||||
m_thread.Start(Reader);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Stops the card events thread
|
||||
/// </summary>
|
||||
public void StopCardEvents()
|
||||
{
|
||||
if (m_thread != null)
|
||||
{
|
||||
int
|
||||
nTimeOut = 10,
|
||||
nCount = 0;
|
||||
bool m_bStop = false;
|
||||
m_bRunCardDetection = false;
|
||||
|
||||
do
|
||||
{
|
||||
if (nCount > nTimeOut)
|
||||
{
|
||||
m_thread.Abort();
|
||||
break;
|
||||
}
|
||||
|
||||
if (m_thread.ThreadState == ThreadState.Aborted)
|
||||
m_bStop = true;
|
||||
|
||||
if (m_thread.ThreadState == ThreadState.Stopped)
|
||||
m_bStop = true;
|
||||
|
||||
Thread.Sleep(200);
|
||||
++nCount; // Manage time out
|
||||
}
|
||||
while (!m_bStop);
|
||||
|
||||
m_thread = null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This function must implement a card detection mechanism.
|
||||
///
|
||||
/// When card insertion is detected, it must call the method CardInserted()
|
||||
/// When card removal is detected, it must call the method CardRemoved()
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="Reader">Name of the reader to scan for card event</param>
|
||||
abstract protected void RunCardDetection(object Reader);
|
||||
|
||||
#region Event methods
|
||||
|
||||
protected void CardInserted(object sender, CardInsertedEventArgs args)
|
||||
{
|
||||
if (OnCardInserted != null) OnCardInserted(sender, args);
|
||||
}
|
||||
|
||||
protected void CardRemoved(object sender, CardRemovedEventArgs args)
|
||||
{
|
||||
if (OnCardRemoved != null) OnCardRemoved(sender, args);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,173 @@
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
using SCARDSSPLib;
|
||||
using GemCardExLib;
|
||||
|
||||
namespace GemCard
|
||||
{
|
||||
/// <summary>
|
||||
/// Implements the ICard interface using the SCard COM objects from Microsoft and SCardDatabaseEx object
|
||||
/// for the ListReaders function.
|
||||
/// </summary>
|
||||
public class CardCOM : CardBase
|
||||
{
|
||||
private ISCard m_itfCard = null;
|
||||
|
||||
/// <summary>
|
||||
/// Default constructor
|
||||
/// </summary>
|
||||
public CardCOM()
|
||||
{
|
||||
// Create the SCard object
|
||||
m_itfCard = new CSCardClass();
|
||||
}
|
||||
|
||||
#region ICard Members
|
||||
|
||||
/// <summary>
|
||||
/// Wraps the PCSC function
|
||||
/// LONG SCardListReaders(SCARDCONTEXT hContext,
|
||||
/// LPCTSTR mszGroups,
|
||||
/// LPTSTR mszReaders,
|
||||
/// LPDWORD pcchReaders
|
||||
/// );
|
||||
/// </summary>
|
||||
/// <returns>A string array of the readers</returns>
|
||||
public override string[] ListReaders()
|
||||
{
|
||||
ISCardDatabaseEx itfCardBase = new SCardDatabaseEx();
|
||||
|
||||
return (string[]) itfCardBase.ListReaders();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Wraps the PCSC function
|
||||
/// LONG SCardConnect(
|
||||
/// IN SCARDCONTEXT hContext,
|
||||
/// IN LPCTSTR szReader,
|
||||
/// IN DWORD dwShareMode,
|
||||
/// IN DWORD dwPreferredProtocols,
|
||||
/// OUT LPSCARDHANDLE phCard,
|
||||
/// OUT LPDWORD pdwActiveProtocol
|
||||
/// );
|
||||
/// </summary>
|
||||
/// <param name="Reader"></param>
|
||||
/// <param name="ShareMode"></param>
|
||||
/// <param name="PreferredProtocols"></param>
|
||||
public override void Connect(string Reader, SHARE ShareMode, PROTOCOL PreferredProtocols)
|
||||
{
|
||||
// Calls AttachReader to connect to the card
|
||||
m_itfCard.AttachByReader(Reader, (SCARD_SHARE_MODES) ShareMode, (SCARD_PROTOCOLS) PreferredProtocols);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Wraps the PCSC function
|
||||
/// LONG SCardDisconnect(
|
||||
/// IN SCARDHANDLE hCard,
|
||||
/// IN DWORD dwDisposition
|
||||
/// );
|
||||
/// </summary>
|
||||
/// <param name="Disposition"></param>
|
||||
public override void Disconnect(DISCONNECT Disposition)
|
||||
{
|
||||
// Off the connection with the card
|
||||
m_itfCard.Detach((SCARD_DISPOSITIONS) Disposition);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Wraps the PCSC function
|
||||
/// LONG SCardTransmit(
|
||||
/// SCARDHANDLE hCard,
|
||||
/// LPCSCARD_I0_REQUEST pioSendPci,
|
||||
/// LPCBYTE pbSendBuffer,
|
||||
/// DWORD cbSendLength,
|
||||
/// LPSCARD_IO_REQUEST pioRecvPci,
|
||||
/// LPBYTE pbRecvBuffer,
|
||||
/// LPDWORD pcbRecvLength
|
||||
/// );
|
||||
/// </summary>
|
||||
/// <param name="ApduCmd">APDUCommand object with the APDU to send to the card</param>
|
||||
/// <returns>An APDUResponse object with the response from the card</returns>
|
||||
public override APDUResponse Transmit(APDUCommand ApduCmd)
|
||||
{
|
||||
CSCardCmd itfCmd = new CSCardCmdClass();
|
||||
CByteBuffer itfData = new CByteBufferClass();
|
||||
int nLe = ApduCmd.Le;
|
||||
|
||||
if (ApduCmd.Data == null)
|
||||
{
|
||||
itfData.SetSize(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
int nWrite = 0;
|
||||
|
||||
itfData.SetSize(ApduCmd.Data.Length);
|
||||
itfData.Write(ref ApduCmd.Data[0], ApduCmd.Data.Length, ref nWrite);
|
||||
}
|
||||
|
||||
// Build the APDU command
|
||||
itfCmd.BuildCmd(ApduCmd.Class, ApduCmd.Ins, ApduCmd.P1, ApduCmd.P2, itfData, ref nLe);
|
||||
|
||||
// Send the command
|
||||
m_itfCard.Transaction(ref itfCmd);
|
||||
|
||||
// Analyse the response
|
||||
int nRead = 0;
|
||||
byte[] pbResp = new byte[itfCmd.ApduReplyLength];
|
||||
|
||||
itfCmd.ApduReply.Read(ref pbResp[0], itfCmd.ApduReplyLength, ref nRead);
|
||||
|
||||
return new APDUResponse(pbResp);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Wraps the PSCS function
|
||||
/// LONG SCardBeginTransaction(
|
||||
/// SCARDHANDLE hCard
|
||||
// );
|
||||
/// This function is not supported in the COM implementation
|
||||
/// </summary>
|
||||
public override void BeginTransaction()
|
||||
{
|
||||
throw new NotImplementedException("BeginTransaction is not supported in the COM implementation");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Wraps the PCSC function
|
||||
/// LONG SCardEndTransaction(
|
||||
/// SCARDHANDLE hCard,
|
||||
/// DWORD dwDisposition
|
||||
/// );
|
||||
/// This function is not supported in the COM implementation
|
||||
/// </summary>
|
||||
/// <param name="Disposition">A value from DISCONNECT enum</param>
|
||||
public override void EndTransaction(DISCONNECT Disposition)
|
||||
{
|
||||
throw new NotImplementedException("EndTransaction is not supported in the COM implementation");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the attributes of the card
|
||||
/// </summary>
|
||||
/// <param name="AttribId">Identifier for the Attribute to get</param>
|
||||
/// <returns>Attribute content</returns>
|
||||
public override byte[] GetAttribute(UInt32 AttribId)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// This function must implement a card detection mechanism.
|
||||
///
|
||||
/// When card insertion is detected, it must call the method CardInserted()
|
||||
/// When card removal is detected, it must call the method CardRemoved()
|
||||
///
|
||||
/// </summary>
|
||||
protected override void RunCardDetection(object Reader)
|
||||
{
|
||||
throw new Exception("The method or operation is not implemented.");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
using System;
|
||||
|
||||
namespace GemCard
|
||||
{
|
||||
public class CardInsertedEventArgs : EventArgs
|
||||
{
|
||||
public CardInsertedEventArgs() { }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,620 @@
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
|
||||
namespace GemCard
|
||||
{
|
||||
/// <summary>
|
||||
/// CARD_STATE enumeration, used by the PC/SC function SCardGetStatusChanged
|
||||
/// </summary>
|
||||
enum CARD_STATE
|
||||
{
|
||||
UNAWARE = 0x00000000,
|
||||
IGNORE = 0x00000001,
|
||||
CHANGED = 0x00000002,
|
||||
UNKNOWN = 0x00000004,
|
||||
UNAVAILABLE = 0x00000008,
|
||||
EMPTY = 0x00000010,
|
||||
PRESENT = 0x00000020,
|
||||
ATRMATCH = 0x00000040,
|
||||
EXCLUSIVE = 0x00000080,
|
||||
INUSE = 0x00000100,
|
||||
MUTE = 0x00000200,
|
||||
UNPOWERED = 0x00000400
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Wraps the SCARD_IO_STRUCTURE
|
||||
///
|
||||
/// </summary>
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct SCard_IO_Request
|
||||
{
|
||||
public UInt32 m_dwProtocol;
|
||||
public UInt32 m_cbPciLength;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Wraps theSCARD_READERSTATE structure of PC/SC
|
||||
/// </summary>
|
||||
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
|
||||
public struct SCard_ReaderState
|
||||
{
|
||||
public string m_szReader;
|
||||
public IntPtr m_pvUserData;
|
||||
public UInt32 m_dwCurrentState;
|
||||
public UInt32 m_dwEventState;
|
||||
public UInt32 m_cbAtr;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst=32)]
|
||||
public byte[] m_rgbAtr;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Implementation of ICard using native (P/Invoke) interoperability for PC/SC
|
||||
/// </summary>
|
||||
public class CardNative : CardBase
|
||||
{
|
||||
private UInt32 m_hContext = 0;
|
||||
private UInt32 m_hCard = 0;
|
||||
private UInt32 m_nProtocol = (uint) PROTOCOL.T0;
|
||||
private int m_nLastError = 0;
|
||||
|
||||
#region PCSC_FUNCTIONS
|
||||
/// <summary>
|
||||
/// Native SCardGetStatusChanged from winscard.dll
|
||||
/// </summary>
|
||||
/// <param name="hContext"></param>
|
||||
/// <param name="dwTimeout"></param>
|
||||
/// <param name="rgReaderStates"></param>
|
||||
/// <param name="cReaders"></param>
|
||||
/// <returns></returns>
|
||||
[DllImport("winscard.dll", SetLastError = true)]
|
||||
internal static extern int SCardGetStatusChange(UInt32 hContext,
|
||||
UInt32 dwTimeout,
|
||||
[In,Out] SCard_ReaderState[] rgReaderStates,
|
||||
UInt32 cReaders);
|
||||
|
||||
/// <summary>
|
||||
/// Native SCardListReaders function from winscard.dll
|
||||
/// </summary>
|
||||
/// <param name="hContext"></param>
|
||||
/// <param name="mszGroups"></param>
|
||||
/// <param name="mszReaders"></param>
|
||||
/// <param name="pcchReaders"></param>
|
||||
/// <returns></returns>
|
||||
[DllImport("winscard.dll", SetLastError=true)]
|
||||
internal static extern int SCardListReaders(UInt32 hContext,
|
||||
[MarshalAs(UnmanagedType.LPTStr)] string mszGroups,
|
||||
IntPtr mszReaders,
|
||||
out UInt32 pcchReaders);
|
||||
|
||||
/// <summary>
|
||||
/// Native SCardEstablishContext function from winscard.dll
|
||||
/// </summary>
|
||||
/// <param name="dwScope"></param>
|
||||
/// <param name="pvReserved1"></param>
|
||||
/// <param name="pvReserved2"></param>
|
||||
/// <param name="phContext"></param>
|
||||
/// <returns></returns>
|
||||
[DllImport("winscard.dll", SetLastError=true)]
|
||||
internal static extern int SCardEstablishContext(UInt32 dwScope,
|
||||
IntPtr pvReserved1,
|
||||
IntPtr pvReserved2,
|
||||
IntPtr phContext);
|
||||
|
||||
/// <summary>
|
||||
/// Native SCardReleaseContext function from winscard.dll
|
||||
/// </summary>
|
||||
/// <param name="hContext"></param>
|
||||
/// <returns></returns>
|
||||
[DllImport("winscard.dll", SetLastError=true)]
|
||||
internal static extern int SCardReleaseContext(UInt32 hContext);
|
||||
|
||||
/// <summary>
|
||||
/// Native SCardConnect function from winscard.dll
|
||||
/// </summary>
|
||||
/// <param name="hContext"></param>
|
||||
/// <param name="szReader"></param>
|
||||
/// <param name="dwShareMode"></param>
|
||||
/// <param name="dwPreferredProtocols"></param>
|
||||
/// <param name="phCard"></param>
|
||||
/// <param name="pdwActiveProtocol"></param>
|
||||
/// <returns></returns>
|
||||
[DllImport("winscard.dll", SetLastError=true, CharSet=CharSet.Auto)]
|
||||
internal static extern int SCardConnect(UInt32 hContext,
|
||||
[MarshalAs(UnmanagedType.LPTStr)] string szReader,
|
||||
UInt32 dwShareMode,
|
||||
UInt32 dwPreferredProtocols,
|
||||
IntPtr phCard,
|
||||
IntPtr pdwActiveProtocol);
|
||||
|
||||
/// <summary>
|
||||
/// Native SCardDisconnect function from winscard.dll
|
||||
/// </summary>
|
||||
/// <param name="hCard"></param>
|
||||
/// <param name="dwDisposition"></param>
|
||||
/// <returns></returns>
|
||||
[DllImport("winscard.dll", SetLastError=true)]
|
||||
internal static extern int SCardDisconnect(UInt32 hCard,
|
||||
UInt32 dwDisposition);
|
||||
|
||||
/// <summary>
|
||||
/// Native SCardTransmit function from winscard.dll
|
||||
/// </summary>
|
||||
/// <param name="hCard"></param>
|
||||
/// <param name="pioSendPci"></param>
|
||||
/// <param name="pbSendBuffer"></param>
|
||||
/// <param name="cbSendLength"></param>
|
||||
/// <param name="pioRecvPci"></param>
|
||||
/// <param name="pbRecvBuffer"></param>
|
||||
/// <param name="pcbRecvLength"></param>
|
||||
/// <returns></returns>
|
||||
[DllImport("winscard.dll", SetLastError=true)]
|
||||
internal static extern int SCardTransmit(UInt32 hCard,
|
||||
[In] ref SCard_IO_Request pioSendPci,
|
||||
byte[] pbSendBuffer,
|
||||
UInt32 cbSendLength,
|
||||
IntPtr pioRecvPci,
|
||||
[Out] byte[] pbRecvBuffer,
|
||||
out UInt32 pcbRecvLength
|
||||
);
|
||||
|
||||
/// <summary>
|
||||
/// Native SCardBeginTransaction function of winscard.dll
|
||||
/// </summary>
|
||||
/// <param name="hContext"></param>
|
||||
/// <returns></returns>
|
||||
[DllImport("winscard.dll", SetLastError = true)]
|
||||
internal static extern int SCardBeginTransaction(UInt32 hContext);
|
||||
|
||||
/// <summary>
|
||||
/// Native SCardEndTransaction function of winscard.dll
|
||||
/// </summary>
|
||||
/// <param name="hContext"></param>
|
||||
/// <returns></returns>
|
||||
[DllImport("winscard.dll", SetLastError = true)]
|
||||
internal static extern int SCardEndTransaction(UInt32 hContext, UInt32 dwDisposition);
|
||||
|
||||
[DllImport("winscard.dll", SetLastError = true)]
|
||||
internal static extern int SCardGetAttrib(UInt32 hCard,
|
||||
UInt32 dwAttribId,
|
||||
[Out] byte[] pbAttr,
|
||||
out UInt32 pcbAttrLen);
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// Default constructor
|
||||
/// </summary>
|
||||
public CardNative()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Object destruction
|
||||
/// </summary>
|
||||
~CardNative()
|
||||
{
|
||||
Disconnect(DISCONNECT.Unpower);
|
||||
|
||||
ReleaseContext();
|
||||
}
|
||||
|
||||
#region ICard Members
|
||||
|
||||
/// <summary>
|
||||
/// Wraps the PCSC function
|
||||
/// LONG SCardListReaders(SCARDCONTEXT hContext,
|
||||
/// LPCTSTR mszGroups,
|
||||
/// LPTSTR mszReaders,
|
||||
/// LPDWORD pcchReaders
|
||||
/// );
|
||||
/// </summary>
|
||||
/// <returns>A string array of the readers</returns>
|
||||
public override string[] ListReaders()
|
||||
{
|
||||
EstablishContext(SCOPE.User);
|
||||
|
||||
string[] sListReaders = null;
|
||||
UInt32 pchReaders = 0;
|
||||
IntPtr szListReaders = IntPtr.Zero;
|
||||
|
||||
m_nLastError = SCardListReaders(m_hContext, null, szListReaders, out pchReaders);
|
||||
if (m_nLastError == 0)
|
||||
{
|
||||
szListReaders = Marshal.AllocHGlobal((int) pchReaders);
|
||||
m_nLastError = SCardListReaders(m_hContext, null, szListReaders, out pchReaders);
|
||||
if (m_nLastError == 0)
|
||||
{
|
||||
char[] caReadersData = new char[pchReaders];
|
||||
int nbReaders = 0;
|
||||
for (int nI = 0; nI < pchReaders; nI++)
|
||||
{
|
||||
caReadersData[nI] = (char) Marshal.ReadByte(szListReaders, nI);
|
||||
|
||||
if (caReadersData[nI] == 0)
|
||||
nbReaders++;
|
||||
}
|
||||
|
||||
// Remove last 0
|
||||
--nbReaders;
|
||||
|
||||
if (nbReaders != 0)
|
||||
{
|
||||
sListReaders = new string[nbReaders];
|
||||
char[] caReader = new char[pchReaders];
|
||||
int nIdx = 0;
|
||||
int nIdy = 0;
|
||||
int nIdz = 0;
|
||||
// Get the nJ string from the multi-string
|
||||
|
||||
while(nIdx < pchReaders - 1)
|
||||
{
|
||||
caReader[nIdy] = caReadersData[nIdx];
|
||||
if (caReader[nIdy] == 0)
|
||||
{
|
||||
sListReaders[nIdz] = new string(caReader, 0, nIdy);
|
||||
++nIdz;
|
||||
nIdy = 0;
|
||||
caReader = new char[pchReaders];
|
||||
}
|
||||
else
|
||||
++nIdy;
|
||||
|
||||
++nIdx;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Marshal.FreeHGlobal(szListReaders);
|
||||
}
|
||||
|
||||
ReleaseContext();
|
||||
|
||||
return sListReaders;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Wraps the PCSC function
|
||||
/// LONG SCardEstablishContext(
|
||||
/// IN DWORD dwScope,
|
||||
/// IN LPCVOID pvReserved1,
|
||||
/// IN LPCVOID pvReserved2,
|
||||
/// OUT LPSCARDCONTEXT phContext
|
||||
/// );
|
||||
/// </summary>
|
||||
/// <param name="Scope"></param>
|
||||
public void EstablishContext(SCOPE Scope)
|
||||
{
|
||||
IntPtr hContext = Marshal.AllocHGlobal(Marshal.SizeOf(m_hContext));
|
||||
|
||||
m_nLastError = SCardEstablishContext((uint) Scope, IntPtr.Zero, IntPtr.Zero, hContext);
|
||||
if (m_nLastError != 0)
|
||||
{
|
||||
string msg = "SCardEstablishContext error: " + m_nLastError;
|
||||
|
||||
Marshal.FreeHGlobal(hContext);
|
||||
throw new Exception(msg);
|
||||
}
|
||||
|
||||
m_hContext = (uint) Marshal.ReadInt32(hContext);
|
||||
|
||||
Marshal.FreeHGlobal(hContext);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Wraps the PCSC function
|
||||
/// LONG SCardReleaseContext(
|
||||
/// IN SCARDCONTEXT hContext
|
||||
/// );
|
||||
/// </summary>
|
||||
public void ReleaseContext()
|
||||
{
|
||||
if (m_hContext != 0)
|
||||
{
|
||||
m_nLastError = SCardReleaseContext(m_hContext);
|
||||
|
||||
if (m_nLastError != 0)
|
||||
{
|
||||
string msg = "SCardReleaseContext error: " + m_nLastError;
|
||||
throw new Exception(msg);
|
||||
}
|
||||
|
||||
m_hContext = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Wraps the PCSC function
|
||||
/// LONG SCardConnect(
|
||||
/// IN SCARDCONTEXT hContext,
|
||||
/// IN LPCTSTR szReader,
|
||||
/// IN DWORD dwShareMode,
|
||||
/// IN DWORD dwPreferredProtocols,
|
||||
/// OUT LPSCARDHANDLE phCard,
|
||||
/// OUT LPDWORD pdwActiveProtocol
|
||||
/// );
|
||||
/// </summary>
|
||||
/// <param name="Reader"></param>
|
||||
/// <param name="ShareMode"></param>
|
||||
/// <param name="PreferredProtocols"></param>
|
||||
public override void Connect(string Reader, SHARE ShareMode, PROTOCOL PreferredProtocols)
|
||||
{
|
||||
EstablishContext(SCOPE.User);
|
||||
|
||||
IntPtr hCard = Marshal.AllocHGlobal(Marshal.SizeOf(m_hCard));
|
||||
IntPtr pProtocol = Marshal.AllocHGlobal(Marshal.SizeOf(m_nProtocol));
|
||||
|
||||
m_nLastError = SCardConnect(m_hContext,
|
||||
Reader,
|
||||
(uint) ShareMode,
|
||||
(uint) PreferredProtocols,
|
||||
hCard,
|
||||
pProtocol);
|
||||
|
||||
if (m_nLastError != 0)
|
||||
{
|
||||
string msg = "SCardConnect error: " + m_nLastError;
|
||||
|
||||
Marshal.FreeHGlobal(hCard);
|
||||
Marshal.FreeHGlobal(pProtocol);
|
||||
throw new Exception(msg);
|
||||
}
|
||||
|
||||
m_hCard = (uint) Marshal.ReadInt32(hCard);
|
||||
m_nProtocol = (uint) Marshal.ReadInt32(pProtocol);
|
||||
|
||||
Marshal.FreeHGlobal(hCard);
|
||||
Marshal.FreeHGlobal(pProtocol);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Wraps the PCSC function
|
||||
/// LONG SCardDisconnect(
|
||||
/// IN SCARDHANDLE hCard,
|
||||
/// IN DWORD dwDisposition
|
||||
/// );
|
||||
/// </summary>
|
||||
/// <param name="Disposition"></param>
|
||||
public override void Disconnect(DISCONNECT Disposition)
|
||||
{
|
||||
if (m_hCard != 0)
|
||||
{
|
||||
m_nLastError = SCardDisconnect(m_hCard, (uint) Disposition);
|
||||
m_hCard = 0;
|
||||
|
||||
if (m_nLastError != 0)
|
||||
{
|
||||
string msg = "SCardDisconnect error: " + m_nLastError;
|
||||
throw new Exception(msg);
|
||||
}
|
||||
|
||||
ReleaseContext();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Wraps the PCSC function
|
||||
/// LONG SCardTransmit(
|
||||
/// SCARDHANDLE hCard,
|
||||
/// LPCSCARD_I0_REQUEST pioSendPci,
|
||||
/// LPCBYTE pbSendBuffer,
|
||||
/// DWORD cbSendLength,
|
||||
/// LPSCARD_IO_REQUEST pioRecvPci,
|
||||
/// LPBYTE pbRecvBuffer,
|
||||
/// LPDWORD pcbRecvLength
|
||||
/// );
|
||||
/// </summary>
|
||||
/// <param name="ApduCmd">APDUCommand object with the APDU to send to the card</param>
|
||||
/// <returns>An APDUResponse object with the response from the card</returns>
|
||||
public override APDUResponse Transmit(APDUCommand ApduCmd)
|
||||
{
|
||||
uint RecvLength = (uint) (ApduCmd.Le + APDUResponse.SW_LENGTH);
|
||||
byte[] ApduBuffer = null;
|
||||
byte[] ApduResponse = new byte[ApduCmd.Le + APDUResponse.SW_LENGTH];
|
||||
SCard_IO_Request ioRequest = new SCard_IO_Request();
|
||||
ioRequest.m_dwProtocol = m_nProtocol;
|
||||
ioRequest.m_cbPciLength = 8;
|
||||
|
||||
// Build the command APDU
|
||||
if (ApduCmd.Data == null)
|
||||
{
|
||||
ApduBuffer = new byte[APDUCommand.APDU_MIN_LENGTH + ((ApduCmd.Le != 0) ? 1 : 0)];
|
||||
|
||||
if (ApduCmd.Le != 0)
|
||||
ApduBuffer[4] = (byte) ApduCmd.Le;
|
||||
}
|
||||
else
|
||||
{
|
||||
ApduBuffer = new byte[APDUCommand.APDU_MIN_LENGTH + 1 + ApduCmd.Data.Length];
|
||||
|
||||
for (int nI = 0; nI < ApduCmd.Data.Length; nI++)
|
||||
ApduBuffer[APDUCommand.APDU_MIN_LENGTH + 1 + nI] = ApduCmd.Data[nI];
|
||||
|
||||
ApduBuffer[APDUCommand.APDU_MIN_LENGTH] = (byte) ApduCmd.Data.Length;
|
||||
}
|
||||
|
||||
ApduBuffer[0] = ApduCmd.Class;
|
||||
ApduBuffer[1] = ApduCmd.Ins;
|
||||
ApduBuffer[2] = ApduCmd.P1;
|
||||
ApduBuffer[3] = ApduCmd.P2;
|
||||
|
||||
m_nLastError = SCardTransmit(m_hCard, ref ioRequest, ApduBuffer, (uint) ApduBuffer.Length, IntPtr.Zero, ApduResponse, out RecvLength);
|
||||
if (m_nLastError != 0)
|
||||
{
|
||||
string msg = "SCardTransmit error: " + m_nLastError;
|
||||
throw new Exception(msg);
|
||||
}
|
||||
|
||||
byte[] ApduData = new byte[RecvLength];
|
||||
|
||||
for (int nI = 0; nI < RecvLength; nI++)
|
||||
ApduData[nI] = ApduResponse[nI];
|
||||
|
||||
return new APDUResponse(ApduData);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Wraps the PSCS function
|
||||
/// LONG SCardBeginTransaction(
|
||||
/// SCARDHANDLE hCard
|
||||
// );
|
||||
/// </summary>
|
||||
public override void BeginTransaction()
|
||||
{
|
||||
if (m_hCard != 0)
|
||||
{
|
||||
m_nLastError = SCardBeginTransaction(m_hCard);
|
||||
if (m_nLastError != 0)
|
||||
{
|
||||
string msg = "SCardBeginTransaction error: " + m_nLastError;
|
||||
throw new Exception(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Wraps the PCSC function
|
||||
/// LONG SCardEndTransaction(
|
||||
/// SCARDHANDLE hCard,
|
||||
/// DWORD dwDisposition
|
||||
/// );
|
||||
/// </summary>
|
||||
/// <param name="Disposition">A value from DISCONNECT enum</param>
|
||||
public override void EndTransaction(DISCONNECT Disposition)
|
||||
{
|
||||
if (m_hCard != 0)
|
||||
{
|
||||
m_nLastError = SCardEndTransaction(m_hCard, (UInt32)Disposition);
|
||||
if (m_nLastError != 0)
|
||||
{
|
||||
string msg = "SCardEndTransaction error: " + m_nLastError;
|
||||
throw new Exception(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the attributes of the card
|
||||
/// </summary>
|
||||
/// <param name="AttribId">Identifier for the Attribute to get</param>
|
||||
/// <returns>Attribute content</returns>
|
||||
public override byte[] GetAttribute(UInt32 AttribId)
|
||||
{
|
||||
byte[] attr = null;
|
||||
UInt32 attrLen = 0;
|
||||
|
||||
m_nLastError = SCardGetAttrib(m_hCard, AttribId, attr, out attrLen);
|
||||
if (m_nLastError == 0)
|
||||
{
|
||||
if (attrLen != 0)
|
||||
{
|
||||
attr = new byte[attrLen];
|
||||
m_nLastError = SCardGetAttrib(m_hCard, AttribId, attr, out attrLen);
|
||||
if (m_nLastError != 0)
|
||||
{
|
||||
string msg = "SCardGetAttr error: " + m_nLastError;
|
||||
throw new Exception(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
string msg = "SCardGetAttr error: " + m_nLastError;
|
||||
throw new Exception(msg);
|
||||
}
|
||||
|
||||
return attr;
|
||||
}
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// This function must implement a card detection mechanism.
|
||||
///
|
||||
/// When card insertion is detected, it must call the method CardInserted()
|
||||
/// When card removal is detected, it must call the method CardRemoved()
|
||||
///
|
||||
/// </summary>
|
||||
protected override void RunCardDetection(object Reader)
|
||||
{
|
||||
bool bFirstLoop = true;
|
||||
UInt32 hContext = 0; // Local context
|
||||
IntPtr phContext;
|
||||
|
||||
phContext = Marshal.AllocHGlobal(Marshal.SizeOf(hContext));
|
||||
|
||||
if (SCardEstablishContext((uint) SCOPE.User, IntPtr.Zero, IntPtr.Zero, phContext) == 0)
|
||||
{
|
||||
hContext = (uint)Marshal.ReadInt32(phContext);
|
||||
Marshal.FreeHGlobal(phContext);
|
||||
|
||||
UInt32 nbReaders = 1;
|
||||
SCard_ReaderState[] readerState = new SCard_ReaderState[nbReaders];
|
||||
|
||||
readerState[0].m_dwCurrentState = (UInt32) CARD_STATE.UNAWARE;
|
||||
readerState[0].m_szReader = (string)Reader;
|
||||
|
||||
UInt32 eventState;
|
||||
UInt32 currentState = readerState[0].m_dwCurrentState;
|
||||
|
||||
// Card detection loop
|
||||
do
|
||||
{
|
||||
if (SCardGetStatusChange(hContext, WAIT_TIME
|
||||
, readerState, nbReaders) == 0)
|
||||
{
|
||||
eventState = readerState[0].m_dwEventState;
|
||||
currentState = readerState[0].m_dwCurrentState;
|
||||
|
||||
// Check state
|
||||
if (((eventState & (uint) CARD_STATE.CHANGED) == (uint) CARD_STATE.CHANGED) && !bFirstLoop)
|
||||
{
|
||||
// State has changed
|
||||
if ((eventState & (uint) CARD_STATE.EMPTY) == (uint) CARD_STATE.EMPTY)
|
||||
{
|
||||
// There is no card, card has been removed -> Fire CardRemoved event
|
||||
CardRemoved(this, new CardRemovedEventArgs());
|
||||
}
|
||||
|
||||
if (((eventState & (uint)CARD_STATE.PRESENT) == (uint)CARD_STATE.PRESENT) &&
|
||||
((eventState & (uint) CARD_STATE.PRESENT) != (currentState & (uint) CARD_STATE.PRESENT)))
|
||||
{
|
||||
// There is a card in the reader -> Fire CardInserted event
|
||||
CardInserted(this, new CardInsertedEventArgs());
|
||||
}
|
||||
|
||||
if ((eventState & (uint) CARD_STATE.ATRMATCH) == (uint) CARD_STATE.ATRMATCH)
|
||||
{
|
||||
// There is a card in the reader and it matches the ATR we were expecting-> Fire CardInserted event
|
||||
CardInserted(this, new CardInsertedEventArgs());
|
||||
}
|
||||
}
|
||||
|
||||
// The current stateis now the event state
|
||||
readerState[0].m_dwCurrentState = eventState;
|
||||
|
||||
bFirstLoop = false;
|
||||
}
|
||||
|
||||
Thread.Sleep(100);
|
||||
|
||||
if (m_bRunCardDetection == false)
|
||||
break;
|
||||
}
|
||||
while (true); // Exit on request
|
||||
}
|
||||
else
|
||||
{
|
||||
Marshal.FreeHGlobal(phContext);
|
||||
throw new Exception("PC/SC error");
|
||||
}
|
||||
|
||||
SCardReleaseContext(hContext);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
using System;
|
||||
|
||||
namespace GemCard
|
||||
{
|
||||
public class CardRemovedEventArgs : EventArgs
|
||||
{
|
||||
public CardRemovedEventArgs() { }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,194 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
|
||||
<PropertyGroup>
|
||||
<ProjectType>Local</ProjectType>
|
||||
<ProductVersion>8.0.50727</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{8B10D15A-39DE-4B56-8DD1-710C1EB3A697}</ProjectGuid>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ApplicationIcon>
|
||||
</ApplicationIcon>
|
||||
<AssemblyKeyContainerName>
|
||||
</AssemblyKeyContainerName>
|
||||
<AssemblyName>GemCard</AssemblyName>
|
||||
<AssemblyOriginatorKeyFile>
|
||||
</AssemblyOriginatorKeyFile>
|
||||
<DefaultClientScript>JScript</DefaultClientScript>
|
||||
<DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
|
||||
<DefaultTargetSchema>IE50</DefaultTargetSchema>
|
||||
<DelaySign>false</DelaySign>
|
||||
<OutputType>Library</OutputType>
|
||||
<RootNamespace>GemCard</RootNamespace>
|
||||
<RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
|
||||
<StartupObject>
|
||||
</StartupObject>
|
||||
<FileUpgradeFlags>
|
||||
</FileUpgradeFlags>
|
||||
<UpgradeBackupLocation>
|
||||
</UpgradeBackupLocation>
|
||||
<OldToolsVersion>3.5</OldToolsVersion>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<PublishUrl>publish\</PublishUrl>
|
||||
<Install>true</Install>
|
||||
<InstallFrom>Disk</InstallFrom>
|
||||
<UpdateEnabled>false</UpdateEnabled>
|
||||
<UpdateMode>Foreground</UpdateMode>
|
||||
<UpdateInterval>7</UpdateInterval>
|
||||
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
|
||||
<UpdatePeriodically>false</UpdatePeriodically>
|
||||
<UpdateRequired>false</UpdateRequired>
|
||||
<MapFileExtensions>true</MapFileExtensions>
|
||||
<ApplicationRevision>0</ApplicationRevision>
|
||||
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
|
||||
<IsWebBootstrapper>false</IsWebBootstrapper>
|
||||
<UseApplicationTrust>false</UseApplicationTrust>
|
||||
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||
<TargetFrameworkProfile />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
<BaseAddress>285212672</BaseAddress>
|
||||
<CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
|
||||
<ConfigurationOverrideFile>
|
||||
</ConfigurationOverrideFile>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<DocumentationFile>
|
||||
</DocumentationFile>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<FileAlignment>4096</FileAlignment>
|
||||
<NoStdLib>false</NoStdLib>
|
||||
<NoWarn>
|
||||
</NoWarn>
|
||||
<Optimize>false</Optimize>
|
||||
<RegisterForComInterop>false</RegisterForComInterop>
|
||||
<RemoveIntegerChecks>false</RemoveIntegerChecks>
|
||||
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
<BaseAddress>285212672</BaseAddress>
|
||||
<CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
|
||||
<ConfigurationOverrideFile>
|
||||
</ConfigurationOverrideFile>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<DocumentationFile>
|
||||
</DocumentationFile>
|
||||
<DebugSymbols>false</DebugSymbols>
|
||||
<FileAlignment>4096</FileAlignment>
|
||||
<NoStdLib>false</NoStdLib>
|
||||
<NoWarn>
|
||||
</NoWarn>
|
||||
<Optimize>true</Optimize>
|
||||
<RegisterForComInterop>false</RegisterForComInterop>
|
||||
<RemoveIntegerChecks>false</RemoveIntegerChecks>
|
||||
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<OutputPath>bin\x86\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<BaseAddress>285212672</BaseAddress>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
<FileAlignment>4096</FileAlignment>
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
|
||||
<CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
|
||||
<CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
|
||||
<OutputPath>bin\x86\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<BaseAddress>285212672</BaseAddress>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
<Optimize>true</Optimize>
|
||||
<FileAlignment>4096</FileAlignment>
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
|
||||
<CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System">
|
||||
<Name>System</Name>
|
||||
</Reference>
|
||||
<Reference Include="System.Data">
|
||||
<Name>System.Data</Name>
|
||||
</Reference>
|
||||
<Reference Include="System.Xml">
|
||||
<Name>System.XML</Name>
|
||||
</Reference>
|
||||
<COMReference Include="GemCardExLib">
|
||||
<Guid>{F1FF634B-BEDF-461C-A409-5B88E05F5117}</Guid>
|
||||
<VersionMajor>1</VersionMajor>
|
||||
<VersionMinor>0</VersionMinor>
|
||||
<Lcid>0</Lcid>
|
||||
<WrapperTool>tlbimp</WrapperTool>
|
||||
<Isolated>False</Isolated>
|
||||
</COMReference>
|
||||
<COMReference Include="SCARDSSPLib">
|
||||
<Guid>{82C38704-19F1-11D3-A11F-00C04F79F800}</Guid>
|
||||
<VersionMajor>1</VersionMajor>
|
||||
<VersionMinor>0</VersionMinor>
|
||||
<Lcid>0</Lcid>
|
||||
<WrapperTool>tlbimp</WrapperTool>
|
||||
</COMReference>
|
||||
<COMReference Include="stdole">
|
||||
<Guid>{00020430-0000-0000-C000-000000000046}</Guid>
|
||||
<VersionMajor>2</VersionMajor>
|
||||
<VersionMinor>0</VersionMinor>
|
||||
<Lcid>0</Lcid>
|
||||
<WrapperTool>primary</WrapperTool>
|
||||
<Isolated>False</Isolated>
|
||||
</COMReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="APDUCommand.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="APDUParam.cs" />
|
||||
<Compile Include="APDUResponse.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="AssemblyInfo.cs" />
|
||||
<Compile Include="CardBase.cs" />
|
||||
<Compile Include="CardInsertedEventArgs.cs" />
|
||||
<Compile Include="CardNative.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="CardRemovedEventArgs.cs" />
|
||||
<Compile Include="ICard.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="SmartCardException.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
|
||||
<Install>false</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 3.5 SP1</ProductName>
|
||||
<Install>true</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>Windows Installer 3.1</ProductName>
|
||||
<Install>true</Install>
|
||||
</BootstrapperPackage>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
<PropertyGroup>
|
||||
<PreBuildEvent>
|
||||
</PreBuildEvent>
|
||||
<PostBuildEvent>
|
||||
</PostBuildEvent>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,70 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<LastOpenVersion>8.0.50215</LastOpenVersion>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ReferencePath>
|
||||
</ReferencePath>
|
||||
<CopyProjectDestinationFolder>
|
||||
</CopyProjectDestinationFolder>
|
||||
<CopyProjectUncPath>
|
||||
</CopyProjectUncPath>
|
||||
<CopyProjectOption>0</CopyProjectOption>
|
||||
<ProjectView>ProjectFiles</ProjectView>
|
||||
<ProjectTrust>0</ProjectTrust>
|
||||
<PublishUrlHistory />
|
||||
<InstallUrlHistory />
|
||||
<SupportUrlHistory />
|
||||
<UpdateUrlHistory />
|
||||
<BootstrapperUrlHistory />
|
||||
<ErrorReportUrlHistory />
|
||||
<FallbackCulture>en-US</FallbackCulture>
|
||||
<VerifyUploadedFiles>false</VerifyUploadedFiles>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<EnableASPDebugging>false</EnableASPDebugging>
|
||||
<EnableASPXDebugging>false</EnableASPXDebugging>
|
||||
<EnableUnmanagedDebugging>false</EnableUnmanagedDebugging>
|
||||
<EnableSQLServerDebugging>false</EnableSQLServerDebugging>
|
||||
<RemoteDebugEnabled>false</RemoteDebugEnabled>
|
||||
<RemoteDebugMachine>
|
||||
</RemoteDebugMachine>
|
||||
<StartAction>Project</StartAction>
|
||||
<StartArguments>
|
||||
</StartArguments>
|
||||
<StartPage>
|
||||
</StartPage>
|
||||
<StartProgram>
|
||||
</StartProgram>
|
||||
<StartURL>
|
||||
</StartURL>
|
||||
<StartWorkingDirectory>
|
||||
</StartWorkingDirectory>
|
||||
<StartWithIE>true</StartWithIE>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<EnableASPDebugging>false</EnableASPDebugging>
|
||||
<EnableASPXDebugging>false</EnableASPXDebugging>
|
||||
<EnableUnmanagedDebugging>false</EnableUnmanagedDebugging>
|
||||
<EnableSQLServerDebugging>false</EnableSQLServerDebugging>
|
||||
<RemoteDebugEnabled>false</RemoteDebugEnabled>
|
||||
<RemoteDebugMachine>
|
||||
</RemoteDebugMachine>
|
||||
<StartAction>Project</StartAction>
|
||||
<StartArguments>
|
||||
</StartArguments>
|
||||
<StartPage>
|
||||
</StartPage>
|
||||
<StartProgram>
|
||||
</StartProgram>
|
||||
<StartURL>
|
||||
</StartURL>
|
||||
<StartWorkingDirectory>
|
||||
</StartWorkingDirectory>
|
||||
<StartWithIE>false</StartWithIE>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
|
||||
<StartWithIE>true</StartWithIE>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,149 @@
|
||||
using System;
|
||||
|
||||
namespace GemCard
|
||||
{
|
||||
/// <summary>
|
||||
/// This interface gives access to the basic card functions. It must be implemented by a class.
|
||||
/// </summary>
|
||||
public interface ICard
|
||||
{
|
||||
/// <summary>
|
||||
/// Wraps the PCSC funciton
|
||||
/// LONG SCardListReaders(SCARDCONTEXT hContext,
|
||||
/// LPCTSTR mszGroups,
|
||||
/// LPTSTR mszReaders,
|
||||
/// LPDWORD pcchReaders
|
||||
/// );
|
||||
/// </summary>
|
||||
/// <returns>A string array of the readers</returns>
|
||||
string[] ListReaders();
|
||||
|
||||
/// <summary>
|
||||
/// Wraps the PCSC function
|
||||
/// LONG SCardConnect(
|
||||
/// IN SCARDCONTEXT hContext,
|
||||
/// IN LPCTSTR szReader,
|
||||
/// IN DWORD dwShareMode,
|
||||
/// IN DWORD dwPreferredProtocols,
|
||||
/// OUT LPSCARDHANDLE phCard,
|
||||
/// OUT LPDWORD pdwActiveProtocol
|
||||
/// );
|
||||
/// </summary>
|
||||
/// <param name="Reader"></param>
|
||||
/// <param name="ShareMode"></param>
|
||||
/// <param name="PreferredProtocols"></param>
|
||||
void Connect(string Reader, SHARE ShareMode, PROTOCOL PreferredProtocols);
|
||||
|
||||
/// <summary>
|
||||
/// Wraps the PCSC function
|
||||
/// LONG SCardDisconnect(
|
||||
/// IN SCARDHANDLE hCard,
|
||||
/// IN DWORD dwDisposition
|
||||
/// );
|
||||
/// </summary>
|
||||
/// <param name="Disposition"></param>
|
||||
void Disconnect(DISCONNECT Disposition);
|
||||
|
||||
/// <summary>
|
||||
/// Wraps the PCSC function
|
||||
/// LONG SCardTransmit(
|
||||
/// SCARDHANDLE hCard,
|
||||
/// LPCSCARD_I0_REQUEST pioSendPci,
|
||||
/// LPCBYTE pbSendBuffer,
|
||||
/// DWORD cbSendLength,
|
||||
/// LPSCARD_IO_REQUEST pioRecvPci,
|
||||
/// LPBYTE pbRecvBuffer,
|
||||
/// LPDWORD pcbRecvLength
|
||||
/// );
|
||||
/// </summary>
|
||||
/// <param name="ApduCmd">APDUCommand object with the APDU to send to the card</param>
|
||||
/// <returns>An APDUResponse object with the response from the card</returns>
|
||||
APDUResponse Transmit(APDUCommand ApduCmd);
|
||||
|
||||
/// <summary>
|
||||
/// Wraps the PSCS function
|
||||
/// LONG SCardBeginTransaction(
|
||||
/// SCARDHANDLE hCard
|
||||
// );
|
||||
/// </summary>
|
||||
void BeginTransaction();
|
||||
|
||||
/// <summary>
|
||||
/// Wraps the PCSC function
|
||||
/// LONG SCardEndTransaction(
|
||||
/// SCARDHANDLE hCard,
|
||||
/// DWORD dwDisposition
|
||||
/// );
|
||||
/// </summary>
|
||||
void EndTransaction(DISCONNECT Disposition);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the attributes of the card
|
||||
/// </summary>
|
||||
/// <param name="AttribId">Identifier for the Attribute to get</param>
|
||||
/// <returns>Attribute content</returns>
|
||||
byte[] GetAttribute(UInt32 AttribId);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// SCOPE context
|
||||
/// </summary>
|
||||
public enum SCOPE
|
||||
{
|
||||
/// <summary>
|
||||
/// The context is a user context, and any database operations are performed within the
|
||||
/// domain of the user.
|
||||
/// </summary>
|
||||
User,
|
||||
|
||||
/// <summary>
|
||||
/// The context is that of the current terminal, and any database operations are performed
|
||||
/// within the domain of that terminal. (The calling application must have appropriate
|
||||
/// access permissions for any database actions.)
|
||||
/// </summary>
|
||||
Terminal,
|
||||
|
||||
/// <summary>
|
||||
/// The context is the system context, and any database operations are performed within the
|
||||
/// domain of the system. (The calling application must have appropriate access
|
||||
/// permissions for any database actions.)
|
||||
/// </summary>
|
||||
System
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// SHARE mode enumeration
|
||||
/// </summary>
|
||||
public enum SHARE
|
||||
{
|
||||
Exclusive = 1, /// This app. is not willing to share this card with other applications.
|
||||
Shared, /// This app. is willing to share this card with other applications.
|
||||
Direct, /// This app. demands direct control of the reader, so it is not available to other applications.
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// PROTOCOL enumeration
|
||||
/// </summary>
|
||||
public enum PROTOCOL
|
||||
{
|
||||
Undefined = 0x00000000, /// There is no active protocol.
|
||||
T0 = 0x00000001, /// T=0 is the active protocol.
|
||||
T1 = 0x00000002, /// T=1 is the active protocol.
|
||||
T0orT1 = T0 | T1, /// T=1 or T=0 can be the active protocol
|
||||
Raw = 0x00010000, /// Raw is the active protocol.
|
||||
Default = unchecked ((int) 0x80000000), /// Use implicit PTS.
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// DISCONNECT action enumeration
|
||||
/// </summary>
|
||||
public enum DISCONNECT
|
||||
{
|
||||
Leave, /// Don't do anything special on close
|
||||
Reset, /// Reset the card on close
|
||||
Unpower, /// Power down the card on close
|
||||
Eject, /// Eject(!) the card on close
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
using System;
|
||||
|
||||
namespace GemCard
|
||||
{
|
||||
/// <summary>
|
||||
/// Smart card exceptions
|
||||
/// </summary>
|
||||
public class SmartCardException : Exception
|
||||
{
|
||||
|
||||
public SmartCardException() : base("Smart card exception")
|
||||
{
|
||||
}
|
||||
|
||||
public SmartCardException(string Message) : base(Message)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public class ApduCommandException : Exception
|
||||
{
|
||||
public const string
|
||||
NotValidDocument = "The file is not a valid APDU command document",
|
||||
NoSuchCommand = "No such APDU command in the document",
|
||||
ParamLeFormat = "Le parameter format is not correct",
|
||||
ParamP3Format = "P3 parameter format is not correct",
|
||||
NoSuchSequence = "No such APDU sequence in the document",
|
||||
MissingApduOrCommand = "An Apdu or a Sequence is missing in this Sequence";
|
||||
|
||||
public ApduCommandException() : base("APDU command exception")
|
||||
{
|
||||
}
|
||||
|
||||
public ApduCommandException(string Message) : base(Message)
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
using System;
|
||||
using System.Drawing;
|
||||
|
||||
|
||||
|
||||
/* Copyright (c) 2008-2014 DI Zimmermann Stephan (stefan.zimmermann@tele2.at)
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
namespace GraphLib
|
||||
{
|
||||
public class BackBuffer
|
||||
{
|
||||
private Graphics graphics;
|
||||
private Bitmap memoryBitmap;
|
||||
private int width;
|
||||
private int height;
|
||||
|
||||
public BackBuffer()
|
||||
{
|
||||
width = 0;
|
||||
height = 0;
|
||||
}
|
||||
|
||||
public bool Init(Graphics g, int width, int height)
|
||||
{
|
||||
if (memoryBitmap != null)
|
||||
{
|
||||
memoryBitmap.Dispose();
|
||||
memoryBitmap = null;
|
||||
}
|
||||
|
||||
if (graphics != null)
|
||||
{
|
||||
graphics.Dispose();
|
||||
graphics = null;
|
||||
}
|
||||
|
||||
if (width == 0 || height == 0)
|
||||
return false;
|
||||
|
||||
if ((width != this.width) || (height != this.height) || graphics == null)
|
||||
{
|
||||
this.width = width;
|
||||
this.height = height;
|
||||
|
||||
memoryBitmap = new Bitmap(width, height);
|
||||
graphics = Graphics.FromImage(memoryBitmap);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void Render(Graphics g)
|
||||
{
|
||||
if (memoryBitmap != null)
|
||||
{
|
||||
g.DrawImage(memoryBitmap,
|
||||
new Rectangle(0, 0, width, height),
|
||||
0, 0, width, height,
|
||||
GraphicsUnit.Pixel);
|
||||
}
|
||||
}
|
||||
|
||||
public bool CanDoubleBuffer() { return graphics != null; }
|
||||
|
||||
public Graphics Graphics { get { return graphics; } }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,254 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Runtime.Serialization;
|
||||
using System.Runtime.Serialization.Formatters.Binary;
|
||||
using System.ComponentModel;
|
||||
using System.Drawing;
|
||||
|
||||
/* Copyright (c) 2008-2014 DI Zimmermann Stephan (stefan.zimmermann@tele2.at)
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
namespace GraphLib
|
||||
{
|
||||
public class DataSource
|
||||
{
|
||||
public delegate String OnDrawXAxisLabelEvent(DataSource src, int idx);
|
||||
public delegate String OnDrawYAxisLabelEvent(DataSource src, float value);
|
||||
|
||||
public OnDrawXAxisLabelEvent OnRenderXAxisLabel = null;
|
||||
public OnDrawYAxisLabelEvent OnRenderYAxisLabel = null;
|
||||
|
||||
private PointF[] samples = null;
|
||||
private int length = 0;
|
||||
|
||||
private String name = String.Empty;
|
||||
private int downSample = 1;
|
||||
private Color color = Color.Black;
|
||||
|
||||
public float VisibleDataRange_X = 0;
|
||||
public float DY = 0;
|
||||
public float YD0 = -200;
|
||||
public float YD1 = 200;
|
||||
public float Cur_YD0 = -200;
|
||||
public float Cur_YD1 = 200;
|
||||
|
||||
public float grid_distance_y = 200; // grid distance in units ( draw a horizontal line every 200 units )
|
||||
|
||||
public float off_Y = 0;
|
||||
public float grid_off_y = 0;
|
||||
|
||||
public bool yFlip = true;
|
||||
|
||||
public bool Active = true;
|
||||
|
||||
public float XAutoScaleOffset = 100;
|
||||
|
||||
public float CurGraphHeight = 1.0f;
|
||||
|
||||
public float CurGraphWidth = 1.0f;
|
||||
|
||||
private bool autoScaleY = false;
|
||||
private bool autoScaleX = false;
|
||||
|
||||
|
||||
public bool AutoScaleY
|
||||
{
|
||||
get { return autoScaleY; }
|
||||
set { autoScaleY = value; }
|
||||
}
|
||||
|
||||
public bool AutoScaleX
|
||||
{
|
||||
get { return autoScaleX; }
|
||||
set { autoScaleX = value; }
|
||||
}
|
||||
|
||||
public PointF[] Samples
|
||||
{
|
||||
get { return samples; }
|
||||
set
|
||||
{
|
||||
samples = value;
|
||||
length = samples.Length;
|
||||
}
|
||||
}
|
||||
|
||||
public float XMin
|
||||
{
|
||||
get
|
||||
{
|
||||
float x_min = float.MaxValue;
|
||||
if (samples != null && samples.Length > 0)
|
||||
{
|
||||
foreach (PointF p in samples) if (p.X < x_min) x_min=p.X;
|
||||
}
|
||||
return x_min;
|
||||
}
|
||||
}
|
||||
|
||||
public float XMax
|
||||
{
|
||||
get
|
||||
{
|
||||
float x_max = float.MinValue;
|
||||
if (samples != null && samples.Length > 0)
|
||||
{
|
||||
foreach (PointF p in samples) if (p.X > x_max) x_max = p.X;
|
||||
}
|
||||
return x_max;
|
||||
}
|
||||
}
|
||||
|
||||
public float YMin
|
||||
{
|
||||
get
|
||||
{
|
||||
float y_min = float.MaxValue;
|
||||
if (samples != null && samples.Length > 0)
|
||||
{
|
||||
foreach (PointF p in samples) if (p.Y < y_min) y_min = p.Y;
|
||||
}
|
||||
return y_min;
|
||||
}
|
||||
}
|
||||
|
||||
public float YMax
|
||||
{
|
||||
get
|
||||
{
|
||||
float y_max = float.MinValue;
|
||||
if (samples.Length > 0)
|
||||
{
|
||||
foreach (PointF p in samples) if (p.Y > y_max) y_max = p.Y;
|
||||
}
|
||||
return y_max;
|
||||
}
|
||||
}
|
||||
|
||||
public void SetDisplayRangeY(float y_start, float y_end)
|
||||
{
|
||||
YD0 = y_start;
|
||||
YD1 = y_end;
|
||||
}
|
||||
|
||||
public void SetGridDistanceY(float grid_dist_y_units)
|
||||
{
|
||||
grid_distance_y = grid_dist_y_units;
|
||||
}
|
||||
|
||||
public void SetGridOriginY(float off_y)
|
||||
{
|
||||
grid_off_y = off_y;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Load Samples from a file. Returns loaded points count.
|
||||
/// </summary>
|
||||
/// <param name="pathName">File pathname</param>
|
||||
/// <returns>Loaded points count</returns>
|
||||
public int LoadSamples(string pathName, out float yMin, out float yMax)
|
||||
{
|
||||
yMin = float.MaxValue;
|
||||
yMax = float.MinValue;
|
||||
try
|
||||
{
|
||||
Int64 size = new FileInfo(pathName).Length;
|
||||
if ((size % 8) != 0) return 0;
|
||||
int samplesCount = (int)(size / 8L) - 1;
|
||||
if (samplesCount <= 0) return 0;
|
||||
|
||||
PointF[] newSamples = new PointF[samplesCount];
|
||||
using (BinaryReader reader = new BinaryReader(File.Open(pathName, FileMode.Open)))
|
||||
{
|
||||
for (int i = 0; i < samplesCount; i++)
|
||||
{
|
||||
newSamples[i].X = reader.ReadSingle();
|
||||
newSamples[i].Y = reader.ReadSingle();
|
||||
}
|
||||
yMin = reader.ReadSingle();
|
||||
yMax = reader.ReadSingle();
|
||||
}
|
||||
|
||||
Samples = newSamples;
|
||||
return samplesCount;
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
[Category("Properties")] // Take this out, and you will soon have problems with serialization;
|
||||
[DefaultValue(typeof(string), "")]
|
||||
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
|
||||
public String Name
|
||||
{
|
||||
get { return name; }
|
||||
set { name = value; }
|
||||
}
|
||||
|
||||
[Category("Properties")] // Take this out, and you will soon have problems with serialization;
|
||||
[DefaultValue(typeof(Color), "")]
|
||||
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
|
||||
public Color GraphColor
|
||||
{
|
||||
get { return color; }
|
||||
set { color = value; }
|
||||
}
|
||||
|
||||
[Category("Properties")] // Take this out, and you will soon have problems with serialization;
|
||||
[DefaultValue(typeof(int), "0")]
|
||||
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
|
||||
public int Length
|
||||
{
|
||||
get { return length; }
|
||||
set
|
||||
{
|
||||
length = value;
|
||||
if (length != 0)
|
||||
{
|
||||
samples = new PointF[length];
|
||||
}
|
||||
else
|
||||
{
|
||||
// length is 0
|
||||
if (samples != null)
|
||||
{
|
||||
samples = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Category("Properties")] // Take this out, and you will soon have problems with serialization;
|
||||
[DefaultValue(typeof(int), "1")]
|
||||
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
|
||||
public int Downsampling
|
||||
{
|
||||
get { return downSample; }
|
||||
set { downSample = value; }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>8.0.50727</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{0C0A1F4D-1363-4544-A7C5-196C76D26CCA}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>ClassLibrary1</RootNamespace>
|
||||
<AssemblyName>GraphLib</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileUpgradeFlags>
|
||||
</FileUpgradeFlags>
|
||||
<UpgradeBackupLocation>
|
||||
</UpgradeBackupLocation>
|
||||
<OldToolsVersion>2.0</OldToolsVersion>
|
||||
</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="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Design" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="PlotterGraphPaneEx.cs">
|
||||
<SubType>UserControl</SubType>
|
||||
</Compile>
|
||||
<Compile Include="PlotterGraphPaneEx.Designer.cs">
|
||||
<DependentUpon>PlotterGraphPaneEx.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="PlotterDisplayEx.cs">
|
||||
<SubType>UserControl</SubType>
|
||||
</Compile>
|
||||
<Compile Include="PlotterDisplayEx.designer.cs">
|
||||
<DependentUpon>PlotterDisplayEx.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="BackBuffer.cs" />
|
||||
<Compile Include="PlotterGraphSelectCurvesForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="PlotterGraphSelectCurvesForm.Designer.cs">
|
||||
<DependentUpon>PlotterGraphSelectCurvesForm.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="DataSource.cs" />
|
||||
<Compile Include="PrintPreviewForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="PrintPreviewForm.Designer.cs">
|
||||
<DependentUpon>PrintPreviewForm.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Properties\Resources.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTime>True</DesignTime>
|
||||
<DependentUpon>Resources.resx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="PrecisionTimer.cs" />
|
||||
<Compile Include="Utils.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="PlotterGraphPaneEx.resx">
|
||||
<DependentUpon>PlotterGraphPaneEx.cs</DependentUpon>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="PlotterDisplayEx.resx">
|
||||
<DependentUpon>PlotterDisplayEx.cs</DependentUpon>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="PlotterGraphSelectCurvesForm.resx">
|
||||
<SubType>Designer</SubType>
|
||||
<DependentUpon>PlotterGraphSelectCurvesForm.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="PrintPreviewForm.resx">
|
||||
<SubType>Designer</SubType>
|
||||
<DependentUpon>PrintPreviewForm.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Properties\Resources.resx">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>ResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\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>
|
||||
-->
|
||||
<PropertyGroup>
|
||||
<PostBuildEvent>
|
||||
</PostBuildEvent>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,20 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 9.00
|
||||
# Visual Studio 2005
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GraphLib", "GraphLib.csproj", "{0C0A1F4D-1363-4544-A7C5-196C76D26CCA}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{0C0A1F4D-1363-4544-A7C5-196C76D26CCA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{0C0A1F4D-1363-4544-A7C5-196C76D26CCA}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{0C0A1F4D-1363-4544-A7C5-196C76D26CCA}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{0C0A1F4D-1363-4544-A7C5-196C76D26CCA}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
@@ -0,0 +1,404 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Drawing;
|
||||
using System.Data;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using System.Threading;
|
||||
using System.ComponentModel.Design;
|
||||
using System.Drawing.Drawing2D;
|
||||
|
||||
|
||||
/* Copyright (c) 2008-2014 DI Zimmermann Stephan (stefan.zimmermann@tele2.at)
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
namespace GraphLib
|
||||
{
|
||||
public partial class PlotterDisplayEx : UserControl
|
||||
{
|
||||
#region MEMBERS
|
||||
|
||||
delegate void InvokeVoidFuncDelegate();
|
||||
|
||||
PlotterGraphSelectCurvesForm GraphPropertiesForm = null;
|
||||
PrintPreviewForm printPreviewForm = null;
|
||||
|
||||
private PrecisionTimer.Timer mTimer = null;
|
||||
private float play_speed = 0.5f;
|
||||
private float play_speed_max = 10f;
|
||||
private float play_speed_min = 0.5f;
|
||||
|
||||
private bool paused = false;
|
||||
private bool isRunning = false;
|
||||
|
||||
#endregion
|
||||
|
||||
#region CONSTRUCTOR
|
||||
|
||||
public PlotterDisplayEx()
|
||||
{
|
||||
InitializeComponent();
|
||||
mTimer = new PrecisionTimer.Timer();
|
||||
mTimer.Period = 50; // 20 fps
|
||||
mTimer.Tick += new EventHandler(OnTimerTick);
|
||||
play_speed = 0.5f; // 20x10 = 200 values per second == sample frequency
|
||||
mTimer.Start();
|
||||
isRunning = false;
|
||||
}
|
||||
|
||||
void contextMenuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
|
||||
{
|
||||
String text = e.ClickedItem.Text;
|
||||
foreach (DataSource s in gPane.Sources)
|
||||
{
|
||||
if (s.Name == text)
|
||||
{
|
||||
s.Active ^= true;
|
||||
gPane.Invalidate();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region PROPERTIES
|
||||
|
||||
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
|
||||
[Editor(typeof(System.ComponentModel.Design.CollectionEditor),
|
||||
typeof(System.Drawing.Design.UITypeEditor))]
|
||||
public IList<DataSource> DataSources
|
||||
{
|
||||
get { return gPane.Sources; }
|
||||
}
|
||||
|
||||
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
|
||||
[Editor(typeof(System.ComponentModel.Design.CollectionEditor),
|
||||
typeof(System.Drawing.Design.UITypeEditor))]
|
||||
public PlotterGraphPaneEx.LayoutMode PanelLayout
|
||||
{
|
||||
get { return gPane.layout; }
|
||||
set { gPane.layout = value; }
|
||||
}
|
||||
|
||||
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
|
||||
[Editor(typeof(System.ComponentModel.Design.CollectionEditor),
|
||||
typeof(System.Drawing.Design.UITypeEditor))]
|
||||
public SmoothingMode Smoothing
|
||||
{
|
||||
get { return gPane.smoothing; }
|
||||
set { gPane.smoothing = value; }
|
||||
}
|
||||
|
||||
[Category("Playback")]
|
||||
[DefaultValue(typeof(bool), "true")]
|
||||
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
|
||||
public bool ShowMovingGrid
|
||||
{
|
||||
get { return gPane.hasMovingGrid; }
|
||||
set { gPane.hasMovingGrid = value; }
|
||||
}
|
||||
|
||||
|
||||
[Category("Properties")]
|
||||
[DefaultValue(typeof(Color), "")]
|
||||
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
|
||||
public Color BackgroundColorTop
|
||||
{
|
||||
get { return gPane.BgndColorTop; }
|
||||
set { gPane.BgndColorTop = value; }
|
||||
}
|
||||
|
||||
[Category("Properties")]
|
||||
[DefaultValue(typeof(Color), "")]
|
||||
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
|
||||
public Color BackgroundColorBot
|
||||
{
|
||||
get { return gPane.BgndColorBot; }
|
||||
set { gPane.BgndColorBot = value; }
|
||||
}
|
||||
|
||||
[Category("Properties")]
|
||||
[DefaultValue(typeof(Color), "")]
|
||||
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
|
||||
public Color DashedGridColor
|
||||
{
|
||||
get { return gPane.MinorGridColor; }
|
||||
set { gPane.MinorGridColor = value; }
|
||||
}
|
||||
|
||||
[Category("Properties")]
|
||||
[DefaultValue(typeof(Color), "")]
|
||||
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
|
||||
public Color SolidGridColor
|
||||
{
|
||||
get { return gPane.MajorGridColor; }
|
||||
set { gPane.MajorGridColor = value; }
|
||||
}
|
||||
|
||||
|
||||
public bool DoubleBuffering
|
||||
{
|
||||
get { return gPane.useDoubleBuffer; }
|
||||
set { gPane.useDoubleBuffer = value; }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region PUBLIC METHODS
|
||||
|
||||
public void SetDisplayRangeX(float x_start, float x_end )
|
||||
{
|
||||
gPane.XD0 = x_start;
|
||||
gPane.XD1 = x_end;
|
||||
gPane.CurXD0 = gPane.XD0;
|
||||
gPane.CurXD1 = gPane.XD1;
|
||||
}
|
||||
|
||||
public void SetGridDistanceX(float grid_dist_x_samples)
|
||||
{
|
||||
gPane.grid_distance_x = grid_dist_x_samples;
|
||||
}
|
||||
|
||||
public void SetGridOriginX(float off_x)
|
||||
{
|
||||
gPane.grid_off_x = off_x;
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
#region PRIVATE METHODS
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
paused = true;
|
||||
|
||||
if (mTimer.IsRunning)
|
||||
{
|
||||
mTimer.Stop();
|
||||
mTimer.Dispose();
|
||||
}
|
||||
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
public void Start()
|
||||
{
|
||||
if (isRunning == false && paused == false)
|
||||
{
|
||||
gPane.starting_idx = 0;
|
||||
paused = false;
|
||||
isRunning = true;
|
||||
// mTimer.Start();
|
||||
tb1.Buttons[0].ImageIndex = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (paused == false)
|
||||
{
|
||||
//mTimer.Stop();
|
||||
paused = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// mTimer.Start();
|
||||
paused = false;
|
||||
}
|
||||
|
||||
if (paused)
|
||||
{
|
||||
|
||||
tb1.Buttons[0].ImageIndex = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
tb1.Buttons[0].ImageIndex = 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Stop()
|
||||
{
|
||||
if (isRunning)
|
||||
{
|
||||
// mTimer.Stop();
|
||||
isRunning = false;
|
||||
paused = false;
|
||||
hScrollBar1.Value = 0;
|
||||
tb1.Buttons[0].ImageIndex = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void tb1_ButtonClick(object sender, ToolBarButtonClickEventArgs e)
|
||||
{
|
||||
bool pushed = e.Button.Pushed;
|
||||
switch (e.Button.Tag.ToString().ToLower())
|
||||
{
|
||||
case "play":
|
||||
|
||||
Start();
|
||||
|
||||
break;
|
||||
|
||||
case "stop":
|
||||
|
||||
Stop();
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void SetPlayPanelVisible()
|
||||
{
|
||||
panel1.Visible = true;
|
||||
tb1.Buttons[0].Visible = true;
|
||||
tb1.Buttons[1].Visible = true;
|
||||
}
|
||||
|
||||
private void SetPlayPanelInvisible()
|
||||
{
|
||||
panel1.Visible = false;
|
||||
tb1.Buttons[0].Visible = false;
|
||||
tb1.Buttons[1].Visible = false;
|
||||
|
||||
}
|
||||
|
||||
private void UpdateControl()
|
||||
{
|
||||
try
|
||||
{
|
||||
bool AllAutoscaled = true;
|
||||
|
||||
foreach (DataSource s in gPane.Sources)
|
||||
{
|
||||
AllAutoscaled &= s.AutoScaleX;
|
||||
}
|
||||
|
||||
|
||||
if (AllAutoscaled == true)
|
||||
{
|
||||
if (panel1.Visible == true)
|
||||
{
|
||||
this.Invoke(new MethodInvoker(SetPlayPanelInvisible));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (panel1.Visible == false)
|
||||
{
|
||||
this.Invoke(new MethodInvoker(SetPlayPanelVisible));
|
||||
}
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdatePlayback()
|
||||
{
|
||||
if (!paused && isRunning == true)
|
||||
{
|
||||
try
|
||||
{
|
||||
gPane.starting_idx += play_speed;
|
||||
UpdateScrollBar();
|
||||
gPane.Invalidate();
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
}
|
||||
|
||||
private void OnTimerTick(object sender, EventArgs e)
|
||||
{
|
||||
UpdateControl();
|
||||
|
||||
UpdatePlayback();
|
||||
}
|
||||
|
||||
private void UpdateScrollBar()
|
||||
{
|
||||
if (InvokeRequired)
|
||||
{
|
||||
Invoke(new MethodInvoker(UpdateScrollBar));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (gPane.Sources.Count > 0)
|
||||
{
|
||||
if (gPane.starting_idx > gPane.Sources[0].Length)
|
||||
{
|
||||
hScrollBar1.Value = 10000;
|
||||
}
|
||||
else if (gPane.starting_idx >= 0)
|
||||
{
|
||||
hScrollBar1.Value = 10000 * (int)gPane.starting_idx / gPane.Sources[0].Length;
|
||||
}
|
||||
else
|
||||
{
|
||||
hScrollBar1.Value = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
hScrollBar1.Value = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void OnScrollbarScroll(object sender, ScrollEventArgs e)
|
||||
{
|
||||
if (gPane.Sources.Count > 0)
|
||||
{
|
||||
int val = hScrollBar1.Value;
|
||||
|
||||
int maxLen = 0;
|
||||
foreach (var s in DataSources)
|
||||
{
|
||||
if (s.Length > maxLen) maxLen = s.Length;
|
||||
}
|
||||
|
||||
gPane.starting_idx = (int)(maxLen * (float)val / 10000.0f);
|
||||
gPane.Invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private void selectGraphsToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (GraphPropertiesForm == null)
|
||||
{
|
||||
GraphPropertiesForm = new PlotterGraphSelectCurvesForm();
|
||||
}
|
||||
|
||||
GraphPropertiesForm.GraphPanel = this.gPane;
|
||||
GraphPropertiesForm.Show();
|
||||
// GraphPropertiesForm.BringToFront();
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
Generated
+201
@@ -0,0 +1,201 @@
|
||||
namespace GraphLib
|
||||
{
|
||||
partial class PlotterDisplayEx
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
|
||||
|
||||
#region Component Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.components = new System.ComponentModel.Container();
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PlotterDisplayEx));
|
||||
this.tb1 = new System.Windows.Forms.ToolBar();
|
||||
this.tbbSave = new System.Windows.Forms.ToolBarButton();
|
||||
this.tbbOpen = new System.Windows.Forms.ToolBarButton();
|
||||
this.imgList1 = new System.Windows.Forms.ImageList(this.components);
|
||||
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
|
||||
this.panel1 = new System.Windows.Forms.Panel();
|
||||
this.lb_Position = new System.Windows.Forms.Label();
|
||||
this.hScrollBar1 = new System.Windows.Forms.HScrollBar();
|
||||
this.gPane = new GraphLib.PlotterGraphPaneEx();
|
||||
this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
|
||||
this.selectGraphsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
|
||||
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
|
||||
this.splitContainer1.Panel1.SuspendLayout();
|
||||
this.splitContainer1.Panel2.SuspendLayout();
|
||||
this.splitContainer1.SuspendLayout();
|
||||
this.panel1.SuspendLayout();
|
||||
this.contextMenuStrip1.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// tb1
|
||||
//
|
||||
this.tb1.Appearance = System.Windows.Forms.ToolBarAppearance.Flat;
|
||||
this.tb1.Buttons.AddRange(new System.Windows.Forms.ToolBarButton[] {
|
||||
this.tbbSave,
|
||||
this.tbbOpen});
|
||||
this.tb1.ButtonSize = new System.Drawing.Size(16, 16);
|
||||
this.tb1.Divider = false;
|
||||
this.tb1.Dock = System.Windows.Forms.DockStyle.None;
|
||||
this.tb1.DropDownArrows = true;
|
||||
this.tb1.ImageList = this.imgList1;
|
||||
this.tb1.Location = new System.Drawing.Point(11, 5);
|
||||
this.tb1.Name = "tb1";
|
||||
this.tb1.ShowToolTips = true;
|
||||
this.tb1.Size = new System.Drawing.Size(80, 26);
|
||||
this.tb1.TabIndex = 1;
|
||||
this.tb1.Visible = false;
|
||||
this.tb1.ButtonClick += new System.Windows.Forms.ToolBarButtonClickEventHandler(this.tb1_ButtonClick);
|
||||
//
|
||||
// tbbSave
|
||||
//
|
||||
this.tbbSave.ImageIndex = 0;
|
||||
this.tbbSave.Name = "tbbSave";
|
||||
this.tbbSave.Tag = "play";
|
||||
//
|
||||
// tbbOpen
|
||||
//
|
||||
this.tbbOpen.ImageIndex = 1;
|
||||
this.tbbOpen.Name = "tbbOpen";
|
||||
this.tbbOpen.Tag = "stop";
|
||||
//
|
||||
// imgList1
|
||||
//
|
||||
this.imgList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imgList1.ImageStream")));
|
||||
this.imgList1.TransparentColor = System.Drawing.Color.Transparent;
|
||||
this.imgList1.Images.SetKeyName(0, "media-playback-start.png");
|
||||
this.imgList1.Images.SetKeyName(1, "media-playback-stop.png");
|
||||
this.imgList1.Images.SetKeyName(2, "media-playback-pause.png");
|
||||
this.imgList1.Images.SetKeyName(3, "printer.png");
|
||||
//
|
||||
// splitContainer1
|
||||
//
|
||||
this.splitContainer1.BackColor = System.Drawing.SystemColors.Control;
|
||||
this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
|
||||
this.splitContainer1.IsSplitterFixed = true;
|
||||
this.splitContainer1.Location = new System.Drawing.Point(0, 0);
|
||||
this.splitContainer1.Name = "splitContainer1";
|
||||
this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal;
|
||||
//
|
||||
// splitContainer1.Panel1
|
||||
//
|
||||
this.splitContainer1.Panel1.BackColor = System.Drawing.SystemColors.ControlDarkDark;
|
||||
this.splitContainer1.Panel1.Controls.Add(this.tb1);
|
||||
this.splitContainer1.Panel1.Controls.Add(this.panel1);
|
||||
//
|
||||
// splitContainer1.Panel2
|
||||
//
|
||||
this.splitContainer1.Panel2.BackColor = System.Drawing.Color.Transparent;
|
||||
this.splitContainer1.Panel2.Controls.Add(this.gPane);
|
||||
this.splitContainer1.Size = new System.Drawing.Size(598, 339);
|
||||
this.splitContainer1.SplitterDistance = 34;
|
||||
this.splitContainer1.TabIndex = 2;
|
||||
this.splitContainer1.TabStop = false;
|
||||
//
|
||||
// panel1
|
||||
//
|
||||
this.panel1.Controls.Add(this.lb_Position);
|
||||
this.panel1.Controls.Add(this.hScrollBar1);
|
||||
this.panel1.Location = new System.Drawing.Point(99, 3);
|
||||
this.panel1.Name = "panel1";
|
||||
this.panel1.Size = new System.Drawing.Size(496, 28);
|
||||
this.panel1.TabIndex = 7;
|
||||
//
|
||||
// lb_Position
|
||||
//
|
||||
this.lb_Position.AutoSize = true;
|
||||
this.lb_Position.ForeColor = System.Drawing.SystemColors.ControlLightLight;
|
||||
this.lb_Position.Location = new System.Drawing.Point(6, 8);
|
||||
this.lb_Position.Name = "lb_Position";
|
||||
this.lb_Position.Size = new System.Drawing.Size(44, 13);
|
||||
this.lb_Position.TabIndex = 3;
|
||||
this.lb_Position.Text = "Position";
|
||||
//
|
||||
// hScrollBar1
|
||||
//
|
||||
this.hScrollBar1.Location = new System.Drawing.Point(57, 10);
|
||||
this.hScrollBar1.Maximum = 10000;
|
||||
this.hScrollBar1.Name = "hScrollBar1";
|
||||
this.hScrollBar1.Size = new System.Drawing.Size(118, 10);
|
||||
this.hScrollBar1.TabIndex = 4;
|
||||
this.hScrollBar1.Scroll += new System.Windows.Forms.ScrollEventHandler(this.OnScrollbarScroll);
|
||||
//
|
||||
// gPane
|
||||
//
|
||||
this.gPane.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.gPane.Location = new System.Drawing.Point(0, 0);
|
||||
this.gPane.Name = "gPane";
|
||||
this.gPane.Size = new System.Drawing.Size(598, 301);
|
||||
this.gPane.TabIndex = 1;
|
||||
//
|
||||
// contextMenuStrip1
|
||||
//
|
||||
this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.selectGraphsToolStripMenuItem,
|
||||
this.toolStripSeparator1});
|
||||
this.contextMenuStrip1.Name = "contextMenuStrip1";
|
||||
this.contextMenuStrip1.Size = new System.Drawing.Size(117, 32);
|
||||
//
|
||||
// selectGraphsToolStripMenuItem
|
||||
//
|
||||
this.selectGraphsToolStripMenuItem.Name = "selectGraphsToolStripMenuItem";
|
||||
this.selectGraphsToolStripMenuItem.Size = new System.Drawing.Size(116, 22);
|
||||
this.selectGraphsToolStripMenuItem.Text = "Options";
|
||||
this.selectGraphsToolStripMenuItem.Click += new System.EventHandler(this.selectGraphsToolStripMenuItem_Click);
|
||||
//
|
||||
// toolStripSeparator1
|
||||
//
|
||||
this.toolStripSeparator1.Name = "toolStripSeparator1";
|
||||
this.toolStripSeparator1.Size = new System.Drawing.Size(113, 6);
|
||||
//
|
||||
// PlotterDisplayEx
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.BackColor = System.Drawing.Color.Transparent;
|
||||
this.ContextMenuStrip = this.contextMenuStrip1;
|
||||
this.Controls.Add(this.splitContainer1);
|
||||
this.Name = "PlotterDisplayEx";
|
||||
this.Size = new System.Drawing.Size(598, 339);
|
||||
this.splitContainer1.Panel1.ResumeLayout(false);
|
||||
this.splitContainer1.Panel1.PerformLayout();
|
||||
this.splitContainer1.Panel2.ResumeLayout(false);
|
||||
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
|
||||
this.splitContainer1.ResumeLayout(false);
|
||||
this.panel1.ResumeLayout(false);
|
||||
this.panel1.PerformLayout();
|
||||
this.contextMenuStrip1.ResumeLayout(false);
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.ToolBar tb1;
|
||||
private System.Windows.Forms.SplitContainer splitContainer1;
|
||||
private System.Windows.Forms.ToolBarButton tbbSave;
|
||||
private System.Windows.Forms.ToolBarButton tbbOpen;
|
||||
private System.Windows.Forms.HScrollBar hScrollBar1;
|
||||
private PlotterGraphPaneEx gPane;
|
||||
private System.Windows.Forms.Label lb_Position;
|
||||
public System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
|
||||
private System.Windows.Forms.ToolStripMenuItem selectGraphsToolStripMenuItem;
|
||||
private System.Windows.Forms.ImageList imgList1;
|
||||
private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
|
||||
private System.Windows.Forms.Panel panel1;
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,196 @@
|
||||
<?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>
|
||||
<metadata name="imgList1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 17</value>
|
||||
</metadata>
|
||||
<data name="imgList1.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>
|
||||
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
|
||||
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
|
||||
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACI
|
||||
DgAAAk1TRnQBSQFMAgEBBAEAARQBAAEUAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
|
||||
AwABIAMAAQEBAAEgBgABIP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AKgADAQECwAABtgGV
|
||||
AU8B/QHKAZgBWQH/AcoBlwFZAf8BygGXAVkB/wHKAZcBWQH/AcoBlwFYAf8ByQGXAVgB/wHJAZcBWAH/
|
||||
AcoBmAFZAf8BtgGUAU8B/RQAAxQBHAMRARcDAgEDrAADTgGZA10B0gNMAf8BxwGVAVUB/wH5AfcB9gH/
|
||||
AfkB8QHsAf8B+QHxAesB/wH4AfAB6QH/AfcB7QHmAf8B9AHqAeEB/wHyAegB3gH/AfoB+AH2Af8BxwGU
|
||||
AVUB/wMYAf8DWAHRA0QBeggAAxUBHQFiAlgB6QM6AWEDDQESAwABASwAAxsBJgMbASYDGwEmAxsBJgMb
|
||||
ASYDGwEmAxsBJgMbASYDGwEmAxsBJgMbASYDGwEmEAADGwEmAxsBJgMbASYDGwEmAxsBJgMbASYDGwEm
|
||||
AxsBJgMbASYDGwEmAxsBJgMbASYIAANUAf0DpwH/A7UB/wOBAf8BrwGsAaoB/wHFAcABvQH/AcUBwAG9
|
||||
Af8BxQHAAb0B/wHFAcABvQH/AcUBwAG9Af8BxQHAAb0B/wGtAaoBqAH/AyAB/wO1Af8DmwH/AxcB/wgA
|
||||
AxUBHQNNAfoBOgIrAfwDXwHgAysBQgMNARIoAAMbASYDKwH8AYACgQH/AYACgQH/AYACgQH/AYACgQH/
|
||||
AYACgQH/AYACgQH/AYACgQH/AYACgQH/AYACgQH/AxsBJhAAAxsBJgMrAfwBgAKBAf8BgAKBAf8BgAKB
|
||||
Af8DIwE0AxsBJgMrAfwBgAKBAf8BgAKBAf8BgAKBAf8DIwE0CAADZAH/A7UB/wO1Af8DlQH/A4EB/wOB
|
||||
Af8DbQH/A2IB/wNVAf8DRgH/AzcB/wM2Af8DYgH/A7UB/wO1Af8DGQH/CAADFQEdAV8CSgH7AfkB+gH5
|
||||
Af8DfwH+AV8BUwFSAfsDVQGyAx0BKgMIAQsgAAMbASYDQAH9IP8DQAH9AxsBJgMAAQEMAAMbASYDQAH9
|
||||
AfwB/QH8Bf8DQAH9AxsBJgMbASYDQAH9AfwB/QH8Bf8DQAH9AxsBJgMAAQEEAANpAf8DuwH/A7sB/wON
|
||||
Af8D1AH/A7kB/wO5Af8DuQH/A7kB/wO5Af8DuQH/A9MB/wODAf8DuwH/A7sB/wMeAf8IAAMVAR0DKwH8
|
||||
AfoC+wH/AfUC9gH/AfkC+gH/ATsBLgEtAfwBbQJRAfcDQgF2AxYBHgMFAQcYAAMbASYDQAH9BP8B1QHb
|
||||
AdgB/wHUAdsB1wH/AdQB2wHYAf8B0wHbAdcB/wHRAdkB1QH/Ac8B1wHTBf8DQAH9AxsBJgMBAQIMAAMb
|
||||
ASYDQAH9AeIB5QHkAf8B2AHfAdwB/wNAAf0DGwEmAxsBJgNAAf0D8wH/AfcB+AH3Af8DQAH9AxsBJgMB
|
||||
AQIEAANuAf8D1wH/A9cB/wOXAf8D2AH/A78B/wO/Af8DvwH/A78B/wO/Af8DvwH/A9cB/wOOAf8D1wH/
|
||||
A9cB/wMzAf8IAAMWAR4DKwH8A/sB/wHTAdoB1wH/AdoB3wHcAf8B9gH3AfYB/wHyAvMB/wE6AisB/AFg
|
||||
AlkB6wMzAVMDEgEZAwQBBRAAAxsBJgNAAf0E/wHaAeAB3QH/AdsB4QHeAf8B3QHiAeAB/wHdAeIB4AH/
|
||||
AdsB4QHeAf8B2AHeAdsF/wNAAf0DGwEmAwEBAgwAAxsBJgNAAf0B4gHmAeQB/wHcAeIB3wH/A0AB/QMb
|
||||
ASYDGwEmA0AB/QHvAfEB8AH/AfAB8wHxAf8DQAH9AxsBJgMBAQIEAANyAf8D+QH/A/kB/wOrAf8D3wH/
|
||||
A8sB/wPLAf8DywH/A8sB/wPLAf8DywH/A98B/wOjAf8D+QH/A/kB/wNVAf8IAAMWAR4DKwH8A/sB/wHf
|
||||
AeQB4QH/Ad4B4wHhAf8B3gHjAeAB/wHjAecB5QH/AfQC9QH/A38B/gGRAkAB/QNWAbYDJgE5AxABFQwA
|
||||
AxsBJgNAAf0E/wHdAeMB4AH/AeEB5gHjAf8B5AHpAecB/wHmAeoB6AH/AeUB6QHnAf8B4gHnAeQF/wNA
|
||||
Af0DGwEmAwEBAgwAAxsBJgNAAf0B5AHoAeUB/wHeAeMB4QH/A0AB/QMbASYDGwEmA0AB/QHsAe8B7gH/
|
||||
AecB6wHpAf8DQAH9AxsBJgMBAQIEAANqAfkD/AH/A/wB/wPLAf8D8gH/A/IB/wPyAf8D8gH/A/IB/wPy
|
||||
Af8D8gH/A/IB/wPGAf8D/AH/A/wB/wNwAf4IAAMWAR4DKwH8A/sB/wHqAe4B7AH/AewB7wHuAf8B7AHv
|
||||
Ae4B/wHrAe4B7QH/AekB7AHrAf8DfwH+AToCKwH8AVgCVgG7Ax0BKgMGAQgMAAMbASYDQAH9BP8B3wHk
|
||||
AeEB/wHkAekB5gH/AeoB7QHrAf8B7gHxAe8B/wHvAfEB8AH/AewB7wHuBf8DQAH9AxsBJgMBAQIMAAMb
|
||||
ASYDQAH9AesB7QHsAf8B3QHjAeAB/wNAAf0DGwEmAxsBJgNAAf0B7QHwAe8B/wHfAeQB4QH/A0AB/QMb
|
||||
ASYDAQECBAADXQTSAf8D6AH/A3EB/wNxAf8DcQH/A3EB/wNxAf8DcQH/A3EB/wNxAf8DcQH/A3EB/wPo
|
||||
Af8DxAH/A1wB3AgAAxYBHgMrAfwD+wH/AfUC9gH/AfoB+wH6Af8D+QH/Ad0C3gH/AWoCRwH5A10B7QE6
|
||||
AjkBYAMNAREUAAMbASYDQAH9BP8B3AHiAd8B/wHkAegB5gH/AesB7gHtAf8B8gH0AfMB/wH3AvgB/wH2
|
||||
AfgB9wX/A0AB/QMbASYDAQECDAADGwEmA0AB/QHyAfQB8wH/AdoB3wHdAf8DQAH9AxsBJgMcASgDQAH9
|
||||
AfMB9QH0Af8B1gHdAdkB/wNAAf0DGwEmAwEBAgQAAy0BRQOaAf8DzAH/AccBiwFCAf8B+QH0Ae0B/wH+
|
||||
AegB2AH/Af4B6AHXAf8B/QHlAdMB/wH8AeQB0QH/AfoB4AHHAf8B+QHdAcMB/wH6AfQB7QH/AccBhQE+
|
||||
Af8DwwH/A2gB/wMtAUUIAAMWAR4DKwH8A/sB/wHwAfMB8gH/AeYC6AH/A00B+gFiAlIB9AFRAk8BpQMU
|
||||
ARwDAAEBGAADGwEmA0AB/QT/AdgB3wHcAf8B4AHlAeMB/wHoAesB6gH/Ae8B8gHwAf8B9wH4AfcB/wP9
|
||||
Bf8DQAH9AxsBJgMBAQIMAAMbASYDQAH9A/wB/wHVAdsB2AH/A0AB/QMbASYDHAEoA0AB/QP8Af8B0gHa
|
||||
AdYB/wNAAf0DGwEmAwEBAggAAzsBYwNqAfMBxQGJAUAB/wH5AfQB7wH/Af4B5wHXAf8B/QHnAdUB/wH8
|
||||
AeYB0gH/AfsB4QHMAf8B+AHcAcIB/wH2AdoBvQH/AfoB9AHvAf8BxAGDATwB/wNdAfMDOwFjDAADFgEe
|
||||
AysB/AP7Af8BPgIyAfwDTQH6AVoCVwG9AxgBIgMCAQMgAAMbASYDQAH9IP8DQAH9AxsBJgMBAQIMAAMb
|
||||
ASYDQAH9CP8DQAH9AxsBJgMcASgDQAH9CP8DQAH9AxsBJgMBAQIMAAMHAQkBlgF6AUcC+QH0AfAB/wH8
|
||||
AeYB0wH/Af0B5wHTAf8B+wHjAc0B/wH6AeAByAH/AfUB1gG7Af8B8wHUAbUB/wH4AfQB8AH/AZUBagFH
|
||||
AfkDBwEJEAADFgEeA0AB/QFbAjIB+wFgAlwB1AMjATMDBwEKKAADGwEmAysB/AEpAS0BKwH/ASkBLQEr
|
||||
Af8BKQEtASsB/wEpAS0BKwH/ASkBLQErAf8BKQEtASsB/wEpAS0BKwH/ASkBLQErAf8BKQEtASsB/wMb
|
||||
ASYDAQECDAADGwEmAWMBVwFVAf4BKQEtASsB/wEpAS0BKwH/ASkBLQErAf8DGwEmAxwBKAFjAVcBVQH+
|
||||
ASkBLQErAf8BKQEtASsB/wEpAS0BKwH/AxsBJgMBAQIQAAGSAXoBUQH3AfkB9QHxAf8B/AHjAc8B/wH8
|
||||
AeQBzwH/AfoB4QHKAf8B+QHdAcQB/wH0AekB3wH/AfcB8gHsAf8B9QHvAekB/wGZAV8BRQH7FAADFgEf
|
||||
AV4CWgHYAygBPQMNAREwAAMbASYDGwEmAxsBJgMbASYDGwEmAxsBJgMbASYDGwEmAxsBJgMbASYDGwEm
|
||||
AxsBJgMAAQEMAAMbASYDGwEmAxsBJgMbASYDGwEmAxsBJgMbASYDGwEmAxsBJgMbASYDGwEmAxsBJgMA
|
||||
AQEQAAGJAWoBSQH2AfkB9QHxAf8B/AHjAc0B/wH7AeMBzQH/AfkB4AHIAf8B+AHcAcIB/wH9AfsB+AH/
|
||||
AfwB5gHNAf8B4gG2AYQB/wJUAVIBphQAAxYBHwMRARcDAgEDuAABngF1AU0B+gH3AfIB7AH/AfgB9AHu
|
||||
Af8B+AHzAe0B/wH4AfMB7QH/AfgB8gHsAf8B8gHmAdcB/wHiAbIBcQH/AZABcQFiAfYDBQEHFAADAwEE
|
||||
wAADOgFgAlgBVgG7AbEBfwFPAf4ByAGMAUMB/wGSAX8BUQH3AZIBfwFRAfcBrgF/AUwB/gNOAZQUAAFC
|
||||
AU0BPgcAAT4DAAEoAwABQAMAASADAAEBAQABAQYAAQEWAAP/gQAB3wX/AeABBwHHBf8CAAHBAf8BwAED
|
||||
AcABAwIAAcAB/wHAAQMBwAEDAgABwAE/AcABAQHAAQECAAHAAQ8BwAEBAcABAQIAAcABAwHAAQEBwAEB
|
||||
AgABwAEBAcABAQHAAQECAAHAAQEBwAEBAcABAQIAAcABBwHAAQEBwAEBAgABwAEPAcABAQHAAQEBgAEB
|
||||
AcABPwHAAQEBwAEBAcABAwHAAf8BwAEBAcABAQHgAQcBwwH/AcABAQHAAQEB4AEHAccF/wHgAQcB3wX/
|
||||
AeABHws=
|
||||
</value>
|
||||
</data>
|
||||
<metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>84, 17</value>
|
||||
</metadata>
|
||||
</root>
|
||||
Generated
+46
@@ -0,0 +1,46 @@
|
||||
namespace GraphLib
|
||||
{
|
||||
partial class PlotterGraphPaneEx
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Component Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// PlotterGraphPane
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Name = "PlotterGraphPane";
|
||||
this.Size = new System.Drawing.Size(409, 150);
|
||||
this.Load += new System.EventHandler(this.OnLoadControl);
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user