mirror of
https://github.com/PepperDash/Essentials.git
synced 2026-02-21 15:45:53 +00:00
Compare commits
953 Commits
1.5.9-hotf
...
1.9.8-hotf
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eea59d682a | ||
|
|
379498aea1 | ||
|
|
d320b2ca07 | ||
|
|
dba60cfd76 | ||
|
|
52c589b56b | ||
|
|
482bef435a | ||
|
|
99580ae8b5 | ||
|
|
1623ee1d9e | ||
|
|
0d4d86e0e6 | ||
|
|
2d64e49f8e | ||
|
|
8e46d575e4 | ||
|
|
5d1c5c9e99 | ||
|
|
458de1aaa6 | ||
|
|
661bf41de5 | ||
|
|
68d71b1bab | ||
|
|
436674a708 | ||
|
|
5fd8e4bc2b | ||
|
|
cee9bd6af8 | ||
|
|
82121dc55c | ||
|
|
72a5491309 | ||
|
|
d12a2a19a8 | ||
|
|
2f901b9fc4 | ||
|
|
3cf85f99ce | ||
|
|
c48f697b7e | ||
|
|
2e1195431f | ||
|
|
cf88e3b36d | ||
|
|
bceb7115ed | ||
|
|
1d2eb42c46 | ||
|
|
ef12650f9c | ||
|
|
176d4675da | ||
|
|
ae10e560f0 | ||
|
|
e152250363 | ||
|
|
8945398cd7 | ||
|
|
37a7886ec2 | ||
|
|
fffaa1e5e6 | ||
|
|
03f01b2f78 | ||
|
|
446bae4dd3 | ||
|
|
e7d1d560ee | ||
|
|
d3f30d8b71 | ||
|
|
2e5b7cad64 | ||
|
|
5171385b5b | ||
|
|
3ee44bcf6e | ||
|
|
949a04647b | ||
|
|
31f976d719 | ||
|
|
11ffc5130f | ||
|
|
59bfa354e4 | ||
|
|
536e82ef22 | ||
|
|
63cd322fd0 | ||
|
|
489ba2da04 | ||
|
|
8087aa7a75 | ||
|
|
a8d0dfb327 | ||
|
|
cef9e0a9a6 | ||
|
|
16369e31cf | ||
|
|
38959414ff | ||
|
|
bc3247297e | ||
|
|
f7bf728263 | ||
|
|
025bf7adfb | ||
|
|
a6430a7bfe | ||
|
|
b71c83bac0 | ||
|
|
5940ec17c2 | ||
|
|
10445508b2 | ||
|
|
66ecf43508 | ||
|
|
77c4272219 | ||
|
|
d78a378859 | ||
|
|
eec4484f78 | ||
|
|
49e82f107b | ||
|
|
c5162fb94d | ||
|
|
63b9ffdd26 | ||
|
|
2e76b6ba0a | ||
|
|
cad45c04cb | ||
|
|
70d63a9f99 | ||
|
|
30f63eee03 | ||
|
|
9f1c512909 | ||
|
|
0d6cd8d55d | ||
|
|
8e64140651 | ||
|
|
0da35c8572 | ||
|
|
9f3a3f64a8 | ||
|
|
fe01842523 | ||
|
|
4ffea1c98f | ||
|
|
73e3b049d8 | ||
|
|
0ae38dddfc | ||
|
|
871894e248 | ||
|
|
fa6cabe246 | ||
|
|
db3d96d448 | ||
|
|
a28a078c4f | ||
|
|
d00a31e3a6 | ||
|
|
77134f0a30 | ||
|
|
93dfb8780b | ||
|
|
f791feb848 | ||
|
|
44509dc5ae | ||
|
|
2d0dcd7336 | ||
|
|
c255ae1525 | ||
|
|
d50027cc82 | ||
|
|
9b64b7b7f3 | ||
|
|
147e712a01 | ||
|
|
9a1b069e24 | ||
|
|
d8cd04b35f | ||
|
|
8539a6b79c | ||
|
|
adec25104c | ||
|
|
a54cd9e1df | ||
|
|
8af7b4b1db | ||
|
|
3edb0145d0 | ||
|
|
0a1af09830 | ||
|
|
532f3ba237 | ||
|
|
e1d9a46284 | ||
|
|
bfd383dfc7 | ||
|
|
8ab87af859 | ||
|
|
47035d8386 | ||
|
|
c84ec4c899 | ||
|
|
4444328600 | ||
|
|
0d3eb42495 | ||
|
|
540a00861c | ||
|
|
0014dd7a14 | ||
|
|
f922b871a1 | ||
|
|
b2331fa1e5 | ||
|
|
8bf4b0d568 | ||
|
|
621205e65c | ||
|
|
62fcf3856f | ||
|
|
dad986414c | ||
|
|
f298b5cc41 | ||
|
|
f8129fe7ae | ||
|
|
dbdaedcca3 | ||
|
|
893950d8c4 | ||
|
|
b780351bf0 | ||
|
|
6a1671aae1 | ||
|
|
9a1a23c88a | ||
|
|
2e4bb7466c | ||
|
|
36a41ac477 | ||
|
|
92f4d37cd6 | ||
|
|
b9479bab70 | ||
|
|
fd94a94ee9 | ||
|
|
3fa2954ca0 | ||
|
|
c4f6afa412 | ||
|
|
6bdda5451b | ||
|
|
3ee8c07ecd | ||
|
|
01b713e6e1 | ||
|
|
ffd0fbc57b | ||
|
|
23e8280904 | ||
|
|
6708be0d15 | ||
|
|
d193de79da | ||
|
|
87ab43c745 | ||
|
|
2a37e44d7d | ||
|
|
efa801137c | ||
|
|
4b4f1f3c3d | ||
|
|
6e7bf061cf | ||
|
|
7f6160eb44 | ||
|
|
b5004d5b1d | ||
|
|
cea1d2fcdd | ||
|
|
22aea3089d | ||
|
|
43256acfcd | ||
|
|
1696ef3ac1 | ||
|
|
19cbe480a6 | ||
|
|
49c1c61a88 | ||
|
|
0cd3c1bdc5 | ||
|
|
d64cbc639a | ||
|
|
8404e7d5a4 | ||
|
|
e4135a958c | ||
|
|
f4ac4e6319 | ||
|
|
b026174cd2 | ||
|
|
66ff6b2e07 | ||
|
|
e7bbfbd40a | ||
|
|
eec86fde48 | ||
|
|
7b57ce439e | ||
|
|
5d120391a5 | ||
|
|
db5aa319ec | ||
|
|
10f5516a5a | ||
|
|
45e6dff26d | ||
|
|
10129b8178 | ||
|
|
9128e108f7 | ||
|
|
760ec8be92 | ||
|
|
bbcdd3e179 | ||
|
|
7a649f4ea8 | ||
|
|
6946946c12 | ||
|
|
dca73e1508 | ||
|
|
990090e1de | ||
|
|
3b843104d8 | ||
|
|
a37814ab3c | ||
|
|
2181410927 | ||
|
|
d4191ceb75 | ||
|
|
5f6d15c6c0 | ||
|
|
4cc40227fd | ||
|
|
d0dbbe095f | ||
|
|
c7180db2b7 | ||
|
|
d95ee27979 | ||
|
|
e964172200 | ||
|
|
840934502b | ||
|
|
a76f4c15dc | ||
|
|
b19e2e38ad | ||
|
|
9a7fe553f9 | ||
|
|
e6ecaf3a1e | ||
|
|
895b76a0cd | ||
|
|
5c9996e728 | ||
|
|
0cc2328276 | ||
|
|
8fadfa98f2 | ||
|
|
1ccf54003f | ||
|
|
54769ce270 | ||
|
|
6b85323949 | ||
|
|
319d8f99c5 | ||
|
|
cc742f4291 | ||
|
|
6beff106ec | ||
|
|
cb35aa13f5 | ||
|
|
b71523bd2d | ||
|
|
0c56da112c | ||
|
|
08f4d8e9a2 | ||
|
|
25e7e9634a | ||
|
|
7ac3f81ea5 | ||
|
|
1c06e8381b | ||
|
|
f5305197b3 | ||
|
|
1805ebaf0f | ||
|
|
ca8207f2bd | ||
|
|
4e81859695 | ||
|
|
655bb954fa | ||
|
|
1ebacf3f0f | ||
|
|
7de0251188 | ||
|
|
492e593263 | ||
|
|
afe2046c81 | ||
|
|
98d3a4a2fa | ||
|
|
1702c69b73 | ||
|
|
722d28b1b3 | ||
|
|
ef7da0d7af | ||
|
|
77d8e63a31 | ||
|
|
d2d99d4bfa | ||
|
|
4bd71b04bf | ||
|
|
c5bcd89695 | ||
|
|
c7cc98bff7 | ||
|
|
db60f8f1be | ||
|
|
e82efdde2d | ||
|
|
d00c8bed5f | ||
|
|
a91af6bd75 | ||
|
|
2d36b80800 | ||
|
|
e152b9a504 | ||
|
|
eac7c91327 | ||
|
|
ac0d5e59a0 | ||
|
|
78be8ec5f2 | ||
|
|
5fc4ff6027 | ||
|
|
63853739f3 | ||
|
|
c14193f9ac | ||
|
|
da179c01f5 | ||
|
|
0ded3e30f9 | ||
|
|
8d215930d9 | ||
|
|
b4edb021ee | ||
|
|
52caa98f33 | ||
|
|
4e041d1773 | ||
|
|
118bd5a54a | ||
|
|
116abbf962 | ||
|
|
a06333e1c3 | ||
|
|
d937dc14fc | ||
|
|
604f4ca22d | ||
|
|
2d7ad8ba2a | ||
|
|
e4a3933743 | ||
|
|
d6445861f5 | ||
|
|
03b076c8eb | ||
|
|
7c58221acc | ||
|
|
14f7c27b33 | ||
|
|
9ea65883b7 | ||
|
|
9d0020d999 | ||
|
|
fb44a3b93c | ||
|
|
6b7c5c01f8 | ||
|
|
1a3eb9a546 | ||
|
|
44c171c8f4 | ||
|
|
ae9833ffaa | ||
|
|
685c344785 | ||
|
|
e6f5142fc3 | ||
|
|
3c9ca1e527 | ||
|
|
452d0a5a39 | ||
|
|
8643ed2caf | ||
|
|
2787c7fc52 | ||
|
|
babc3e4f1a | ||
|
|
0a4ff82af0 | ||
|
|
b455e1af21 | ||
|
|
e12a5e95bf | ||
|
|
3e7144f7ef | ||
|
|
19e070ed76 | ||
|
|
b818c14713 | ||
|
|
63e7866890 | ||
|
|
922d1d8133 | ||
|
|
d26ea01ed9 | ||
|
|
4ebd1b53b5 | ||
|
|
0226b58b1e | ||
|
|
be41922c54 | ||
|
|
56f93c5491 | ||
|
|
8cfd58bb7e | ||
|
|
6ddfdc4b38 | ||
|
|
7640b95701 | ||
|
|
6c2abc7abd | ||
|
|
1849d118b4 | ||
|
|
22e7f004a5 | ||
|
|
0dcaacb038 | ||
|
|
cf8e673677 | ||
|
|
200080247a | ||
|
|
ba247ee8d6 | ||
|
|
b3617d04c8 | ||
|
|
85cf51876a | ||
|
|
b6f47168c0 | ||
|
|
1e755df9bb | ||
|
|
037f8ed043 | ||
|
|
e327d2d359 | ||
|
|
e832566168 | ||
|
|
252d037380 | ||
|
|
dd0f7a586e | ||
|
|
2feec62052 | ||
|
|
33a1b1697a | ||
|
|
955d68b3f3 | ||
|
|
0f28d46f34 | ||
|
|
275759143b | ||
|
|
3a4737b6f6 | ||
|
|
2b2308d5c2 | ||
|
|
185f03065e | ||
|
|
3803263598 | ||
|
|
358fa1a9c0 | ||
|
|
7fbbc9f2b8 | ||
|
|
f4f400f9b6 | ||
|
|
d3383db890 | ||
|
|
139e5370ea | ||
|
|
4f9fa05e3f | ||
|
|
7ab2574912 | ||
|
|
35167d77f9 | ||
|
|
bdd17dfa27 | ||
|
|
6443e00428 | ||
|
|
008279e867 | ||
|
|
c4a6d20791 | ||
|
|
61b4002e5a | ||
|
|
da63d0917e | ||
|
|
0228fd1c0f | ||
|
|
085ba134c4 | ||
|
|
a9fce3237c | ||
|
|
840fb21e15 | ||
|
|
6ab4d4d090 | ||
|
|
fcdee3b9fd | ||
|
|
4e15d7fe5a | ||
|
|
2a76e2b3f9 | ||
|
|
f9522a533a | ||
|
|
ec07ec84f7 | ||
|
|
0457bcf7fe | ||
|
|
ba0b2e169a | ||
|
|
bebcc3c6e1 | ||
|
|
8ed236abae | ||
|
|
8572191c1e | ||
|
|
4a9b1514e3 | ||
|
|
9c7e38b379 | ||
|
|
846e905ae1 | ||
|
|
00d2159d06 | ||
|
|
7019b62610 | ||
|
|
a583fdb72a | ||
|
|
33bf98303d | ||
|
|
b2f3aa9cfa | ||
|
|
31f6a4bcfd | ||
|
|
29b77f5629 | ||
|
|
f74fa35ca4 | ||
|
|
74231a428d | ||
|
|
8ba0920cc0 | ||
|
|
e23fe06fef | ||
|
|
79fd1f7424 | ||
|
|
2da8f8c9a8 | ||
|
|
743accd980 | ||
|
|
b445f68466 | ||
|
|
847e106b8d | ||
|
|
57f2d7c938 | ||
|
|
f0415d0d05 | ||
|
|
d2ebc340bd | ||
|
|
07fbe102bd | ||
|
|
319909539c | ||
|
|
00589488ac | ||
|
|
f25219c20a | ||
|
|
7c7ae65d40 | ||
|
|
0dcbb652df | ||
|
|
0649cea367 | ||
|
|
9f840fae41 | ||
|
|
c5aef18943 | ||
|
|
70d4a7054f | ||
|
|
b20009b247 | ||
|
|
9588564633 | ||
|
|
eef3b5fb31 | ||
|
|
7078ba55c7 | ||
|
|
e06be3ebe9 | ||
|
|
10046a9ed4 | ||
|
|
51f294c37f | ||
|
|
1990201215 | ||
|
|
be78d17af5 | ||
|
|
8a6d5ebd56 | ||
|
|
93c0b33958 | ||
|
|
dca21aa4dc | ||
|
|
ac09267173 | ||
|
|
ef63c1db02 | ||
|
|
f828cbecbd | ||
|
|
890abf4383 | ||
|
|
52c96cc2c3 | ||
|
|
4ab3cdb1ff | ||
|
|
2dfd647f63 | ||
|
|
7f054d5e98 | ||
|
|
43297c0341 | ||
|
|
6280aa90c9 | ||
|
|
ca497c8f47 | ||
|
|
1da481a8db | ||
|
|
c04d79931d | ||
|
|
dbd3ab2f70 | ||
|
|
36b5faa3d9 | ||
|
|
07bf74ab19 | ||
|
|
e356f57e1a | ||
|
|
86ad88969e | ||
|
|
7020480159 | ||
|
|
bc54856392 | ||
|
|
24a435c965 | ||
|
|
2897ec1d83 | ||
|
|
f075412a86 | ||
|
|
4f5bb4dc46 | ||
|
|
382c35924c | ||
|
|
88c332729f | ||
|
|
e9a6aa641b | ||
|
|
16bc2ca381 | ||
|
|
2fc1f45161 | ||
|
|
ef7eae50e4 | ||
|
|
2c50efd4c5 | ||
|
|
3ebe44be34 | ||
|
|
e7b322c303 | ||
|
|
08491bdf2a | ||
|
|
f1fa3c07fd | ||
|
|
b19b4ae26e | ||
|
|
7f8215199d | ||
|
|
dd060c4442 | ||
|
|
e782339dcc | ||
|
|
766ed3ab51 | ||
|
|
cd0e3f7001 | ||
|
|
29d5ecb13f | ||
|
|
2987f600bb | ||
|
|
5c23aeca48 | ||
|
|
6ef8ba3639 | ||
|
|
4f7ad4ccb9 | ||
|
|
e03b0dc1bb | ||
|
|
b75153b848 | ||
|
|
d70d33c5e3 | ||
|
|
7eb6748682 | ||
|
|
c92c750e55 | ||
|
|
225c6281b9 | ||
|
|
249e9f372e | ||
|
|
4dfab9a287 | ||
|
|
ec43749ba4 | ||
|
|
2e4202ccce | ||
|
|
4c16dd07b5 | ||
|
|
0c4ad1c4df | ||
|
|
eb90fb343d | ||
|
|
2967a0f968 | ||
|
|
7b2a8b17b7 | ||
|
|
89ca614d3d | ||
|
|
355df1341e | ||
|
|
78c17cd729 | ||
|
|
504c21204f | ||
|
|
8dba5a335b | ||
|
|
3d6d578663 | ||
|
|
a5e9d7ba55 | ||
|
|
5eb65fd723 | ||
|
|
e0dcde5c35 | ||
|
|
c6cfecdbbb | ||
|
|
30bdac93ee | ||
|
|
1228431bc2 | ||
|
|
5a2070de3f | ||
|
|
bc1645065c | ||
|
|
21f9795bcd | ||
|
|
a69bc94945 | ||
|
|
864c8ddf77 | ||
|
|
5764149306 | ||
|
|
9abd911a95 | ||
|
|
968f85b04e | ||
|
|
6e09ef35ab | ||
|
|
a36bce4d5e | ||
|
|
5374e58197 | ||
|
|
cbfa7d869b | ||
|
|
434fb1be59 | ||
|
|
dbec078dae | ||
|
|
e9a8e42525 | ||
|
|
8ad7b429a2 | ||
|
|
a1c27d64ad | ||
|
|
4814d0f769 | ||
|
|
b7d7196071 | ||
|
|
d8225a80b6 | ||
|
|
1b0d9ae904 | ||
|
|
7228733aad | ||
|
|
809639c3f9 | ||
|
|
24e59e1474 | ||
|
|
42c483f581 | ||
|
|
7ba0ecdf5c | ||
|
|
ece36b4042 | ||
|
|
ca5b35b39c | ||
|
|
8f804766e5 | ||
|
|
00207d1570 | ||
|
|
65747b6ad2 | ||
|
|
f7174e2492 | ||
|
|
5d7cdab933 | ||
|
|
c9fee785f9 | ||
|
|
dfc90e58dc | ||
|
|
2a5810b671 | ||
|
|
9d354fb0ed | ||
|
|
52494ca13e | ||
|
|
55cbd094be | ||
|
|
da5fd7e743 | ||
|
|
f6059e249f | ||
|
|
8545622c79 | ||
|
|
cf14706961 | ||
|
|
2f172c998a | ||
|
|
7945bce854 | ||
|
|
6d66c5adee | ||
|
|
8ccbed6d81 | ||
|
|
c3c58e3201 | ||
|
|
f547eb3a09 | ||
|
|
44cacc839b | ||
|
|
6dbe1b6f31 | ||
|
|
e15ed3c77f | ||
|
|
435879e19b | ||
|
|
17ccaecf5e | ||
|
|
dfebd47ef4 | ||
|
|
684b8db546 | ||
|
|
3c714f724d | ||
|
|
03e0dc5208 | ||
|
|
14991bce95 | ||
|
|
50b2c7d3af | ||
|
|
030d69c190 | ||
|
|
08fe408dc1 | ||
|
|
bdb007f6ed | ||
|
|
91abe4c09a | ||
|
|
82029894e4 | ||
|
|
3c1ed6e58a | ||
|
|
8999097100 | ||
|
|
72197e547f | ||
|
|
9b62849d9d | ||
|
|
d311b6fef9 | ||
|
|
4a642b1e36 | ||
|
|
de4f003c67 | ||
|
|
708ee1a8ff | ||
|
|
7196d0aba8 | ||
|
|
3b0a5285ab | ||
|
|
ae03b8cd7e | ||
|
|
cc159e306e | ||
|
|
0a43f43f66 | ||
|
|
0f924360c1 | ||
|
|
0a34f48e0a | ||
|
|
870f2f8fa6 | ||
|
|
aa61479adc | ||
|
|
522c107ce6 | ||
|
|
cb29775004 | ||
|
|
fccbb55344 | ||
|
|
b2402402d9 | ||
|
|
f0a3b27e3b | ||
|
|
57ebd2b608 | ||
|
|
695ff5487f | ||
|
|
66cd39c013 | ||
|
|
fc91ba7c1e | ||
|
|
1cad1976ee | ||
|
|
91eec8c258 | ||
|
|
d2c308c009 | ||
|
|
a4a99f4a9b | ||
|
|
eb114b4a95 | ||
|
|
93e8d50e55 | ||
|
|
3c6fc978d4 | ||
|
|
01ddf1721c | ||
|
|
1ee87c0499 | ||
|
|
f8ae6264f7 | ||
|
|
3e56859943 | ||
|
|
945db8a233 | ||
|
|
823f7447c3 | ||
|
|
6e4fa48b9d | ||
|
|
7e8f216afb | ||
|
|
b09c151738 | ||
|
|
56cf54a644 | ||
|
|
169e897748 | ||
|
|
748b1ca147 | ||
|
|
2e636082bb | ||
|
|
9204ad2701 | ||
|
|
8feb7a142c | ||
|
|
d990930b19 | ||
|
|
4d67279827 | ||
|
|
a78b29b0a1 | ||
|
|
2c36c0f2cb | ||
|
|
2eaf21b1e0 | ||
|
|
099e387570 | ||
|
|
c4755f23cd | ||
|
|
9c4650b4af | ||
|
|
43d7fab04d | ||
|
|
d2b7e71c4a | ||
|
|
ab6d44e604 | ||
|
|
0dc2e9d134 | ||
|
|
3a024b8d4c | ||
|
|
05e2422cb4 | ||
|
|
fc5d4f946d | ||
|
|
45c1e25e4f | ||
|
|
f11bdcfd53 | ||
|
|
9888fbf047 | ||
|
|
9171610e34 | ||
|
|
7a8c1f3165 | ||
|
|
008a052045 | ||
|
|
93a5f2e3b2 | ||
|
|
0e4edca08a | ||
|
|
f9925f9ec9 | ||
|
|
f283f82bbc | ||
|
|
ab5dd5f756 | ||
|
|
e22c71853f | ||
|
|
8bf27ecbd9 | ||
|
|
d94d003050 | ||
|
|
25c4d94366 | ||
|
|
91dda3213e | ||
|
|
b41dd23c7f | ||
|
|
14ad0eee48 | ||
|
|
56e106ff32 | ||
|
|
b67424c1e1 | ||
|
|
c366ee9d12 | ||
|
|
5ec97f2e31 | ||
|
|
98c20464d7 | ||
|
|
b1aa9c3306 | ||
|
|
db6ab3ee98 | ||
|
|
2ccf4be559 | ||
|
|
ce86255119 | ||
|
|
d69e81972e | ||
|
|
3f9d306a34 | ||
|
|
14c3914e5c | ||
|
|
b5337572c4 | ||
|
|
1d1b4f0790 | ||
|
|
ccdd8005d0 | ||
|
|
1d184f0f5e | ||
|
|
2ed9e632c6 | ||
|
|
ecba28c9cd | ||
|
|
06e8cac597 | ||
|
|
1dfdd4dd28 | ||
|
|
48585469f6 | ||
|
|
f9ba562b0b | ||
|
|
5c63a49071 | ||
|
|
3d224496a8 | ||
|
|
73addfefe7 | ||
|
|
af0e2180bd | ||
|
|
a431015853 | ||
|
|
788244fbf4 | ||
|
|
282230b28e | ||
|
|
dc010ce28c | ||
|
|
5a3597f2a7 | ||
|
|
5b889ea59c | ||
|
|
faa6e20034 | ||
|
|
82a97f8c1f | ||
|
|
6557d21aa8 | ||
|
|
a733ed69cb | ||
|
|
9877ba93a0 | ||
|
|
669f9e71bc | ||
|
|
5d2f20efd5 | ||
|
|
06dccdd97f | ||
|
|
e705f67333 | ||
|
|
4903b99eb5 | ||
|
|
38ab6626fc | ||
|
|
b44bc8fae3 | ||
|
|
7d72d54862 | ||
|
|
0a218cebb4 | ||
|
|
ed6ad6ae76 | ||
|
|
1689b15d95 | ||
|
|
010fdde45c | ||
|
|
10509991c1 | ||
|
|
c686ee394d | ||
|
|
985902092e | ||
|
|
944b72e2a8 | ||
|
|
d074be323c | ||
|
|
0098401584 | ||
|
|
0d7d5fe380 | ||
|
|
1cb9fb6058 | ||
|
|
5076ba405e | ||
|
|
3c60dfdf7b | ||
|
|
5d44b5f3ef | ||
|
|
40cdd4c1e7 | ||
|
|
f5753109d5 | ||
|
|
51e338749a | ||
|
|
e37fb33afe | ||
|
|
47af06578a | ||
|
|
ad0cbba0b1 | ||
|
|
c7a3282dd9 | ||
|
|
fd593baa07 | ||
|
|
88f1230620 | ||
|
|
cad558980f | ||
|
|
e879aba801 | ||
|
|
114fdb9545 | ||
|
|
1886ddfbaf | ||
|
|
39d2c3aab6 | ||
|
|
3cd8a1f310 | ||
|
|
b457886ee3 | ||
|
|
e27c041256 | ||
|
|
5fcafe0b38 | ||
|
|
8250246f34 | ||
|
|
d9bcaa0b1d | ||
|
|
dd6e26ae4b | ||
|
|
fac1dd3d61 | ||
|
|
e573749aa0 | ||
|
|
f22bf60eb6 | ||
|
|
d1b99fdda3 | ||
|
|
e1a4cfca4e | ||
|
|
8a43824f3d | ||
|
|
b948fc7264 | ||
|
|
d9f891dfb1 | ||
|
|
a9524bcc33 | ||
|
|
4b537cb79d | ||
|
|
1484c26434 | ||
|
|
36e8dc9fa5 | ||
|
|
8feb7037aa | ||
|
|
d8863142c7 | ||
|
|
061109c901 | ||
|
|
f95b50c99d | ||
|
|
def5cc273c | ||
|
|
e01d2c9569 | ||
|
|
415dbbb195 | ||
|
|
765d90214d | ||
|
|
36fd1dcda9 | ||
|
|
812b9b731b | ||
|
|
e80a68485d | ||
|
|
535f4ccb8e | ||
|
|
7bbdf43452 | ||
|
|
59881d6b3b | ||
|
|
085e198409 | ||
|
|
81f27fcbde | ||
|
|
50dae0ef69 | ||
|
|
e0fdefa28e | ||
|
|
f6a826505c | ||
|
|
68ac506a25 | ||
|
|
1150d9e497 | ||
|
|
633a946f26 | ||
|
|
8e01455140 | ||
|
|
b373ab8708 | ||
|
|
cb752850ff | ||
|
|
08c929699f | ||
|
|
1862090a89 | ||
|
|
1ea80c3fab | ||
|
|
1676f5a956 | ||
|
|
cdc9cdbe95 | ||
|
|
28e8a1fb11 | ||
|
|
5f1b92ca62 | ||
|
|
c58a1874ca | ||
|
|
f4fb9cd173 | ||
|
|
ad4a6e9383 | ||
|
|
decdaf9f1f | ||
|
|
27382a6be1 | ||
|
|
34440af1c5 | ||
|
|
c0e3da9214 | ||
|
|
d50ad7345d | ||
|
|
95016c3ec6 | ||
|
|
f8f5c2474c | ||
|
|
b997e9a135 | ||
|
|
c7ccac2fe6 | ||
|
|
05885f568e | ||
|
|
b500b9f6cc | ||
|
|
e784c08f80 | ||
|
|
45ea5cc875 | ||
|
|
a006698bb2 | ||
|
|
e365944dc3 | ||
|
|
c33dcb78d0 | ||
|
|
e48ec3af7c | ||
|
|
4b9d7d1a1f | ||
|
|
d6133905b2 | ||
|
|
741b401d8c | ||
|
|
cb661313c2 | ||
|
|
3c794849bd | ||
|
|
753b4e69ee | ||
|
|
b502007fff | ||
|
|
1e6d65fe53 | ||
|
|
72515a79ca | ||
|
|
b286008403 | ||
|
|
c8e3f752db | ||
|
|
33c3822b7c | ||
|
|
97701ef3c4 | ||
|
|
d2eadcd2f5 | ||
|
|
6589f8c4f4 | ||
|
|
13dabc09c7 | ||
|
|
eb80f38813 | ||
|
|
0fc6a73b30 | ||
|
|
aa38b13adf | ||
|
|
6a79f41367 | ||
|
|
88263ccc77 | ||
|
|
9d15704b78 | ||
|
|
832060e8ad | ||
|
|
5d5652907b | ||
|
|
477d7957e3 | ||
|
|
41b39a5d3b | ||
|
|
6972b544ec | ||
|
|
1bd9eca806 | ||
|
|
a203eef9a6 | ||
|
|
f583b84951 | ||
|
|
8f319a4405 | ||
|
|
862a5ebd12 | ||
|
|
cb89bd3908 | ||
|
|
54dd424b01 | ||
|
|
b6b88086f3 | ||
|
|
b2ec99e663 | ||
|
|
74c101628b | ||
|
|
ea28b8afa4 | ||
|
|
f5d7c90be1 | ||
|
|
62b6c5193a | ||
|
|
6d9ea8a13c | ||
|
|
9abac555c3 | ||
|
|
f742f850eb | ||
|
|
83ca24b32a | ||
|
|
484e7c2102 | ||
|
|
f416e12dac | ||
|
|
1a140ab5c8 | ||
|
|
006c5f8655 | ||
|
|
b0e2985f5e | ||
|
|
cbb57411a0 | ||
|
|
28c1172db3 | ||
|
|
e708946f4c | ||
|
|
b9fff95215 | ||
|
|
7cd3a143a0 | ||
|
|
7248e90762 | ||
|
|
ceef883ad8 | ||
|
|
8a98924ad7 | ||
|
|
9526b9b6fe | ||
|
|
741f694733 | ||
|
|
8f2ef9082b | ||
|
|
e7dcc088d6 | ||
|
|
f036c3f1cc | ||
|
|
d3c64be229 | ||
|
|
5404309193 | ||
|
|
635b4d2432 | ||
|
|
3fc9ff3abf | ||
|
|
41833c8aad | ||
|
|
fdf9778f46 | ||
|
|
1e676f5a6b | ||
|
|
0af944176a | ||
|
|
6fe13b6a92 | ||
|
|
4f562e0d8e | ||
|
|
fdae50a972 | ||
|
|
277886b092 | ||
|
|
75c407ca01 | ||
|
|
2b40c5a55c | ||
|
|
cffe55428a | ||
|
|
f51708e01d | ||
|
|
3e6b98894d | ||
|
|
25faa7e702 | ||
|
|
c6dab1fe9a | ||
|
|
c9178aef76 | ||
|
|
aa8b349711 | ||
|
|
6194948259 | ||
|
|
ff6e898091 | ||
|
|
c43503eb27 | ||
|
|
2373d0ace7 | ||
|
|
f10ac6da06 | ||
|
|
e90b9fe5e3 | ||
|
|
da73365c2f | ||
|
|
3f9253a550 | ||
|
|
0ed316eaa4 | ||
|
|
5f80e12faf | ||
|
|
64d92fdfce | ||
|
|
6c400c80a2 | ||
|
|
9846d87a40 | ||
|
|
e952f3d775 | ||
|
|
726f2083db | ||
|
|
436db82006 | ||
|
|
5938869e7a | ||
|
|
4bad8585e5 | ||
|
|
9af95e017a | ||
|
|
5e74eaf3f2 | ||
|
|
74268d6a9b | ||
|
|
4d53e6b33e | ||
|
|
9f70031cc1 | ||
|
|
c74a92d220 | ||
|
|
a4c24fc197 | ||
|
|
25fccbd095 | ||
|
|
c9fce06bd7 | ||
|
|
b1040b56d5 | ||
|
|
5359427981 | ||
|
|
764f61a500 | ||
|
|
e292790cea | ||
|
|
1fb329f1c1 | ||
|
|
a2fc1b9f40 | ||
|
|
419e7c5b31 | ||
|
|
efbd78fb7c | ||
|
|
486c951982 | ||
|
|
468aff6e3f | ||
|
|
fc67c53f4c | ||
|
|
f0a887981d | ||
|
|
7628b0ffff | ||
|
|
63d8cf27fd | ||
|
|
eb9149b96a | ||
|
|
f5410c0786 | ||
|
|
7624445b4b | ||
|
|
ece05caa28 | ||
|
|
702c186c2c | ||
|
|
22ce57e628 | ||
|
|
10f1f5b1d6 | ||
|
|
a30062db71 | ||
|
|
182499a79b | ||
|
|
6e148e7d62 | ||
|
|
6a31504cf8 | ||
|
|
a6bb35a20d | ||
|
|
b53282e3e0 | ||
|
|
d6fd9517f0 | ||
|
|
bbcd3598b2 | ||
|
|
4ad966d909 | ||
|
|
f61db7f7bf | ||
|
|
95fb6cc204 | ||
|
|
5668653785 | ||
|
|
3325d81cab | ||
|
|
78f9142b35 | ||
|
|
f18ed56909 | ||
|
|
951da716a6 | ||
|
|
7ac11952eb | ||
|
|
a99b6e37e4 | ||
|
|
9b567b7ead | ||
|
|
67f0ae92ef | ||
|
|
4e2683f8fc | ||
|
|
f0d10fb1f9 | ||
|
|
aea6942a1f | ||
|
|
d0a2ccd7d6 | ||
|
|
84099b1d0b | ||
|
|
1b7dd2dd2a | ||
|
|
e5d4ba48fb | ||
|
|
22ff61d7f3 | ||
|
|
f066321f3a | ||
|
|
302603aa54 | ||
|
|
dea858e187 | ||
|
|
ddbee2ed04 | ||
|
|
b7c9677c7a | ||
|
|
d6581cab2e | ||
|
|
66c481e3dc | ||
|
|
edd01785d5 | ||
|
|
192aa4255c | ||
|
|
637ca2f312 | ||
|
|
bf7a0600f3 | ||
|
|
f59654d75e | ||
|
|
211665c0c4 | ||
|
|
829e3eb634 | ||
|
|
683f007e0b | ||
|
|
c77fe5c454 | ||
|
|
23bfecd870 | ||
|
|
0b485d8d96 | ||
|
|
1d42d88c3f | ||
|
|
ec0b2fa181 | ||
|
|
1b621e1655 | ||
|
|
3ecadf72e9 | ||
|
|
744298bdb5 | ||
|
|
fe090113ce | ||
|
|
55e50f68d3 | ||
|
|
8d13de0e8c | ||
|
|
41aae794b6 | ||
|
|
dbafce0aa8 | ||
|
|
383777c0f5 | ||
|
|
4fdc19ff20 | ||
|
|
518c0a8bfb | ||
|
|
d17cd42b19 | ||
|
|
894da801b1 | ||
|
|
642d573c3b | ||
|
|
03cf6ffd60 | ||
|
|
989becb8dd | ||
|
|
97e0b732d0 | ||
|
|
80073c22b1 | ||
|
|
49edaa33ac | ||
|
|
f184808ab5 | ||
|
|
a1bb6685d4 | ||
|
|
53e3e603b9 | ||
|
|
827678961c | ||
|
|
17368a0a12 | ||
|
|
9a9387b151 | ||
|
|
7f8d4d94d0 | ||
|
|
df228fca6d | ||
|
|
1ccc2c891e |
3
.github/ISSUE_TEMPLATE/bug_report.md
vendored
3
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -7,6 +7,9 @@ assignees: ''
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
**Was this bug identified in a specific build version?**
|
||||||
|
Please note the build version where this bug was identified
|
||||||
|
|
||||||
**Describe the bug**
|
**Describe the bug**
|
||||||
A clear and concise description of what the bug is.
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
|
|||||||
27
.github/ISSUE_TEMPLATE/rfi_request.md
vendored
Normal file
27
.github/ISSUE_TEMPLATE/rfi_request.md
vendored
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
---
|
||||||
|
name: Request for Information
|
||||||
|
about: Request specific information about capabilities of the framework
|
||||||
|
title: "[RFI]-"
|
||||||
|
labels: RFI
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**What is your request?**
|
||||||
|
Please provide as much detail as possible.
|
||||||
|
|
||||||
|
|
||||||
|
**What is the intended use case**
|
||||||
|
- [ ] Essentials Standalone Application
|
||||||
|
- [ ] Essentials + SIMPL Windows Hybrid
|
||||||
|
|
||||||
|
**User Interface Requirements**
|
||||||
|
- [ ] Not Applicable (logic only)
|
||||||
|
- [ ] Crestron Smart Graphics Touchpanel
|
||||||
|
- [ ] Cisco Touch10
|
||||||
|
- [ ] Mobile Control
|
||||||
|
- [ ] Crestron CH5 Touchpanel interface
|
||||||
|
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context or screenshots about the request here.
|
||||||
3
.github/scripts/ZipBuildOutput.ps1
vendored
3
.github/scripts/ZipBuildOutput.ps1
vendored
@@ -8,9 +8,10 @@ $destination = "$($Env:GITHUB_HOME)\output"
|
|||||||
New-Item -ItemType Directory -Force -Path ($destination)
|
New-Item -ItemType Directory -Force -Path ($destination)
|
||||||
Get-ChildItem ($destination)
|
Get-ChildItem ($destination)
|
||||||
$exclusions = @(git submodule foreach --quiet 'echo $name')
|
$exclusions = @(git submodule foreach --quiet 'echo $name')
|
||||||
|
$exclusions += "Newtonsoft.Compact.Json.dll"
|
||||||
# Trying to get any .json schema files (not currently working)
|
# Trying to get any .json schema files (not currently working)
|
||||||
# Gets any files with the listed extensions.
|
# Gets any files with the listed extensions.
|
||||||
Get-ChildItem -recurse -Path "$($Env:GITHUB_WORKSPACE)" -include "*.clz", "*.cpz", "*.cplz", "*.dll" | ForEach-Object {
|
Get-ChildItem -recurse -Path "$($Env:GITHUB_WORKSPACE)" -include "*.clz", "*.cpz", "*.cplz", "*.dll", "*.nuspec" | ForEach-Object {
|
||||||
$allowed = $true;
|
$allowed = $true;
|
||||||
# Exclude any files in submodules
|
# Exclude any files in submodules
|
||||||
foreach ($exclude in $exclusions) {
|
foreach ($exclude in $exclusions) {
|
||||||
|
|||||||
161
.github/workflows/docker.yml
vendored
161
.github/workflows/docker.yml
vendored
@@ -8,12 +8,9 @@ on:
|
|||||||
- bugfix/*
|
- bugfix/*
|
||||||
- release/*
|
- release/*
|
||||||
- development
|
- development
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- development
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
# solution path doesn't need slashes unless there it is multiple folders deep
|
# solution path doesn't need slashes unless it is multiple folders deep
|
||||||
# solution name does not include extension. .sln is assumed
|
# solution name does not include extension. .sln is assumed
|
||||||
SOLUTION_PATH: PepperDashEssentials
|
SOLUTION_PATH: PepperDashEssentials
|
||||||
SOLUTION_FILE: PepperDashEssentials
|
SOLUTION_FILE: PepperDashEssentials
|
||||||
@@ -32,7 +29,6 @@ jobs:
|
|||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
submodules: true
|
|
||||||
# Fetch all tags
|
# Fetch all tags
|
||||||
- name: Fetch tags
|
- name: Fetch tags
|
||||||
run: git fetch --tags
|
run: git fetch --tags
|
||||||
@@ -41,13 +37,14 @@ jobs:
|
|||||||
shell: powershell
|
shell: powershell
|
||||||
run: |
|
run: |
|
||||||
$version = ./.github/scripts/GenerateVersionNumber.ps1
|
$version = ./.github/scripts/GenerateVersionNumber.ps1
|
||||||
Write-Output "::set-env name=VERSION::$version"
|
echo "VERSION=$version" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
|
||||||
# Use the version number to set the version of the assemblies
|
# Use the version number to set the version of the assemblies
|
||||||
- name: Update AssemblyInfo.cs
|
- name: Update AssemblyInfo.cs
|
||||||
shell: powershell
|
shell: powershell
|
||||||
run: |
|
run: |
|
||||||
Write-Output ${{ env.VERSION }}
|
|
||||||
./.github/scripts/UpdateAssemblyVersion.ps1 ${{ env.VERSION }}
|
./.github/scripts/UpdateAssemblyVersion.ps1 ${{ env.VERSION }}
|
||||||
|
- name: restore Nuget Packages
|
||||||
|
run: nuget install .\packages.config -OutputDirectory .\packages -ExcludeVersion
|
||||||
# Login to Docker
|
# Login to Docker
|
||||||
- name: Login to Docker
|
- name: Login to Docker
|
||||||
uses: azure/docker-login@v1
|
uses: azure/docker-login@v1
|
||||||
@@ -78,16 +75,9 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: Version
|
name: Version
|
||||||
path: ${{env.GITHUB_HOME}}\output\version.txt
|
path: ${{env.GITHUB_HOME}}\output\version.txt
|
||||||
# Create the release on the source repo
|
|
||||||
- name: Create tag for non-rc builds
|
|
||||||
if: contains(env.VERSION, 'alpha') || contains(env.VERSION, 'beta')
|
|
||||||
run: |
|
|
||||||
git tag $($Env:VERSION)
|
|
||||||
git push --tags origin
|
|
||||||
- name: Create Release
|
- name: Create Release
|
||||||
id: create_release
|
id: create_release
|
||||||
# using contributor's version to allow for pointing at the right commit
|
# using contributor's version to allow for pointing at the right commit
|
||||||
if: contains(env.VERSION,'-rc-') || contains(env.VERSION,'-hotfix-')
|
|
||||||
uses: fleskesvor/create-release@feature/support-target-commitish
|
uses: fleskesvor/create-release@feature/support-target-commitish
|
||||||
with:
|
with:
|
||||||
tag_name: ${{ env.VERSION }}
|
tag_name: ${{ env.VERSION }}
|
||||||
@@ -97,7 +87,6 @@ jobs:
|
|||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
# Upload the build package to the release
|
# Upload the build package to the release
|
||||||
- name: Upload Release Package
|
- name: Upload Release Package
|
||||||
if: contains(env.VERSION,'-rc-') || contains(env.VERSION,'-hotfix-')
|
|
||||||
id: upload_release
|
id: upload_release
|
||||||
uses: actions/upload-release-asset@v1
|
uses: actions/upload-release-asset@v1
|
||||||
with:
|
with:
|
||||||
@@ -107,160 +96,46 @@ jobs:
|
|||||||
asset_content_type: application/zip
|
asset_content_type: application/zip
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
# This step always runs and pushes the build to the internal build rep
|
Push_Nuget_Package:
|
||||||
Internal_Push_Output:
|
|
||||||
needs: Build_Project
|
needs: Build_Project
|
||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
steps:
|
steps:
|
||||||
- name: check Github ref
|
|
||||||
run: ${{toJson(github.ref)}}
|
|
||||||
# Checkout the repo
|
|
||||||
- name: Checkout Builds Repo
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
token: ${{ secrets.BUILDS_TOKEN }}
|
|
||||||
repository: PepperDash-Engineering/essentials-builds
|
|
||||||
ref: ${{ Env.GITHUB_REF }}
|
|
||||||
# Download the version artifact from the build job
|
|
||||||
- name: Download Build Version Info
|
- name: Download Build Version Info
|
||||||
uses: actions/download-artifact@v1
|
uses: actions/download-artifact@v1
|
||||||
with:
|
with:
|
||||||
name: Version
|
name: Version
|
||||||
- name: Check Directory
|
|
||||||
run: Get-ChildItem "./"
|
|
||||||
# Set the version number environment variable from the file we just downloaded
|
|
||||||
- name: Set Version Number
|
- name: Set Version Number
|
||||||
shell: powershell
|
shell: powershell
|
||||||
run: |
|
run: |
|
||||||
Get-ChildItem "./Version"
|
Get-ChildItem "./Version"
|
||||||
$version = Get-Content -Path ./Version/version.txt
|
$version = Get-Content -Path ./Version/version.txt
|
||||||
Write-Host "Version: $version"
|
Write-Host "Version: $version"
|
||||||
Write-Output "::set-env name=VERSION::$version"
|
echo "VERSION=$version" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
|
||||||
Remove-Item -Path ./Version/version.txt
|
Remove-Item -Path ./Version/version.txt
|
||||||
Remove-Item -Path ./Version
|
Remove-Item -Path ./Version
|
||||||
# Checkout/Create the branch
|
|
||||||
- name: Create new branch
|
|
||||||
run: git checkout -b $($Env:GITHUB_REF -replace "refs/heads/")
|
|
||||||
# Download the build output into the repo
|
|
||||||
- name: Download Build output
|
- name: Download Build output
|
||||||
uses: actions/download-artifact@v1
|
uses: actions/download-artifact@v1
|
||||||
with:
|
with:
|
||||||
name: Build
|
name: Build
|
||||||
path: ./
|
path: ./
|
||||||
- name: Check directory
|
|
||||||
run: Get-ChildItem ./
|
|
||||||
# Unzip the build package file
|
|
||||||
- name: Unzip Build file
|
- name: Unzip Build file
|
||||||
run: |
|
run: |
|
||||||
Get-ChildItem .\*.zip | Expand-Archive -DestinationPath .\
|
Get-ChildItem .\*.zip | Expand-Archive -DestinationPath .\
|
||||||
Remove-Item -Path .\*.zip
|
Remove-Item -Path .\*.zip
|
||||||
- name: Check directory again
|
|
||||||
run: Get-ChildItem ./
|
|
||||||
# Copy Contents of output folder to root directory
|
|
||||||
- name: Copy Files to root & delete output directory
|
- name: Copy Files to root & delete output directory
|
||||||
run: |
|
run: |
|
||||||
Remove-Item -Path .\* -Include @("*.cpz","*.md","*.cplz","*.json","*.dll","*.clz")
|
Remove-Item -Path .\* -Include @("*.cpz","*.md","*.cplz","*.json","*.dll","*.clz")
|
||||||
Get-ChildItem -Path .\output\* | Copy-Item -Destination .\
|
Get-ChildItem -Path .\output\* | Copy-Item -Destination .\
|
||||||
Remove-Item -Path .\output -Recurse
|
Remove-Item -Path .\output -Recurse
|
||||||
# Commits the build output to the branch and tags it with the version
|
- name: Add nuget.exe
|
||||||
- name: Commit build output and tag the commit
|
uses: nuget/setup-nuget@v1
|
||||||
shell: powershell
|
- name: Add Github Packages source
|
||||||
run: |
|
run: nuget sources add -name github -source https://nuget.pkg.github.com/pepperdash/index.json -username Pepperdash -password ${{ secrets.GITHUB_TOKEN }}
|
||||||
git config user.email "actions@pepperdash.com"
|
- name: Add nuget.org API Key
|
||||||
git config user.name "GitHub Actions"
|
run: nuget setApiKey ${{ secrets.NUGET_API_KEY }}
|
||||||
git add .
|
- name: Create nuget package
|
||||||
$commit = "Build $($Env:GITHUB_RUN_NUMBER) from commit: https://github.com/$($Env:GITHUB_REPOSITORY)/commit/$($Env:GITHUB_SHA)"
|
run: nuget pack "./PepperDash_Essentials_Core.nuspec" -version ${{ env.VERSION }}
|
||||||
Write-Host "Commit: $commit"
|
- name: Publish nuget package to Github registry
|
||||||
git commit -m $commit
|
run: nuget push **/*.nupkg -source github
|
||||||
git tag $($Env:VERSION)
|
- name: Publish nuget package to nuget.org
|
||||||
# Push the commit
|
run: nuget push **/*.nupkg -Source https://api.nuget.org/v3/index.json
|
||||||
- name: Push to Builds Repo
|
|
||||||
shell: powershell
|
|
||||||
run: |
|
|
||||||
$branch = $($Env:GITHUB_REF) -replace "refs/heads/"
|
|
||||||
Write-Host "Branch: $branch"
|
|
||||||
git push -u origin $($branch) --force
|
|
||||||
# Push the tags
|
|
||||||
- name: Push tags
|
|
||||||
run: git push --tags origin
|
|
||||||
- name: Check Directory
|
|
||||||
run: Get-ChildItem ./
|
|
||||||
# This step only runs if the branch is main or release/ runs and pushes the build to the public build repo
|
|
||||||
Public_Push_Output:
|
|
||||||
needs: Build_Project
|
|
||||||
runs-on: windows-latest
|
|
||||||
if: contains(github.ref, 'main') || contains(github.ref, '/release/')
|
|
||||||
steps:
|
|
||||||
# Checkout the repo
|
|
||||||
- name: check Github ref
|
|
||||||
run: ${{toJson(github.ref)}}
|
|
||||||
- name: Checkout Builds Repo
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
token: ${{ secrets.BUILDS_TOKEN }}
|
|
||||||
repository: PepperDash/Essentials-Builds
|
|
||||||
ref: ${{ Env.GITHUB_REF }}
|
|
||||||
# Download the version artifact from the build job
|
|
||||||
- name: Download Build Version Info
|
|
||||||
uses: actions/download-artifact@v1
|
|
||||||
with:
|
|
||||||
name: Version
|
|
||||||
- name: Check Directory
|
|
||||||
run: Get-ChildItem "./"
|
|
||||||
# Set the version number environment variable from the file we just downloaded
|
|
||||||
- name: Set Version Number
|
|
||||||
shell: powershell
|
|
||||||
run: |
|
|
||||||
Get-ChildItem "./Version"
|
|
||||||
$version = Get-Content -Path ./Version/version.txt
|
|
||||||
Write-Host "Version: $version"
|
|
||||||
Write-Output "::set-env name=VERSION::$version"
|
|
||||||
Remove-Item -Path ./Version/version.txt
|
|
||||||
Remove-Item -Path ./Version
|
|
||||||
# Checkout/Create the branch
|
|
||||||
- name: Create new branch
|
|
||||||
run: git checkout -b $($Env:GITHUB_REF -replace "refs/heads/")
|
|
||||||
# Download the build output into the repo
|
|
||||||
- name: Download Build output
|
|
||||||
uses: actions/download-artifact@v1
|
|
||||||
with:
|
|
||||||
name: Build
|
|
||||||
path: ./
|
|
||||||
- name: Check directory
|
|
||||||
run: Get-ChildItem ./
|
|
||||||
# Unzip the build package file
|
|
||||||
- name: Unzip Build file
|
|
||||||
run: |
|
|
||||||
Get-ChildItem .\*.zip | Expand-Archive -DestinationPath .\
|
|
||||||
Remove-Item -Path .\*.zip
|
|
||||||
- name: Check directory again
|
|
||||||
run: Get-ChildItem ./
|
|
||||||
# Copy Contents of output folder to root directory
|
|
||||||
- name: Copy Files to root & delete output directory
|
|
||||||
run: |
|
|
||||||
Remove-Item -Path .\* -Include @("*.cpz","*.md","*.cplz","*.json","*.dll","*.clz")
|
|
||||||
Get-ChildItem -Path .\output\* | Copy-Item -Destination .\
|
|
||||||
Remove-Item -Path .\output -Recurse
|
|
||||||
# Commits the build output to the branch and tags it with the version
|
|
||||||
- name: Commit build output and tag the commit
|
|
||||||
shell: powershell
|
|
||||||
run: |
|
|
||||||
git config user.email "actions@pepperdash.com"
|
|
||||||
git config user.name "GitHub Actions"
|
|
||||||
git add .
|
|
||||||
$commit = "Build $($Env:GITHUB_RUN_NUMBER) from commit: https://github.com/$($Env:GITHUB_REPOSITORY)/commit/$($Env:GITHUB_SHA)"
|
|
||||||
Write-Host "Commit: $commit"
|
|
||||||
git commit -m $commit
|
|
||||||
git tag $($Env:VERSION)
|
|
||||||
# Push the commit
|
|
||||||
- name: Push to Builds Repo
|
|
||||||
shell: powershell
|
|
||||||
run: |
|
|
||||||
$branch = $($Env:GITHUB_REF) -replace "refs/heads/"
|
|
||||||
Write-Host "Branch: $branch"
|
|
||||||
git push -u origin $($branch) --force
|
|
||||||
# Push the tags
|
|
||||||
- name: Push tags
|
|
||||||
run: git push --tags origin
|
|
||||||
- name: Check Directory
|
|
||||||
run: Get-ChildItem ./
|
|
||||||
|
|||||||
145
.github/workflows/main.yml
vendored
145
.github/workflows/main.yml
vendored
@@ -24,26 +24,21 @@ jobs:
|
|||||||
# First we checkout the source repo
|
# First we checkout the source repo
|
||||||
- name: Checkout repo
|
- name: Checkout repo
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
# And any submodules
|
with:
|
||||||
- name: Checkout submodules
|
fetch-depth: 0
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
git config --global url."https://github.com/".insteadOf "git@github.com:"
|
|
||||||
auth_header="$(git config --local --get http.https://github.com/.extraheader)"
|
|
||||||
git submodule sync --recursive
|
|
||||||
git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive --depth=1
|
|
||||||
# Generate the appropriate version number
|
# Generate the appropriate version number
|
||||||
- name: Set Version Number
|
- name: Set Version Number
|
||||||
shell: powershell
|
shell: powershell
|
||||||
env:
|
env:
|
||||||
TAG_NAME: ${{ github.event.release.tag_name }}
|
TAG_NAME: ${{ github.event.release.tag_name }}
|
||||||
run: Write-Output "::set-env name=VERSION::$($Env:TAG_NAME)"
|
run: echo "VERSION=$($Env:TAG_NAME)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
|
||||||
# Use the version number to set the version of the assemblies
|
# Use the version number to set the version of the assemblies
|
||||||
- name: Update AssemblyInfo.cs
|
- name: Update AssemblyInfo.cs
|
||||||
shell: powershell
|
shell: powershell
|
||||||
run: |
|
run: |
|
||||||
Write-Output ${{ env.VERSION }}
|
|
||||||
./.github/scripts/UpdateAssemblyVersion.ps1 ${{ env.VERSION }}
|
./.github/scripts/UpdateAssemblyVersion.ps1 ${{ env.VERSION }}
|
||||||
|
- name: restore Nuget Packages
|
||||||
|
run: nuget install .\packages.config -OutputDirectory .\packages -ExcludeVersion
|
||||||
# Login to Docker
|
# Login to Docker
|
||||||
- name: Login to Docker
|
- name: Login to Docker
|
||||||
uses: azure/docker-login@v1
|
uses: azure/docker-login@v1
|
||||||
@@ -85,148 +80,46 @@ jobs:
|
|||||||
asset_content_type: application/zip
|
asset_content_type: application/zip
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
Internal_Push_Output:
|
Push_Nuget_Package:
|
||||||
needs: Build_Project
|
needs: Build_Project
|
||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
steps:
|
steps:
|
||||||
# Checkout the repo
|
|
||||||
- name: Checkout Builds Repo
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
token: ${{ secrets.BUILDS_TOKEN }}
|
|
||||||
repository: PepperDash-Engineering/essentials-builds
|
|
||||||
ref: ${{ Env.GITHUB_REF }}
|
|
||||||
# Download the version artifact from the build job
|
|
||||||
- name: Download Build Version Info
|
- name: Download Build Version Info
|
||||||
uses: actions/download-artifact@v1
|
uses: actions/download-artifact@v1
|
||||||
with:
|
with:
|
||||||
name: Version
|
name: Version
|
||||||
- name: Check Directory
|
|
||||||
run: Get-ChildItem "./"
|
|
||||||
# Set the version number environment variable from the file we just downloaded
|
|
||||||
- name: Set Version Number
|
- name: Set Version Number
|
||||||
shell: powershell
|
shell: powershell
|
||||||
run: |
|
run: |
|
||||||
Get-ChildItem "./Version"
|
Get-ChildItem "./Version"
|
||||||
$version = Get-Content -Path ./Version/version.txt
|
$version = Get-Content -Path ./Version/version.txt
|
||||||
Write-Host "Version: $version"
|
Write-Host "Version: $version"
|
||||||
Write-Output "::set-env name=VERSION::$version"
|
echo "VERSION=$version" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
|
||||||
Remove-Item -Path ./Version/version.txt
|
Remove-Item -Path ./Version/version.txt
|
||||||
Remove-Item -Path ./Version
|
Remove-Item -Path ./Version
|
||||||
# Checkout/Create the branch
|
|
||||||
- name: Checkout main branch
|
|
||||||
run: git checkout main
|
|
||||||
# Download the build output into the repo
|
|
||||||
- name: Download Build output
|
- name: Download Build output
|
||||||
uses: actions/download-artifact@v1
|
uses: actions/download-artifact@v1
|
||||||
with:
|
with:
|
||||||
name: Build
|
name: Build
|
||||||
path: ./
|
path: ./
|
||||||
- name: Check directory
|
|
||||||
run: Get-ChildItem ./
|
|
||||||
# Unzip the build package file
|
|
||||||
- name: Unzip Build file
|
- name: Unzip Build file
|
||||||
run: |
|
run: |
|
||||||
Get-ChildItem .\*.zip | Expand-Archive -DestinationPath .\
|
Get-ChildItem .\*.zip | Expand-Archive -DestinationPath .\
|
||||||
Remove-Item -Path .\*.zip
|
Remove-Item -Path .\*.zip
|
||||||
- name: Check directory again
|
|
||||||
run: Get-ChildItem ./
|
|
||||||
# Copy Contents of output folder to root directory
|
|
||||||
- name: Copy Files to root & delete output directory
|
- name: Copy Files to root & delete output directory
|
||||||
run: |
|
run: |
|
||||||
Remove-Item -Path .\* -Include @("*.cpz","*.md","*.cplz","*.json","*.dll","*.clz")
|
Remove-Item -Path .\* -Include @("*.cpz","*.md","*.cplz","*.json","*.dll","*.clz")
|
||||||
Get-ChildItem -Path .\output\* | Copy-Item -Destination .\
|
Get-ChildItem -Path .\output\* | Copy-Item -Destination .\
|
||||||
Remove-Item -Path .\output -Recurse
|
Remove-Item -Path .\output -Recurse
|
||||||
# Commits the build output to the branch and tags it with the version
|
- name: Add nuget.exe
|
||||||
- name: Commit build output and tag the commit
|
uses: nuget/setup-nuget@v1
|
||||||
shell: powershell
|
- name: Add Github Packages source
|
||||||
run: |
|
run: nuget sources add -name github -source https://nuget.pkg.github.com/pepperdash/index.json -username Pepperdash -password ${{ secrets.GITHUB_TOKEN }}
|
||||||
git config user.email "actions@pepperdash.com"
|
- name: Add nuget.org API Key
|
||||||
git config user.name "GitHub Actions"
|
run: nuget setApiKey ${{ secrets.NUGET_API_KEY }}
|
||||||
git add .
|
- name: Create nuget package
|
||||||
$commit = "Build $($Env:GITHUB_RUN_NUMBER) from commit: https://github.com/$($Env:GITHUB_REPOSITORY)/commit/$($Env:GITHUB_SHA)"
|
run: nuget pack "./PepperDash_Essentials_Core.nuspec" -version ${{ env.VERSION }}
|
||||||
Write-Host "Commit: $commit"
|
- name: Publish nuget package to Github registry
|
||||||
git commit -m $commit
|
run: nuget push **/*.nupkg -source github
|
||||||
git tag $($Env:VERSION)
|
- name: Publish nuget package to nuget.org
|
||||||
# Push the commit
|
run: nuget push **/*.nupkg -Source https://api.nuget.org/v3/index.json
|
||||||
- name: Push to Builds Repo
|
|
||||||
shell: powershell
|
|
||||||
run: git push -u origin main --force
|
|
||||||
# Push the tags
|
|
||||||
- name: Push tags
|
|
||||||
run: git push --tags origin
|
|
||||||
- name: Check Directory
|
|
||||||
run: Get-ChildItem ./
|
|
||||||
# This step only runs if the branch is main or release/ runs and pushes the build to the public build repo
|
|
||||||
Public_Push_Output:
|
|
||||||
needs: Build_Project
|
|
||||||
runs-on: windows-latest
|
|
||||||
steps:
|
|
||||||
# Checkout the repo
|
|
||||||
- name: Checkout Builds Repo
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
token: ${{ secrets.BUILDS_TOKEN }}
|
|
||||||
repository: PepperDash/Essentials-Builds
|
|
||||||
ref: ${{ Env.GITHUB_REF }}
|
|
||||||
# Download the version artifact from the build job
|
|
||||||
- name: Download Build Version Info
|
|
||||||
uses: actions/download-artifact@v1
|
|
||||||
with:
|
|
||||||
name: Version
|
|
||||||
- name: Check Directory
|
|
||||||
run: Get-ChildItem "./"
|
|
||||||
# Set the version number environment variable from the file we just downloaded
|
|
||||||
- name: Set Version Number
|
|
||||||
shell: powershell
|
|
||||||
run: |
|
|
||||||
Get-ChildItem "./Version"
|
|
||||||
$version = Get-Content -Path ./Version/version.txt
|
|
||||||
Write-Host "Version: $version"
|
|
||||||
Write-Output "::set-env name=VERSION::$version"
|
|
||||||
Remove-Item -Path ./Version/version.txt
|
|
||||||
Remove-Item -Path ./Version
|
|
||||||
# Checkout main branch
|
|
||||||
- name: Create new branch
|
|
||||||
run: git checkout main
|
|
||||||
# Download the build output into the repo
|
|
||||||
- name: Download Build output
|
|
||||||
uses: actions/download-artifact@v1
|
|
||||||
with:
|
|
||||||
name: Build
|
|
||||||
path: ./
|
|
||||||
- name: Check directory
|
|
||||||
run: Get-ChildItem ./
|
|
||||||
# Unzip the build package file
|
|
||||||
- name: Unzip Build file
|
|
||||||
run: |
|
|
||||||
Get-ChildItem .\*.zip | Expand-Archive -DestinationPath .\
|
|
||||||
Remove-Item -Path .\*.zip
|
|
||||||
- name: Check directory again
|
|
||||||
run: Get-ChildItem ./
|
|
||||||
# Copy Contents of output folder to root directory
|
|
||||||
- name: Copy Files to root & delete output directory
|
|
||||||
run: |
|
|
||||||
Remove-Item -Path .\* -Include @("*.cpz","*.md","*.cplz","*.json","*.dll","*.clz")
|
|
||||||
Get-ChildItem -Path .\output\* | Copy-Item -Destination .\
|
|
||||||
Remove-Item -Path .\output -Recurse
|
|
||||||
# Commits the build output to the branch and tags it with the version
|
|
||||||
- name: Commit build output and tag the commit
|
|
||||||
shell: powershell
|
|
||||||
run: |
|
|
||||||
git config user.email "actions@pepperdash.com"
|
|
||||||
git config user.name "GitHub Actions"
|
|
||||||
git add .
|
|
||||||
$commit = "Build $($Env:GITHUB_RUN_NUMBER) from commit: https://github.com/$($Env:GITHUB_REPOSITORY)/commit/$($Env:GITHUB_SHA)"
|
|
||||||
Write-Host "Commit: $commit"
|
|
||||||
git commit -m $commit
|
|
||||||
git tag $($Env:VERSION)
|
|
||||||
# Push the commit
|
|
||||||
- name: Push to Builds Repo
|
|
||||||
shell: powershell
|
|
||||||
run: git push -u origin main --force
|
|
||||||
# Push the tags
|
|
||||||
- name: Push tags
|
|
||||||
run: git push --tags origin
|
|
||||||
- name: Check Directory
|
|
||||||
run: Get-ChildItem ./
|
|
||||||
|
|||||||
364
.gitignore
vendored
364
.gitignore
vendored
@@ -23,5 +23,369 @@ SIMPLSharpLogs/
|
|||||||
*.projectinfo
|
*.projectinfo
|
||||||
essentials-framework/EssentialDMTestConfig/
|
essentials-framework/EssentialDMTestConfig/
|
||||||
output/
|
output/
|
||||||
|
packages/
|
||||||
|
|
||||||
PepperDashEssentials-0.0.0-buildType-test.zip
|
PepperDashEssentials-0.0.0-buildType-test.zip
|
||||||
|
## Ignore Visual Studio temporary files, build results, and
|
||||||
|
## files generated by popular Visual Studio add-ons.
|
||||||
|
##
|
||||||
|
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
||||||
|
|
||||||
|
# User-specific files
|
||||||
|
*.rsuser
|
||||||
|
*.suo
|
||||||
|
*.user
|
||||||
|
*.userosscache
|
||||||
|
*.sln.docstates
|
||||||
|
|
||||||
|
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||||
|
*.userprefs
|
||||||
|
|
||||||
|
# Mono auto generated files
|
||||||
|
mono_crash.*
|
||||||
|
|
||||||
|
# Build results
|
||||||
|
[Dd]ebug/
|
||||||
|
[Dd]ebugPublic/
|
||||||
|
[Rr]elease/
|
||||||
|
[Rr]eleases/
|
||||||
|
x64/
|
||||||
|
x86/
|
||||||
|
[Ww][Ii][Nn]32/
|
||||||
|
[Aa][Rr][Mm]/
|
||||||
|
[Aa][Rr][Mm]64/
|
||||||
|
bld/
|
||||||
|
[Bb]in/
|
||||||
|
[Oo]bj/
|
||||||
|
[Ll]og/
|
||||||
|
[Ll]ogs/
|
||||||
|
|
||||||
|
# Visual Studio 2015/2017 cache/options directory
|
||||||
|
.vs/
|
||||||
|
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||||
|
#wwwroot/
|
||||||
|
|
||||||
|
# Visual Studio 2017 auto generated files
|
||||||
|
Generated\ Files/
|
||||||
|
|
||||||
|
# MSTest test Results
|
||||||
|
[Tt]est[Rr]esult*/
|
||||||
|
[Bb]uild[Ll]og.*
|
||||||
|
|
||||||
|
# NUnit
|
||||||
|
*.VisualState.xml
|
||||||
|
TestResult.xml
|
||||||
|
nunit-*.xml
|
||||||
|
|
||||||
|
# Build Results of an ATL Project
|
||||||
|
[Dd]ebugPS/
|
||||||
|
[Rr]eleasePS/
|
||||||
|
dlldata.c
|
||||||
|
|
||||||
|
# Benchmark Results
|
||||||
|
BenchmarkDotNet.Artifacts/
|
||||||
|
|
||||||
|
# .NET Core
|
||||||
|
project.lock.json
|
||||||
|
project.fragment.lock.json
|
||||||
|
artifacts/
|
||||||
|
|
||||||
|
# ASP.NET Scaffolding
|
||||||
|
ScaffoldingReadMe.txt
|
||||||
|
|
||||||
|
# StyleCop
|
||||||
|
StyleCopReport.xml
|
||||||
|
|
||||||
|
# Files built by Visual Studio
|
||||||
|
*_i.c
|
||||||
|
*_p.c
|
||||||
|
*_h.h
|
||||||
|
*.ilk
|
||||||
|
*.meta
|
||||||
|
*.obj
|
||||||
|
*.iobj
|
||||||
|
*.pch
|
||||||
|
*.pdb
|
||||||
|
*.ipdb
|
||||||
|
*.pgc
|
||||||
|
*.pgd
|
||||||
|
*.rsp
|
||||||
|
*.sbr
|
||||||
|
*.tlb
|
||||||
|
*.tli
|
||||||
|
*.tlh
|
||||||
|
*.tmp
|
||||||
|
*.tmp_proj
|
||||||
|
*_wpftmp.csproj
|
||||||
|
*.log
|
||||||
|
*.vspscc
|
||||||
|
*.vssscc
|
||||||
|
.builds
|
||||||
|
*.pidb
|
||||||
|
*.svclog
|
||||||
|
*.scc
|
||||||
|
|
||||||
|
# Chutzpah Test files
|
||||||
|
_Chutzpah*
|
||||||
|
|
||||||
|
# Visual C++ cache files
|
||||||
|
ipch/
|
||||||
|
*.aps
|
||||||
|
*.ncb
|
||||||
|
*.opendb
|
||||||
|
*.opensdf
|
||||||
|
*.sdf
|
||||||
|
*.cachefile
|
||||||
|
*.VC.db
|
||||||
|
*.VC.VC.opendb
|
||||||
|
|
||||||
|
# Visual Studio profiler
|
||||||
|
*.psess
|
||||||
|
*.vsp
|
||||||
|
*.vspx
|
||||||
|
*.sap
|
||||||
|
|
||||||
|
# Visual Studio Trace Files
|
||||||
|
*.e2e
|
||||||
|
|
||||||
|
# TFS 2012 Local Workspace
|
||||||
|
$tf/
|
||||||
|
|
||||||
|
# Guidance Automation Toolkit
|
||||||
|
*.gpState
|
||||||
|
|
||||||
|
# ReSharper is a .NET coding add-in
|
||||||
|
_ReSharper*/
|
||||||
|
*.[Rr]e[Ss]harper
|
||||||
|
*.DotSettings.user
|
||||||
|
|
||||||
|
# TeamCity is a build add-in
|
||||||
|
_TeamCity*
|
||||||
|
|
||||||
|
# DotCover is a Code Coverage Tool
|
||||||
|
*.dotCover
|
||||||
|
|
||||||
|
# AxoCover is a Code Coverage Tool
|
||||||
|
.axoCover/*
|
||||||
|
!.axoCover/settings.json
|
||||||
|
|
||||||
|
# Coverlet is a free, cross platform Code Coverage Tool
|
||||||
|
coverage*.json
|
||||||
|
coverage*.xml
|
||||||
|
coverage*.info
|
||||||
|
|
||||||
|
# Visual Studio code coverage results
|
||||||
|
*.coverage
|
||||||
|
*.coveragexml
|
||||||
|
|
||||||
|
# NCrunch
|
||||||
|
_NCrunch_*
|
||||||
|
.*crunch*.local.xml
|
||||||
|
nCrunchTemp_*
|
||||||
|
|
||||||
|
# MightyMoose
|
||||||
|
*.mm.*
|
||||||
|
AutoTest.Net/
|
||||||
|
|
||||||
|
# Web workbench (sass)
|
||||||
|
.sass-cache/
|
||||||
|
|
||||||
|
# Installshield output folder
|
||||||
|
[Ee]xpress/
|
||||||
|
|
||||||
|
# DocProject is a documentation generator add-in
|
||||||
|
DocProject/buildhelp/
|
||||||
|
DocProject/Help/*.HxT
|
||||||
|
DocProject/Help/*.HxC
|
||||||
|
DocProject/Help/*.hhc
|
||||||
|
DocProject/Help/*.hhk
|
||||||
|
DocProject/Help/*.hhp
|
||||||
|
DocProject/Help/Html2
|
||||||
|
DocProject/Help/html
|
||||||
|
|
||||||
|
# Click-Once directory
|
||||||
|
publish/
|
||||||
|
|
||||||
|
# Publish Web Output
|
||||||
|
*.[Pp]ublish.xml
|
||||||
|
*.azurePubxml
|
||||||
|
# Note: Comment the next line if you want to checkin your web deploy settings,
|
||||||
|
# but database connection strings (with potential passwords) will be unencrypted
|
||||||
|
*.pubxml
|
||||||
|
*.publishproj
|
||||||
|
|
||||||
|
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||||
|
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||||
|
# in these scripts will be unencrypted
|
||||||
|
PublishScripts/
|
||||||
|
|
||||||
|
# NuGet Packages
|
||||||
|
*.nupkg
|
||||||
|
# NuGet Symbol Packages
|
||||||
|
*.snupkg
|
||||||
|
# The packages folder can be ignored because of Package Restore
|
||||||
|
**/[Pp]ackages/*
|
||||||
|
# except build/, which is used as an MSBuild target.
|
||||||
|
!**/[Pp]ackages/build/
|
||||||
|
# Uncomment if necessary however generally it will be regenerated when needed
|
||||||
|
#!**/[Pp]ackages/repositories.config
|
||||||
|
# NuGet v3's project.json files produces more ignorable files
|
||||||
|
*.nuget.props
|
||||||
|
*.nuget.targets
|
||||||
|
|
||||||
|
# Microsoft Azure Build Output
|
||||||
|
csx/
|
||||||
|
*.build.csdef
|
||||||
|
|
||||||
|
# Microsoft Azure Emulator
|
||||||
|
ecf/
|
||||||
|
rcf/
|
||||||
|
|
||||||
|
# Windows Store app package directories and files
|
||||||
|
AppPackages/
|
||||||
|
BundleArtifacts/
|
||||||
|
Package.StoreAssociation.xml
|
||||||
|
_pkginfo.txt
|
||||||
|
*.appx
|
||||||
|
*.appxbundle
|
||||||
|
*.appxupload
|
||||||
|
|
||||||
|
# Visual Studio cache files
|
||||||
|
# files ending in .cache can be ignored
|
||||||
|
*.[Cc]ache
|
||||||
|
# but keep track of directories ending in .cache
|
||||||
|
!?*.[Cc]ache/
|
||||||
|
|
||||||
|
# Others
|
||||||
|
ClientBin/
|
||||||
|
~$*
|
||||||
|
*~
|
||||||
|
*.dbmdl
|
||||||
|
*.dbproj.schemaview
|
||||||
|
*.jfm
|
||||||
|
*.pfx
|
||||||
|
*.publishsettings
|
||||||
|
orleans.codegen.cs
|
||||||
|
|
||||||
|
# Including strong name files can present a security risk
|
||||||
|
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
||||||
|
#*.snk
|
||||||
|
|
||||||
|
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||||
|
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||||
|
#bower_components/
|
||||||
|
|
||||||
|
# RIA/Silverlight projects
|
||||||
|
Generated_Code/
|
||||||
|
|
||||||
|
# Backup & report files from converting an old project file
|
||||||
|
# to a newer Visual Studio version. Backup files are not needed,
|
||||||
|
# because we have git ;-)
|
||||||
|
_UpgradeReport_Files/
|
||||||
|
Backup*/
|
||||||
|
UpgradeLog*.XML
|
||||||
|
UpgradeLog*.htm
|
||||||
|
ServiceFabricBackup/
|
||||||
|
*.rptproj.bak
|
||||||
|
|
||||||
|
# SQL Server files
|
||||||
|
*.mdf
|
||||||
|
*.ldf
|
||||||
|
*.ndf
|
||||||
|
|
||||||
|
# Business Intelligence projects
|
||||||
|
*.rdl.data
|
||||||
|
*.bim.layout
|
||||||
|
*.bim_*.settings
|
||||||
|
*.rptproj.rsuser
|
||||||
|
*- [Bb]ackup.rdl
|
||||||
|
*- [Bb]ackup ([0-9]).rdl
|
||||||
|
*- [Bb]ackup ([0-9][0-9]).rdl
|
||||||
|
|
||||||
|
# Microsoft Fakes
|
||||||
|
FakesAssemblies/
|
||||||
|
|
||||||
|
# GhostDoc plugin setting file
|
||||||
|
*.GhostDoc.xml
|
||||||
|
|
||||||
|
# Node.js Tools for Visual Studio
|
||||||
|
.ntvs_analysis.dat
|
||||||
|
node_modules/
|
||||||
|
|
||||||
|
# Visual Studio 6 build log
|
||||||
|
*.plg
|
||||||
|
|
||||||
|
# Visual Studio 6 workspace options file
|
||||||
|
*.opt
|
||||||
|
|
||||||
|
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||||
|
*.vbw
|
||||||
|
|
||||||
|
# Visual Studio LightSwitch build output
|
||||||
|
**/*.HTMLClient/GeneratedArtifacts
|
||||||
|
**/*.DesktopClient/GeneratedArtifacts
|
||||||
|
**/*.DesktopClient/ModelManifest.xml
|
||||||
|
**/*.Server/GeneratedArtifacts
|
||||||
|
**/*.Server/ModelManifest.xml
|
||||||
|
_Pvt_Extensions
|
||||||
|
|
||||||
|
# Paket dependency manager
|
||||||
|
.paket/paket.exe
|
||||||
|
paket-files/
|
||||||
|
|
||||||
|
# FAKE - F# Make
|
||||||
|
.fake/
|
||||||
|
|
||||||
|
# CodeRush personal settings
|
||||||
|
.cr/personal
|
||||||
|
|
||||||
|
# Python Tools for Visual Studio (PTVS)
|
||||||
|
__pycache__/
|
||||||
|
*.pyc
|
||||||
|
|
||||||
|
# Cake - Uncomment if you are using it
|
||||||
|
# tools/**
|
||||||
|
# !tools/packages.config
|
||||||
|
|
||||||
|
# Tabs Studio
|
||||||
|
*.tss
|
||||||
|
|
||||||
|
# Telerik's JustMock configuration file
|
||||||
|
*.jmconfig
|
||||||
|
|
||||||
|
# BizTalk build output
|
||||||
|
*.btp.cs
|
||||||
|
*.btm.cs
|
||||||
|
*.odx.cs
|
||||||
|
*.xsd.cs
|
||||||
|
|
||||||
|
# OpenCover UI analysis results
|
||||||
|
OpenCover/
|
||||||
|
|
||||||
|
# Azure Stream Analytics local run output
|
||||||
|
ASALocalRun/
|
||||||
|
|
||||||
|
# MSBuild Binary and Structured Log
|
||||||
|
*.binlog
|
||||||
|
|
||||||
|
# NVidia Nsight GPU debugger configuration file
|
||||||
|
*.nvuser
|
||||||
|
|
||||||
|
# MFractors (Xamarin productivity tool) working folder
|
||||||
|
.mfractor/
|
||||||
|
|
||||||
|
# Local History for Visual Studio
|
||||||
|
.localhistory/
|
||||||
|
|
||||||
|
# BeatPulse healthcheck temp database
|
||||||
|
healthchecksdb
|
||||||
|
|
||||||
|
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
||||||
|
MigrationBackup/
|
||||||
|
|
||||||
|
# Ionide (cross platform F# VS Code tools) working folder
|
||||||
|
.ionide/
|
||||||
|
|
||||||
|
# Fody - auto-generated XML schema
|
||||||
|
FodyWeavers.xsd
|
||||||
|
essentials-framework/Essentials Interfaces/PepperDash_Essentials_Interfaces/PepperDash_Essentials_Interfaces.csproj
|
||||||
|
|||||||
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -1,6 +1,3 @@
|
|||||||
[submodule "essentials-framework/pepperdashcore-builds"]
|
|
||||||
path = essentials-framework/pepperdashcore-builds
|
|
||||||
url = https://github.com/ndorin/PepperDashCore-Builds.git
|
|
||||||
[submodule "Essentials-Template-UI"]
|
[submodule "Essentials-Template-UI"]
|
||||||
path = Essentials-Template-UI
|
path = Essentials-Template-UI
|
||||||
url = https://github.com/PepperDash/Essentials-Template-UI.git
|
url = https://github.com/PepperDash/Essentials-Template-UI.git
|
||||||
|
|||||||
BIN
IR Drivers/Apple_AppleTV_4th_Gen_Essentials.ir
Normal file
BIN
IR Drivers/Apple_AppleTV_4th_Gen_Essentials.ir
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -70,6 +70,14 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
/// Range reports the highest supported HDCP state level for the corresponding input card
|
/// Range reports the highest supported HDCP state level for the corresponding input card
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public uint HdcpSupportCapability { get; set; }
|
public uint HdcpSupportCapability { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// DM Chassis Stream Input Start (1), Stop (2), Pause (3) with Feedback
|
||||||
|
/// </summary>
|
||||||
|
public uint InputStreamCardStatus { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// DM Chassis Stream Output Start (1), Stop (2), Pause (3) with Feedback
|
||||||
|
/// </summary>
|
||||||
|
public uint OutputStreamCardStatus { get; set; }
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Serials
|
#region Serials
|
||||||
@@ -115,6 +123,8 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
InputUsb = 700; //701-899
|
InputUsb = 700; //701-899
|
||||||
HdcpSupportState = 1000; //1001-1199
|
HdcpSupportState = 1000; //1001-1199
|
||||||
HdcpSupportCapability = 1200; //1201-1399
|
HdcpSupportCapability = 1200; //1201-1399
|
||||||
|
InputStreamCardStatus = 1500; //1501-1532
|
||||||
|
OutputStreamCardStatus = 1600; //1601-1632
|
||||||
|
|
||||||
|
|
||||||
//Serial
|
//Serial
|
||||||
@@ -145,6 +155,8 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
OutputEndpointOnline = OutputEndpointOnline + joinOffset;
|
OutputEndpointOnline = OutputEndpointOnline + joinOffset;
|
||||||
HdcpSupportState = HdcpSupportState + joinOffset;
|
HdcpSupportState = HdcpSupportState + joinOffset;
|
||||||
HdcpSupportCapability = HdcpSupportCapability + joinOffset;
|
HdcpSupportCapability = HdcpSupportCapability + joinOffset;
|
||||||
|
InputStreamCardStatus = InputStreamCardStatus + joinOffset;
|
||||||
|
OutputStreamCardStatus = OutputStreamCardStatus + joinOffset;
|
||||||
OutputDisabledByHdcp = OutputDisabledByHdcp + joinOffset;
|
OutputDisabledByHdcp = OutputDisabledByHdcp + joinOffset;
|
||||||
TxAdvancedIsPresent = TxAdvancedIsPresent + joinOffset;
|
TxAdvancedIsPresent = TxAdvancedIsPresent + joinOffset;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,11 +12,11 @@ using PepperDash.Core;
|
|||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
using PepperDash.Essentials.Core.Bridges;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
using PepperDash.Essentials.Core.Fusion;
|
||||||
using PepperDash.Essentials.Devices.Common;
|
using PepperDash.Essentials.Devices.Common;
|
||||||
using PepperDash.Essentials.DM;
|
using PepperDash.Essentials.DM;
|
||||||
using PepperDash.Essentials.Fusion;
|
using PepperDash.Essentials.Fusion;
|
||||||
using PepperDash.Essentials.Room.Config;
|
using PepperDash.Essentials.Room.Config;
|
||||||
//using PepperDash.Essentials.Room.MobileControl;
|
|
||||||
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
||||||
@@ -36,6 +36,7 @@ namespace PepperDash.Essentials
|
|||||||
Thread.MaxNumberOfUserThreads = 400;
|
Thread.MaxNumberOfUserThreads = 400;
|
||||||
Global.ControlSystem = this;
|
Global.ControlSystem = this;
|
||||||
DeviceManager.Initialize(this);
|
DeviceManager.Initialize(this);
|
||||||
|
SecretsManager.Initialize();
|
||||||
SystemMonitor.ProgramInitialization.ProgramInitializationUnderUserControl = true;
|
SystemMonitor.ProgramInitialization.ProgramInitializationUnderUserControl = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -53,7 +54,7 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
if (Debug.DoNotLoadOnNextBoot)
|
if (Debug.DoNotLoadOnNextBoot)
|
||||||
{
|
{
|
||||||
CrestronConsole.AddNewConsoleCommand(s => GoWithLoad(), "go", "Loads configuration file",
|
CrestronConsole.AddNewConsoleCommand(s => CrestronInvoke.BeginInvoke((o) => GoWithLoad()), "go", "Loads configuration file",
|
||||||
ConsoleAccessLevelEnum.AccessOperator);
|
ConsoleAccessLevelEnum.AccessOperator);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,7 +72,7 @@ namespace PepperDash.Essentials
|
|||||||
CrestronConsole.AddNewConsoleCommand(s =>
|
CrestronConsole.AddNewConsoleCommand(s =>
|
||||||
{
|
{
|
||||||
foreach (var tl in TieLineCollection.Default)
|
foreach (var tl in TieLineCollection.Default)
|
||||||
CrestronConsole.ConsoleCommandResponse(" {0}\r", tl);
|
CrestronConsole.ConsoleCommandResponse(" {0}\r\n", tl);
|
||||||
},
|
},
|
||||||
"listtielines", "Prints out all tie lines", ConsoleAccessLevelEnum.AccessOperator);
|
"listtielines", "Prints out all tie lines", ConsoleAccessLevelEnum.AccessOperator);
|
||||||
|
|
||||||
@@ -85,12 +86,15 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
CrestronConsole.AddNewConsoleCommand(s =>
|
CrestronConsole.AddNewConsoleCommand(s =>
|
||||||
{
|
{
|
||||||
CrestronConsole.ConsoleCommandResponse("This system can be found at the following URLs:\r" +
|
CrestronConsole.ConsoleCommandResponse("This system can be found at the following URLs:\r\n" +
|
||||||
"System URL: {0}\r" +
|
"System URL: {0}\r\n" +
|
||||||
"Template URL: {1}", ConfigReader.ConfigObject.SystemUrl, ConfigReader.ConfigObject.TemplateUrl);
|
"Template URL: {1}", ConfigReader.ConfigObject.SystemUrl, ConfigReader.ConfigObject.TemplateUrl);
|
||||||
}, "portalinfo", "Shows portal URLS from configuration", ConsoleAccessLevelEnum.AccessOperator);
|
}, "portalinfo", "Shows portal URLS from configuration", ConsoleAccessLevelEnum.AccessOperator);
|
||||||
|
|
||||||
|
|
||||||
|
CrestronConsole.AddNewConsoleCommand(DeviceManager.GetRoutingPorts,
|
||||||
|
"getroutingports", "Reports all routing ports, if any. Requires a device key", ConsoleAccessLevelEnum.AccessOperator);
|
||||||
|
|
||||||
if (!Debug.DoNotLoadOnNextBoot)
|
if (!Debug.DoNotLoadOnNextBoot)
|
||||||
{
|
{
|
||||||
GoWithLoad();
|
GoWithLoad();
|
||||||
@@ -127,29 +131,46 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
if (CrestronEnvironment.DevicePlatform != eDevicePlatform.Server) // Handles 3-series running Windows CE OS
|
if (CrestronEnvironment.DevicePlatform != eDevicePlatform.Server) // Handles 3-series running Windows CE OS
|
||||||
{
|
{
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Starting Essentials v{0} on 3-series Appliance", Global.AssemblyVersion);
|
string userFolder;
|
||||||
|
string nvramFolder;
|
||||||
|
bool is4series = false;
|
||||||
|
|
||||||
|
if (eCrestronSeries.Series4 == (Global.ProcessorSeries & eCrestronSeries.Series4)) // Handle 4-series
|
||||||
|
{
|
||||||
|
is4series = true;
|
||||||
|
// Set path to user/
|
||||||
|
userFolder = "user";
|
||||||
|
nvramFolder = "nvram";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
userFolder = "User";
|
||||||
|
nvramFolder = "Nvram";
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Starting Essentials v{0} on {1} Appliance", Global.AssemblyVersion, is4series ? "4-series" : "3-series");
|
||||||
|
|
||||||
// Check if User/ProgramX exists
|
// Check if User/ProgramX exists
|
||||||
if (Directory.Exists(Global.ApplicationDirectoryPathPrefix + dirSeparator + "User"
|
if (Directory.Exists(Global.ApplicationDirectoryPathPrefix + dirSeparator + userFolder
|
||||||
+ dirSeparator + string.Format("program{0}", InitialParametersClass.ApplicationNumber)))
|
+ dirSeparator + string.Format("program{0}", InitialParametersClass.ApplicationNumber)))
|
||||||
{
|
{
|
||||||
Debug.Console(0, @"User/program{0} directory found", InitialParametersClass.ApplicationNumber);
|
Debug.Console(0, @"{0}/program{1} directory found", userFolder, InitialParametersClass.ApplicationNumber);
|
||||||
filePathPrefix = directoryPrefix + dirSeparator + "User"
|
filePathPrefix = directoryPrefix + dirSeparator + userFolder
|
||||||
+ dirSeparator + string.Format("program{0}", InitialParametersClass.ApplicationNumber) + dirSeparator;
|
+ dirSeparator + string.Format("program{0}", InitialParametersClass.ApplicationNumber) + dirSeparator;
|
||||||
}
|
}
|
||||||
// Check if Nvram/Programx exists
|
// Check if Nvram/Programx exists
|
||||||
else if (Directory.Exists(directoryPrefix + dirSeparator + "Nvram"
|
else if (Directory.Exists(directoryPrefix + dirSeparator + nvramFolder
|
||||||
+ dirSeparator + string.Format("program{0}", InitialParametersClass.ApplicationNumber)))
|
+ dirSeparator + string.Format("program{0}", InitialParametersClass.ApplicationNumber)))
|
||||||
{
|
{
|
||||||
Debug.Console(0, @"Nvram/program{0} directory found", InitialParametersClass.ApplicationNumber);
|
Debug.Console(0, @"{0}/program{1} directory found", nvramFolder, InitialParametersClass.ApplicationNumber);
|
||||||
filePathPrefix = directoryPrefix + dirSeparator + "Nvram"
|
filePathPrefix = directoryPrefix + dirSeparator + nvramFolder
|
||||||
+ dirSeparator + string.Format("program{0}", InitialParametersClass.ApplicationNumber) + dirSeparator;
|
+ dirSeparator + string.Format("program{0}", InitialParametersClass.ApplicationNumber) + dirSeparator;
|
||||||
}
|
}
|
||||||
// If neither exists, set path to User/ProgramX
|
// If neither exists, set path to User/ProgramX
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Debug.Console(0, @"No previous directory found. Using User/program{0}", InitialParametersClass.ApplicationNumber);
|
Debug.Console(0, @"No previous directory found. Using {0}/program{1}", userFolder, InitialParametersClass.ApplicationNumber);
|
||||||
filePathPrefix = directoryPrefix + dirSeparator + "User"
|
filePathPrefix = directoryPrefix + dirSeparator + userFolder
|
||||||
+ dirSeparator + string.Format("program{0}", InitialParametersClass.ApplicationNumber) + dirSeparator;
|
+ dirSeparator + string.Format("program{0}", InitialParametersClass.ApplicationNumber) + dirSeparator;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -287,33 +308,14 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
DeviceManager.ActivateAll();
|
DeviceManager.ActivateAll();
|
||||||
|
|
||||||
var mobileControl = DeviceManager.GetDeviceForKey("appServer") as IMobileControl;
|
var mobileControl = GetMobileControlDevice();
|
||||||
|
|
||||||
if (mobileControl == null) return;
|
if (mobileControl == null) return;
|
||||||
|
|
||||||
mobileControl.LinkSystemMonitorToAppServer();
|
mobileControl.LinkSystemMonitorToAppServer();
|
||||||
//LinkSystemMonitorToAppServer();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//void LinkSystemMonitorToAppServer()
|
|
||||||
//{
|
|
||||||
// var sysMon = DeviceManager.GetDeviceForKey("systemMonitor") as PepperDash.Essentials.Core.Monitoring.SystemMonitorController;
|
|
||||||
|
|
||||||
// var appServer = DeviceManager.GetDeviceForKey("appServer") as MobileControlSystemController;
|
|
||||||
|
|
||||||
|
|
||||||
// if (sysMon != null && appServer != null)
|
|
||||||
// {
|
|
||||||
// var key = sysMon.Key + "-" + appServer.Key;
|
|
||||||
// var messenger = new PepperDash.Essentials.AppServer.Messengers.SystemMonitorMessenger
|
|
||||||
// (key, sysMon, "/device/systemMonitor");
|
|
||||||
|
|
||||||
// messenger.RegisterWithAppServer(appServer);
|
|
||||||
|
|
||||||
// DeviceManager.AddDevice(messenger);
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Reads all devices from config and adds them to DeviceManager
|
/// Reads all devices from config and adds them to DeviceManager
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -324,7 +326,11 @@ namespace PepperDash.Essentials
|
|||||||
DeviceManager.AddDevice(new PepperDash.Essentials.Core.Devices.CrestronProcessor("processor"));
|
DeviceManager.AddDevice(new PepperDash.Essentials.Core.Devices.CrestronProcessor("processor"));
|
||||||
|
|
||||||
// Add global System Monitor device
|
// Add global System Monitor device
|
||||||
DeviceManager.AddDevice(new PepperDash.Essentials.Core.Monitoring.SystemMonitorController("systemMonitor"));
|
if (CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance)
|
||||||
|
{
|
||||||
|
DeviceManager.AddDevice(
|
||||||
|
new PepperDash.Essentials.Core.Monitoring.SystemMonitorController("systemMonitor"));
|
||||||
|
}
|
||||||
|
|
||||||
foreach (var devConf in ConfigReader.ConfigObject.Devices)
|
foreach (var devConf in ConfigReader.ConfigObject.Devices)
|
||||||
{
|
{
|
||||||
@@ -335,7 +341,12 @@ namespace PepperDash.Essentials
|
|||||||
// Skip this to prevent unnecessary warnings
|
// Skip this to prevent unnecessary warnings
|
||||||
if (devConf.Key == "processor")
|
if (devConf.Key == "processor")
|
||||||
{
|
{
|
||||||
if (devConf.Type.ToLower() != Global.ControlSystem.ControllerPrompt.ToLower())
|
var prompt = Global.ControlSystem.ControllerPrompt;
|
||||||
|
|
||||||
|
var typeMatch = String.Equals(devConf.Type, prompt, StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
String.Equals(devConf.Type, prompt.Replace("-", ""), StringComparison.OrdinalIgnoreCase);
|
||||||
|
|
||||||
|
if (!typeMatch)
|
||||||
Debug.Console(0,
|
Debug.Console(0,
|
||||||
"WARNING: Config file defines processor type as '{0}' but actual processor is '{1}'! Some ports may not be available",
|
"WARNING: Config file defines processor type as '{0}' but actual processor is '{1}'! Some ports may not be available",
|
||||||
devConf.Type.ToUpper(), Global.ControlSystem.ControllerPrompt.ToUpper());
|
devConf.Type.ToUpper(), Global.ControlSystem.ControllerPrompt.ToUpper());
|
||||||
@@ -387,19 +398,14 @@ namespace PepperDash.Essentials
|
|||||||
if (newDev == null)
|
if (newDev == null)
|
||||||
newDev = PepperDash.Essentials.Core.DeviceFactory.GetDevice(devConf);
|
newDev = PepperDash.Essentials.Core.DeviceFactory.GetDevice(devConf);
|
||||||
|
|
||||||
//
|
|
||||||
//if (newDev == null)
|
|
||||||
// newDev = PepperDash.Essentials.Devices.Displays.DisplayDeviceFactory.GetDevice(devConf);
|
|
||||||
//
|
|
||||||
|
|
||||||
if (newDev != null)
|
if (newDev != null)
|
||||||
DeviceManager.AddDevice(newDev);
|
DeviceManager.AddDevice(newDev);
|
||||||
else
|
else
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "ERROR: Cannot load unknown device type '{0}', key '{1}'.", devConf.Type, devConf.Key);
|
Debug.Console(0, Debug.ErrorLogLevel.Error, "ERROR: Cannot load unknown device type '{0}', key '{1}'.", devConf.Type, devConf.Key);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "ERROR: Creating device {0}. Skipping device. \r{1}", devConf.Key, e);
|
Debug.Console(0, Debug.ErrorLogLevel.Error, "ERROR: Creating device {0}. Skipping device. \r{1}", devConf.Key, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "All Devices Loaded.");
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "All Devices Loaded.");
|
||||||
@@ -440,43 +446,66 @@ namespace PepperDash.Essentials
|
|||||||
{
|
{
|
||||||
if (ConfigReader.ConfigObject.Rooms == null)
|
if (ConfigReader.ConfigObject.Rooms == null)
|
||||||
{
|
{
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Warning, "WARNING: Configuration contains no rooms");
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Notice: Configuration contains no rooms - Is this intentional? This may be a valid configuration.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var roomConfig in ConfigReader.ConfigObject.Rooms)
|
foreach (var roomConfig in ConfigReader.ConfigObject.Rooms)
|
||||||
{
|
{
|
||||||
var room = EssentialsRoomConfigHelper.GetRoomObject(roomConfig) as EssentialsRoomBase;
|
var room = EssentialsRoomConfigHelper.GetRoomObject(roomConfig) as IEssentialsRoom;
|
||||||
if (room != null)
|
if (room != null)
|
||||||
{
|
{
|
||||||
if (room is EssentialsHuddleSpaceRoom)
|
// default IPID
|
||||||
|
uint fusionIpId = 0xf1;
|
||||||
|
|
||||||
|
// default to no join map key
|
||||||
|
string fusionJoinMapKey = string.Empty;
|
||||||
|
|
||||||
|
if (room.Config.Properties["fusion"] != null)
|
||||||
|
{
|
||||||
|
Debug.Console(2, "Custom Fusion config found. Using custom values");
|
||||||
|
|
||||||
|
var fusionConfig = room.Config.Properties["fusion"].ToObject<EssentialsRoomFusionConfig>();
|
||||||
|
|
||||||
|
if (fusionConfig != null)
|
||||||
|
{
|
||||||
|
fusionIpId = fusionConfig.IpIdInt;
|
||||||
|
fusionJoinMapKey = fusionConfig.JoinMapKey;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (room is IEssentialsHuddleSpaceRoom)
|
||||||
{
|
{
|
||||||
DeviceManager.AddDevice(room);
|
DeviceManager.AddDevice(room);
|
||||||
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Room is EssentialsHuddleSpaceRoom, attempting to add to DeviceManager with Fusion");
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Room is EssentialsHuddleSpaceRoom, attempting to add to DeviceManager with Fusion");
|
||||||
DeviceManager.AddDevice(new Core.Fusion.EssentialsHuddleSpaceFusionSystemControllerBase((EssentialsHuddleSpaceRoom)room, 0xf1));
|
DeviceManager.AddDevice(new Core.Fusion.EssentialsHuddleSpaceFusionSystemControllerBase(room, fusionIpId, fusionJoinMapKey));
|
||||||
|
|
||||||
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Attempting to build Mobile Control Bridge...");
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Attempting to build Mobile Control Bridge...");
|
||||||
// Mobile Control bridge
|
|
||||||
//var bridge = new MobileConrolEssentialsHuddleSpaceRoomBridge(room as EssentialsHuddleSpaceRoom);
|
|
||||||
//AddBridgePostActivationHelper(bridge); // Lets things happen later when all devices are present
|
|
||||||
//DeviceManager.AddDevice(bridge);
|
|
||||||
|
|
||||||
CreateMobileControlBridge(room);
|
CreateMobileControlBridge(room);
|
||||||
}
|
}
|
||||||
else if (room is EssentialsHuddleVtc1Room)
|
else if (room is IEssentialsHuddleVtc1Room)
|
||||||
{
|
{
|
||||||
DeviceManager.AddDevice(room);
|
DeviceManager.AddDevice(room);
|
||||||
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Room is EssentialsHuddleVtc1Room, attempting to add to DeviceManager with Fusion");
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Room is EssentialsHuddleVtc1Room, attempting to add to DeviceManager with Fusion");
|
||||||
DeviceManager.AddDevice(new EssentialsHuddleVtc1FusionController((EssentialsHuddleVtc1Room)room, 0xf1));
|
DeviceManager.AddDevice(new EssentialsHuddleVtc1FusionController((IEssentialsHuddleVtc1Room)room, fusionIpId, fusionJoinMapKey));
|
||||||
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Attempting to build Mobile Control Bridge...");
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Attempting to build Mobile Control Bridge...");
|
||||||
// Mobile Control bridge
|
|
||||||
//var bridge = new MobileConrolEssentialsHuddleSpaceRoomBridge(room);
|
CreateMobileControlBridge(room);
|
||||||
//AddBridgePostActivationHelper(bridge); // Lets things happen later when all devices are present
|
}
|
||||||
//DeviceManager.AddDevice(bridge);
|
else if (room is EssentialsTechRoom)
|
||||||
|
{
|
||||||
|
DeviceManager.AddDevice(room);
|
||||||
|
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Notice,
|
||||||
|
"Room is EssentialsTechRoom, Attempting to add to DeviceManager with Fusion");
|
||||||
|
DeviceManager.AddDevice(new EssentialsTechRoomFusionSystemController((EssentialsTechRoom)room, fusionIpId, fusionJoinMapKey));
|
||||||
|
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Attempting to build Mobile Control Bridge");
|
||||||
|
|
||||||
CreateMobileControlBridge(room);
|
CreateMobileControlBridge(room);
|
||||||
}
|
}
|
||||||
@@ -488,49 +517,73 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "WARNING: Cannot create room from config, key '{0}'", roomConfig.Key);
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Notice: Cannot create room from config, key '{0}' - Is this intentional? This may be a valid configuration.", roomConfig.Key);
|
||||||
}
|
}
|
||||||
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "All Rooms Loaded.");
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "All Rooms Loaded.");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void CreateMobileControlBridge(EssentialsRoomBase room)
|
private static void CreateMobileControlBridge(object room)
|
||||||
{
|
{
|
||||||
var mobileControl = DeviceManager.GetDeviceForKey("appServer") as IMobileControl;
|
var mobileControl = GetMobileControlDevice();
|
||||||
|
|
||||||
if (mobileControl == null) return;
|
if (mobileControl == null) return;
|
||||||
|
|
||||||
mobileControl.CreateMobileControlRoomBridge(room);
|
var mobileControl3 = mobileControl as IMobileControl3;
|
||||||
|
|
||||||
|
if (mobileControl3 != null)
|
||||||
|
{
|
||||||
|
mobileControl3.CreateMobileControlRoomBridge(room as IEssentialsRoom, mobileControl);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mobileControl.CreateMobileControlRoomBridge(room as EssentialsRoomBase, mobileControl);
|
||||||
|
}
|
||||||
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Mobile Control Bridge Added...");
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Mobile Control Bridge Added...");
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
private static IMobileControl GetMobileControlDevice()
|
||||||
/// Helps add the post activation steps that link bridges to main controller
|
{
|
||||||
/// </summary>
|
var mobileControlList = DeviceManager.AllDevices.OfType<IMobileControl>().ToList();
|
||||||
/// <param name="bridge"></param>
|
|
||||||
//void AddBridgePostActivationHelper(MobileControlBridgeBase bridge)
|
if (mobileControlList.Count > 1)
|
||||||
//{
|
{
|
||||||
// bridge.AddPostActivationAction(() =>
|
Debug.Console(0, Debug.ErrorLogLevel.Warning,
|
||||||
// {
|
"Multiple instances of Mobile Control Server found.");
|
||||||
// var parent = DeviceManager.AllDevices.FirstOrDefault(d => d.Key == "appServer") as MobileControlSystemController;
|
|
||||||
// if (parent == null)
|
return null;
|
||||||
// {
|
}
|
||||||
// Debug.Console(0, bridge, "ERROR: Cannot connect app server room bridge. System controller not present");
|
|
||||||
// return;
|
if (mobileControlList.Count > 0)
|
||||||
// }
|
{
|
||||||
// Debug.Console(0, bridge, "Linking to parent controller");
|
return mobileControlList[0];
|
||||||
// bridge.AddParent(parent);
|
}
|
||||||
// parent.AddBridge(bridge);
|
|
||||||
// });
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Mobile Control not enabled for this system");
|
||||||
//}
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Fires up a logo server if not already running
|
/// Fires up a logo server if not already running
|
||||||
/// </summary>
|
/// </summary>
|
||||||
void LoadLogoServer()
|
void LoadLogoServer()
|
||||||
{
|
{
|
||||||
|
if (ConfigReader.ConfigObject.Rooms == null)
|
||||||
|
{
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "No rooms configured. Bypassing Logo server startup.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
!ConfigReader.ConfigObject.Rooms.Any(
|
||||||
|
CheckRoomConfig))
|
||||||
|
{
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "No rooms configured to use system Logo server. Bypassing Logo server startup");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
LogoServer = new HttpLogoServer(8080, Global.DirectorySeparator + "html" + Global.DirectorySeparator + "logo");
|
LogoServer = new HttpLogoServer(8080, Global.DirectorySeparator + "html" + Global.DirectorySeparator + "logo");
|
||||||
@@ -540,5 +593,38 @@ namespace PepperDash.Essentials
|
|||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "NOTICE: Logo server cannot be started. Likely already running in another program");
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "NOTICE: Logo server cannot be started. Likely already running in another program");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private bool CheckRoomConfig(DeviceConfig c)
|
||||||
|
{
|
||||||
|
string logoDark = null;
|
||||||
|
string logoLight = null;
|
||||||
|
string logo = null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (c.Properties["logoDark"] != null)
|
||||||
|
{
|
||||||
|
logoDark = c.Properties["logoDark"].Value<string>("type");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c.Properties["logoLight"] != null)
|
||||||
|
{
|
||||||
|
logoLight = c.Properties["logoLight"].Value<string>("type");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c.Properties["logo"] != null)
|
||||||
|
{
|
||||||
|
logo = c.Properties["logo"].Value<string>("type");
|
||||||
|
}
|
||||||
|
|
||||||
|
return ((logoDark != null && logoDark == "system") ||
|
||||||
|
(logoLight != null && logoLight == "system") || (logo != null && logo == "system"));
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
Debug.Console(1, Debug.ErrorLogLevel.Notice, "Unable to find logo information in any room config");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -88,7 +88,7 @@
|
|||||||
{
|
{
|
||||||
"name": "Wireless Video",
|
"name": "Wireless Video",
|
||||||
"key": "wePresent-1",
|
"key": "wePresent-1",
|
||||||
"type": "wePresent",
|
"type": "genericSource",
|
||||||
"group": "genericSource",
|
"group": "genericSource",
|
||||||
"uid": 9,
|
"uid": 9,
|
||||||
"properties": {
|
"properties": {
|
||||||
|
|||||||
@@ -114,7 +114,7 @@
|
|||||||
{
|
{
|
||||||
"name": "Wireless Video",
|
"name": "Wireless Video",
|
||||||
"key": "wePresent-1",
|
"key": "wePresent-1",
|
||||||
"type": "wePresent",
|
"type": "genericSource",
|
||||||
"properties": {},
|
"properties": {},
|
||||||
"group": "genericSource",
|
"group": "genericSource",
|
||||||
"uid": 3
|
"uid": 3
|
||||||
|
|||||||
@@ -225,6 +225,14 @@
|
|||||||
"2": "Output 2",
|
"2": "Output 2",
|
||||||
"3": "Output 3",
|
"3": "Output 3",
|
||||||
"4": "Output 4"
|
"4": "Output 4"
|
||||||
|
},
|
||||||
|
"inputSlotSupportsHdcp2":{
|
||||||
|
"1": "false",
|
||||||
|
"2": "false",
|
||||||
|
"3": "false",
|
||||||
|
"4": "false",
|
||||||
|
"5": "false",
|
||||||
|
"6": "false"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2,340 +2,357 @@
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
using Crestron.SimplSharpPro;
|
using Crestron.SimplSharpPro;
|
||||||
using Crestron.SimplSharpPro.Fusion;
|
using Crestron.SimplSharpPro.Fusion;
|
||||||
|
|
||||||
|
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
using PepperDash.Essentials.Core.Fusion;
|
using PepperDash.Essentials.Core.Fusion;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Fusion
|
namespace PepperDash.Essentials.Fusion
|
||||||
{
|
{
|
||||||
public class EssentialsHuddleVtc1FusionController : EssentialsHuddleSpaceFusionSystemControllerBase
|
public class EssentialsHuddleVtc1FusionController : EssentialsHuddleSpaceFusionSystemControllerBase
|
||||||
{
|
{
|
||||||
BooleanSigData CodecIsInCall;
|
BooleanSigData CodecIsInCall;
|
||||||
|
|
||||||
public EssentialsHuddleVtc1FusionController(EssentialsHuddleVtc1Room room, uint ipId)
|
public EssentialsHuddleVtc1FusionController(IEssentialsHuddleVtc1Room room, uint ipId, string joinMapKey)
|
||||||
: base(room, ipId)
|
: base(room, ipId, joinMapKey)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Called in base class constructor before RVI and GUID files are built
|
/// Called in base class constructor before RVI and GUID files are built
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected override void ExecuteCustomSteps()
|
protected override void ExecuteCustomSteps()
|
||||||
{
|
{
|
||||||
SetUpCodec();
|
SetUpCodec();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a static asset for the codec and maps the joins to the main room symbol
|
/// Creates a static asset for the codec and maps the joins to the main room symbol
|
||||||
/// </summary>
|
/// </summary>
|
||||||
void SetUpCodec()
|
void SetUpCodec()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var codec = (Room as EssentialsHuddleVtc1Room).VideoCodec;
|
var codec = (Room as IEssentialsHuddleVtc1Room).VideoCodec;
|
||||||
|
|
||||||
if (codec == null)
|
if (codec == null)
|
||||||
{
|
{
|
||||||
Debug.Console(1, this, "Cannot link codec to Fusion because codec is null");
|
Debug.Console(1, this, "Cannot link codec to Fusion because codec is null");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
codec.UsageTracker = new UsageTracking(codec);
|
codec.UsageTracker = new UsageTracking(codec);
|
||||||
codec.UsageTracker.UsageIsTracked = true;
|
codec.UsageTracker.UsageIsTracked = true;
|
||||||
codec.UsageTracker.DeviceUsageEnded += UsageTracker_DeviceUsageEnded;
|
codec.UsageTracker.DeviceUsageEnded += UsageTracker_DeviceUsageEnded;
|
||||||
|
|
||||||
var codecPowerOnAction = new Action<bool>(b => { if (!b) codec.StandbyDeactivate(); });
|
var codecPowerOnAction = new Action<bool>(b => { if (!b) codec.StandbyDeactivate(); });
|
||||||
var codecPowerOffAction = new Action<bool>(b => { if (!b) codec.StandbyActivate(); });
|
var codecPowerOffAction = new Action<bool>(b => { if (!b) codec.StandbyActivate(); });
|
||||||
|
|
||||||
// Map FusionRoom Attributes:
|
// Map FusionRoom Attributes:
|
||||||
|
|
||||||
// Codec volume
|
// Codec volume
|
||||||
var codecVolume = FusionRoom.CreateOffsetUshortSig(50, "Volume - Fader01", eSigIoMask.InputOutputSig);
|
var codecVolume = FusionRoom.CreateOffsetUshortSig(JoinMap.VolumeFader1.JoinNumber, JoinMap.VolumeFader1.AttributeName, eSigIoMask.InputOutputSig);
|
||||||
codecVolume.OutputSig.UserObject = new Action<ushort>(b => (codec as IBasicVolumeWithFeedback).SetVolume(b));
|
codecVolume.OutputSig.UserObject = new Action<ushort>(b => (codec as IBasicVolumeWithFeedback).SetVolume(b));
|
||||||
(codec as IBasicVolumeWithFeedback).VolumeLevelFeedback.LinkInputSig(codecVolume.InputSig);
|
(codec as IBasicVolumeWithFeedback).VolumeLevelFeedback.LinkInputSig(codecVolume.InputSig);
|
||||||
|
|
||||||
// In Call Status
|
// In Call Status
|
||||||
CodecIsInCall = FusionRoom.CreateOffsetBoolSig(69, "Conf - VC 1 In Call", eSigIoMask.InputSigOnly);
|
CodecIsInCall = FusionRoom.CreateOffsetBoolSig(JoinMap.VcCodecInCall.JoinNumber, JoinMap.VcCodecInCall.AttributeName, eSigIoMask.InputSigOnly);
|
||||||
codec.CallStatusChange += new EventHandler<PepperDash.Essentials.Devices.Common.Codec.CodecCallStatusItemChangeEventArgs>(codec_CallStatusChange);
|
codec.CallStatusChange += new EventHandler<PepperDash.Essentials.Devices.Common.Codec.CodecCallStatusItemChangeEventArgs>(codec_CallStatusChange);
|
||||||
|
|
||||||
// Online status
|
// Online status
|
||||||
if (codec is ICommunicationMonitor)
|
if (codec is ICommunicationMonitor)
|
||||||
{
|
{
|
||||||
var c = codec as ICommunicationMonitor;
|
var c = codec as ICommunicationMonitor;
|
||||||
var codecOnline = FusionRoom.CreateOffsetBoolSig(122, "Online - VC 1", eSigIoMask.InputSigOnly);
|
var codecOnline = FusionRoom.CreateOffsetBoolSig(JoinMap.VcCodecOnline.JoinNumber, JoinMap.VcCodecOnline.AttributeName, eSigIoMask.InputSigOnly);
|
||||||
codecOnline.InputSig.BoolValue = c.CommunicationMonitor.Status == MonitorStatus.IsOk;
|
codecOnline.InputSig.BoolValue = c.CommunicationMonitor.Status == MonitorStatus.IsOk;
|
||||||
c.CommunicationMonitor.StatusChange += (o, a) =>
|
c.CommunicationMonitor.StatusChange += (o, a) =>
|
||||||
{
|
{
|
||||||
codecOnline.InputSig.BoolValue = a.Status == MonitorStatus.IsOk;
|
codecOnline.InputSig.BoolValue = a.Status == MonitorStatus.IsOk;
|
||||||
};
|
};
|
||||||
Debug.Console(0, this, "Linking '{0}' communication monitor to Fusion '{1}'", codec.Key, "Online - VC 1");
|
Debug.Console(0, this, "Linking '{0}' communication monitor to Fusion '{1}'", codec.Key, JoinMap.VcCodecOnline.AttributeName);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Codec IP Address
|
// Codec IP Address
|
||||||
bool codecHasIpInfo = false;
|
bool codecHasIpInfo = false;
|
||||||
var codecComm = codec.Communication;
|
var codecComm = codec.Communication;
|
||||||
|
|
||||||
string codecIpAddress = string.Empty;
|
string codecIpAddress = string.Empty;
|
||||||
int codecIpPort = 0;
|
int codecIpPort = 0;
|
||||||
|
|
||||||
StringSigData codecIpAddressSig;
|
StringSigData codecIpAddressSig;
|
||||||
StringSigData codecIpPortSig;
|
StringSigData codecIpPortSig;
|
||||||
|
|
||||||
if(codecComm is GenericSshClient)
|
if(codecComm is GenericSshClient)
|
||||||
{
|
{
|
||||||
codecIpAddress = (codecComm as GenericSshClient).Hostname;
|
codecIpAddress = (codecComm as GenericSshClient).Hostname;
|
||||||
codecIpPort = (codecComm as GenericSshClient).Port;
|
codecIpPort = (codecComm as GenericSshClient).Port;
|
||||||
codecHasIpInfo = true;
|
codecHasIpInfo = true;
|
||||||
}
|
}
|
||||||
else if (codecComm is GenericTcpIpClient)
|
else if (codecComm is GenericTcpIpClient)
|
||||||
{
|
{
|
||||||
codecIpAddress = (codecComm as GenericTcpIpClient).Hostname;
|
codecIpAddress = (codecComm as GenericTcpIpClient).Hostname;
|
||||||
codecIpPort = (codecComm as GenericTcpIpClient).Port;
|
codecIpPort = (codecComm as GenericTcpIpClient).Port;
|
||||||
codecHasIpInfo = true;
|
codecHasIpInfo = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (codecHasIpInfo)
|
if (codecHasIpInfo)
|
||||||
{
|
{
|
||||||
codecIpAddressSig = FusionRoom.CreateOffsetStringSig(121, "IP Address - VC", eSigIoMask.InputSigOnly);
|
codecIpAddressSig = FusionRoom.CreateOffsetStringSig(JoinMap.VcCodecIpAddress.JoinNumber, JoinMap.VcCodecIpAddress.AttributeName, eSigIoMask.InputSigOnly);
|
||||||
codecIpAddressSig.InputSig.StringValue = codecIpAddress;
|
codecIpAddressSig.InputSig.StringValue = codecIpAddress;
|
||||||
|
|
||||||
codecIpPortSig = FusionRoom.CreateOffsetStringSig(150, "IP Port - VC", eSigIoMask.InputSigOnly);
|
codecIpPortSig = FusionRoom.CreateOffsetStringSig(JoinMap.VcCodecIpPort.JoinNumber, JoinMap.VcCodecIpPort.AttributeName, eSigIoMask.InputSigOnly);
|
||||||
codecIpPortSig.InputSig.StringValue = codecIpPort.ToString();
|
codecIpPortSig.InputSig.StringValue = codecIpPort.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
var tempAsset = new FusionAsset();
|
var tempAsset = new FusionAsset();
|
||||||
|
|
||||||
var deviceConfig = ConfigReader.ConfigObject.Devices.FirstOrDefault(c => c.Key.Equals(codec.Key));
|
var deviceConfig = ConfigReader.ConfigObject.Devices.FirstOrDefault(c => c.Key.Equals(codec.Key));
|
||||||
|
|
||||||
if (FusionStaticAssets.ContainsKey(deviceConfig.Uid))
|
if (FusionStaticAssets.ContainsKey(deviceConfig.Uid))
|
||||||
{
|
{
|
||||||
tempAsset = FusionStaticAssets[deviceConfig.Uid];
|
tempAsset = FusionStaticAssets[deviceConfig.Uid];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Create a new asset
|
// Create a new asset
|
||||||
tempAsset = new FusionAsset(FusionRoomGuids.GetNextAvailableAssetNumber(FusionRoom), codec.Name, "Codec", "");
|
tempAsset = new FusionAsset(FusionRoomGuids.GetNextAvailableAssetNumber(FusionRoom), codec.Name, "Codec", "");
|
||||||
FusionStaticAssets.Add(deviceConfig.Uid, tempAsset);
|
FusionStaticAssets.Add(deviceConfig.Uid, tempAsset);
|
||||||
}
|
}
|
||||||
|
|
||||||
var codecAsset = FusionRoom.CreateStaticAsset(tempAsset.SlotNumber, tempAsset.Name, "Display", tempAsset.InstanceId);
|
var codecAsset = FusionRoom.CreateStaticAsset(tempAsset.SlotNumber, tempAsset.Name, "Codec", tempAsset.InstanceId);
|
||||||
codecAsset.PowerOn.OutputSig.UserObject = codecPowerOnAction;
|
codecAsset.PowerOn.OutputSig.UserObject = codecPowerOnAction;
|
||||||
codecAsset.PowerOff.OutputSig.UserObject = codecPowerOffAction;
|
codecAsset.PowerOff.OutputSig.UserObject = codecPowerOffAction;
|
||||||
codec.StandbyIsOnFeedback.LinkComplementInputSig(codecAsset.PowerOn.InputSig);
|
codec.StandbyIsOnFeedback.LinkComplementInputSig(codecAsset.PowerOn.InputSig);
|
||||||
|
|
||||||
// TODO: Map relevant attributes on asset symbol
|
// TODO: Map relevant attributes on asset symbol
|
||||||
|
|
||||||
codecAsset.TrySetMakeModel(codec);
|
codecAsset.TrySetMakeModel(codec);
|
||||||
codecAsset.TryLinkAssetErrorToCommunication(codec);
|
codecAsset.TryLinkAssetErrorToCommunication(codec);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
Debug.Console(1, this, "Error setting up codec in Fusion: {0}", e);
|
Debug.Console(1, this, "Error setting up codec in Fusion: {0}", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void codec_CallStatusChange(object sender, PepperDash.Essentials.Devices.Common.Codec.CodecCallStatusItemChangeEventArgs e)
|
void codec_CallStatusChange(object sender, PepperDash.Essentials.Devices.Common.Codec.CodecCallStatusItemChangeEventArgs e)
|
||||||
{
|
{
|
||||||
var codec = (Room as EssentialsHuddleVtc1Room).VideoCodec;
|
var codec = (Room as IEssentialsHuddleVtc1Room).VideoCodec;
|
||||||
|
|
||||||
CodecIsInCall.InputSig.BoolValue = codec.IsInCall;
|
CodecIsInCall.InputSig.BoolValue = codec.IsInCall;
|
||||||
}
|
}
|
||||||
|
|
||||||
// These methods are overridden because they access the room class which is of a different type
|
// These methods are overridden because they access the room class which is of a different type
|
||||||
|
|
||||||
protected override void CreateSymbolAndBasicSigs(uint ipId)
|
protected override void CreateSymbolAndBasicSigs(uint ipId)
|
||||||
{
|
{
|
||||||
Debug.Console(1, this, "Creating Fusion Room symbol with GUID: {0}", RoomGuid);
|
Debug.Console(1, this, "Creating Fusion Room symbol with GUID: {0}", RoomGuid);
|
||||||
|
|
||||||
FusionRoom = new FusionRoom(ipId, Global.ControlSystem, Room.Name, RoomGuid);
|
FusionRoom = new FusionRoom(ipId, Global.ControlSystem, Room.Name, RoomGuid);
|
||||||
FusionRoom.ExtenderRoomViewSchedulingDataReservedSigs.Use();
|
FusionRoom.ExtenderRoomViewSchedulingDataReservedSigs.Use();
|
||||||
FusionRoom.ExtenderFusionRoomDataReservedSigs.Use();
|
FusionRoom.ExtenderFusionRoomDataReservedSigs.Use();
|
||||||
|
|
||||||
FusionRoom.Register();
|
FusionRoom.Register();
|
||||||
|
|
||||||
FusionRoom.FusionStateChange += FusionRoom_FusionStateChange;
|
FusionRoom.FusionStateChange += FusionRoom_FusionStateChange;
|
||||||
|
|
||||||
FusionRoom.ExtenderRoomViewSchedulingDataReservedSigs.DeviceExtenderSigChange += FusionRoomSchedule_DeviceExtenderSigChange;
|
FusionRoom.ExtenderRoomViewSchedulingDataReservedSigs.DeviceExtenderSigChange += FusionRoomSchedule_DeviceExtenderSigChange;
|
||||||
FusionRoom.ExtenderFusionRoomDataReservedSigs.DeviceExtenderSigChange += ExtenderFusionRoomDataReservedSigs_DeviceExtenderSigChange;
|
FusionRoom.ExtenderFusionRoomDataReservedSigs.DeviceExtenderSigChange += ExtenderFusionRoomDataReservedSigs_DeviceExtenderSigChange;
|
||||||
FusionRoom.OnlineStatusChange += FusionRoom_OnlineStatusChange;
|
FusionRoom.OnlineStatusChange += FusionRoom_OnlineStatusChange;
|
||||||
|
|
||||||
CrestronConsole.AddNewConsoleCommand(RequestFullRoomSchedule, "FusReqRoomSchedule", "Requests schedule of the room for the next 24 hours", ConsoleAccessLevelEnum.AccessOperator);
|
CrestronConsole.AddNewConsoleCommand(RequestFullRoomSchedule, "FusReqRoomSchedule", "Requests schedule of the room for the next 24 hours", ConsoleAccessLevelEnum.AccessOperator);
|
||||||
CrestronConsole.AddNewConsoleCommand(ModifyMeetingEndTimeConsoleHelper, "FusReqRoomSchMod", "Ends or extends a meeting by the specified time", ConsoleAccessLevelEnum.AccessOperator);
|
CrestronConsole.AddNewConsoleCommand(ModifyMeetingEndTimeConsoleHelper, "FusReqRoomSchMod", "Ends or extends a meeting by the specified time", ConsoleAccessLevelEnum.AccessOperator);
|
||||||
CrestronConsole.AddNewConsoleCommand(CreateAsHocMeeting, "FusCreateMeeting", "Creates and Ad Hoc meeting for on hour or until the next meeting", ConsoleAccessLevelEnum.AccessOperator);
|
CrestronConsole.AddNewConsoleCommand(CreateAdHocMeeting, "FusCreateMeeting", "Creates and Ad Hoc meeting for on hour or until the next meeting", ConsoleAccessLevelEnum.AccessOperator);
|
||||||
|
|
||||||
// Room to fusion room
|
// Room to fusion room
|
||||||
Room.OnFeedback.LinkInputSig(FusionRoom.SystemPowerOn.InputSig);
|
Room.OnFeedback.LinkInputSig(FusionRoom.SystemPowerOn.InputSig);
|
||||||
|
|
||||||
// Moved to
|
// Moved to
|
||||||
CurrentRoomSourceNameSig = FusionRoom.CreateOffsetStringSig(84, "Display 1 - Current Source", eSigIoMask.InputSigOnly);
|
CurrentRoomSourceNameSig = FusionRoom.CreateOffsetStringSig(JoinMap.Display1CurrentSourceName.JoinNumber, JoinMap.Display1CurrentSourceName.AttributeName, eSigIoMask.InputSigOnly);
|
||||||
// Don't think we need to get current status of this as nothing should be alive yet.
|
// Don't think we need to get current status of this as nothing should be alive yet.
|
||||||
(Room as EssentialsHuddleVtc1Room).CurrentSourceChange += Room_CurrentSourceInfoChange;
|
(Room as IEssentialsHuddleVtc1Room).CurrentSourceChange += Room_CurrentSourceInfoChange;
|
||||||
|
|
||||||
|
|
||||||
FusionRoom.SystemPowerOn.OutputSig.SetSigFalseAction((Room as EssentialsHuddleVtc1Room).PowerOnToDefaultOrLastSource);
|
FusionRoom.SystemPowerOn.OutputSig.SetSigFalseAction((Room as IEssentialsHuddleVtc1Room).PowerOnToDefaultOrLastSource);
|
||||||
FusionRoom.SystemPowerOff.OutputSig.SetSigFalseAction(() => (Room as EssentialsHuddleVtc1Room).RunRouteAction("roomOff", Room.SourceListKey));
|
FusionRoom.SystemPowerOff.OutputSig.SetSigFalseAction(() => (Room as IEssentialsHuddleVtc1Room).RunRouteAction("roomOff", Room.SourceListKey));
|
||||||
// NO!! room.RoomIsOn.LinkComplementInputSig(FusionRoom.SystemPowerOff.InputSig);
|
|
||||||
|
|
||||||
|
CrestronEnvironment.EthernetEventHandler += CrestronEnvironment_EthernetEventHandler;
|
||||||
CrestronEnvironment.EthernetEventHandler += CrestronEnvironment_EthernetEventHandler;
|
}
|
||||||
}
|
|
||||||
|
protected override void SetUpSources()
|
||||||
protected override void SetUpSources()
|
{
|
||||||
{
|
// Sources
|
||||||
// Sources
|
var dict = ConfigReader.ConfigObject.GetSourceListForKey((Room as IEssentialsHuddleVtc1Room).SourceListKey);
|
||||||
var dict = ConfigReader.ConfigObject.GetSourceListForKey((Room as EssentialsHuddleVtc1Room).SourceListKey);
|
if (dict != null)
|
||||||
if (dict != null)
|
{
|
||||||
{
|
// NEW PROCESS:
|
||||||
// NEW PROCESS:
|
// Make these lists and insert the fusion attributes by iterating these
|
||||||
// Make these lists and insert the fusion attributes by iterating these
|
var setTopBoxes = dict.Where(d => d.Value.SourceDevice is ISetTopBoxControls);
|
||||||
var setTopBoxes = dict.Where(d => d.Value.SourceDevice is ISetTopBoxControls);
|
uint i = 1;
|
||||||
uint i = 1;
|
foreach (var kvp in setTopBoxes)
|
||||||
foreach (var kvp in setTopBoxes)
|
{
|
||||||
{
|
TryAddRouteActionSigs(JoinMap.Display1DiscPlayerSourceStart.AttributeName + " " + i, JoinMap.Display1DiscPlayerSourceStart.JoinNumber + i, kvp.Key, kvp.Value.SourceDevice);
|
||||||
TryAddRouteActionSigs("Display 1 - Source TV " + i, 188 + i, kvp.Key, kvp.Value.SourceDevice);
|
i++;
|
||||||
i++;
|
if (i > JoinMap.Display1SetTopBoxSourceStart.JoinSpan) // We only have five spots
|
||||||
if (i > 5) // We only have five spots
|
break;
|
||||||
break;
|
}
|
||||||
}
|
|
||||||
|
var discPlayers = dict.Where(d => d.Value.SourceDevice is IDiscPlayerControls);
|
||||||
var discPlayers = dict.Where(d => d.Value.SourceDevice is IDiscPlayerControls);
|
i = 1;
|
||||||
i = 1;
|
foreach (var kvp in discPlayers)
|
||||||
foreach (var kvp in discPlayers)
|
{
|
||||||
{
|
TryAddRouteActionSigs(JoinMap.Display1DiscPlayerSourceStart.AttributeName + " " + i, JoinMap.Display1DiscPlayerSourceStart.JoinNumber + i, kvp.Key, kvp.Value.SourceDevice);
|
||||||
TryAddRouteActionSigs("Display 1 - Source DVD " + i, 181 + i, kvp.Key, kvp.Value.SourceDevice);
|
i++;
|
||||||
i++;
|
if (i > 5) // We only have five spots
|
||||||
if (i > 5) // We only have five spots
|
break;
|
||||||
break;
|
}
|
||||||
}
|
|
||||||
|
var laptops = dict.Where(d => d.Value.SourceDevice is Core.Devices.Laptop);
|
||||||
var laptops = dict.Where(d => d.Value.SourceDevice is Core.Devices.Laptop);
|
i = 1;
|
||||||
i = 1;
|
foreach (var kvp in laptops)
|
||||||
foreach (var kvp in laptops)
|
{
|
||||||
{
|
TryAddRouteActionSigs(JoinMap.Display1LaptopSourceStart.AttributeName + " " + i, JoinMap.Display1LaptopSourceStart.JoinNumber + i, kvp.Key, kvp.Value.SourceDevice);
|
||||||
TryAddRouteActionSigs("Display 1 - Source Laptop " + i, 166 + i, kvp.Key, kvp.Value.SourceDevice);
|
i++;
|
||||||
i++;
|
if (i > JoinMap.Display1LaptopSourceStart.JoinSpan) // We only have ten spots???
|
||||||
if (i > 10) // We only have ten spots???
|
break;
|
||||||
break;
|
}
|
||||||
}
|
|
||||||
|
foreach (var kvp in dict)
|
||||||
foreach (var kvp in dict)
|
{
|
||||||
{
|
var usageDevice = kvp.Value.SourceDevice as IUsageTracking;
|
||||||
var usageDevice = kvp.Value.SourceDevice as IUsageTracking;
|
|
||||||
|
if (usageDevice != null)
|
||||||
if (usageDevice != null)
|
{
|
||||||
{
|
usageDevice.UsageTracker = new UsageTracking(usageDevice as Device);
|
||||||
usageDevice.UsageTracker = new UsageTracking(usageDevice as Device);
|
usageDevice.UsageTracker.UsageIsTracked = true;
|
||||||
usageDevice.UsageTracker.UsageIsTracked = true;
|
usageDevice.UsageTracker.DeviceUsageEnded += new EventHandler<DeviceUsageEventArgs>(UsageTracker_DeviceUsageEnded);
|
||||||
usageDevice.UsageTracker.DeviceUsageEnded += new EventHandler<DeviceUsageEventArgs>(UsageTracker_DeviceUsageEnded);
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
}
|
||||||
}
|
else
|
||||||
else
|
{
|
||||||
{
|
Debug.Console(1, this, "WARNING: Config source list '{0}' not found for room '{1}'",
|
||||||
Debug.Console(1, this, "WARNING: Config source list '{0}' not found for room '{1}'",
|
(Room as IEssentialsHuddleVtc1Room).SourceListKey, Room.Key);
|
||||||
(Room as EssentialsHuddleVtc1Room).SourceListKey, Room.Key);
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
protected override void SetUpDisplay()
|
||||||
protected override void SetUpDisplay()
|
{
|
||||||
{
|
try
|
||||||
try
|
{
|
||||||
{
|
//Setup Display Usage Monitoring
|
||||||
//Setup Display Usage Monitoring
|
|
||||||
|
var displays = DeviceManager.AllDevices.Where(d => d is DisplayBase);
|
||||||
var displays = DeviceManager.AllDevices.Where(d => d is DisplayBase);
|
|
||||||
|
// Consider updating this in multiple display systems
|
||||||
// Consider updating this in multiple display systems
|
|
||||||
|
foreach (DisplayBase display in displays)
|
||||||
foreach (DisplayBase display in displays)
|
{
|
||||||
{
|
display.UsageTracker = new UsageTracking(display);
|
||||||
display.UsageTracker = new UsageTracking(display);
|
display.UsageTracker.UsageIsTracked = true;
|
||||||
display.UsageTracker.UsageIsTracked = true;
|
display.UsageTracker.DeviceUsageEnded += new EventHandler<DeviceUsageEventArgs>(UsageTracker_DeviceUsageEnded);
|
||||||
display.UsageTracker.DeviceUsageEnded += new EventHandler<DeviceUsageEventArgs>(UsageTracker_DeviceUsageEnded);
|
}
|
||||||
}
|
|
||||||
|
var defaultDisplay = (Room as IEssentialsHuddleVtc1Room).DefaultDisplay as DisplayBase;
|
||||||
var defaultDisplay = (Room as EssentialsHuddleVtc1Room).DefaultDisplay as DisplayBase;
|
if (defaultDisplay == null)
|
||||||
if (defaultDisplay == null)
|
{
|
||||||
{
|
Debug.Console(1, this, "Cannot link null display to Fusion because default display is null");
|
||||||
Debug.Console(1, this, "Cannot link null display to Fusion because default display is null");
|
return;
|
||||||
return;
|
}
|
||||||
}
|
|
||||||
|
var dispPowerOnAction = new Action<bool>(b => { if (!b) defaultDisplay.PowerOn(); });
|
||||||
var dispPowerOnAction = new Action<bool>(b => { if (!b) defaultDisplay.PowerOn(); });
|
var dispPowerOffAction = new Action<bool>(b => { if (!b) defaultDisplay.PowerOff(); });
|
||||||
var dispPowerOffAction = new Action<bool>(b => { if (!b) defaultDisplay.PowerOff(); });
|
|
||||||
|
// Display to fusion room sigs
|
||||||
// Display to fusion room sigs
|
FusionRoom.DisplayPowerOn.OutputSig.UserObject = dispPowerOnAction;
|
||||||
FusionRoom.DisplayPowerOn.OutputSig.UserObject = dispPowerOnAction;
|
FusionRoom.DisplayPowerOff.OutputSig.UserObject = dispPowerOffAction;
|
||||||
FusionRoom.DisplayPowerOff.OutputSig.UserObject = dispPowerOffAction;
|
|
||||||
defaultDisplay.PowerIsOnFeedback.LinkInputSig(FusionRoom.DisplayPowerOn.InputSig);
|
var defaultDisplayTwoWay = defaultDisplay as IHasPowerControlWithFeedback;
|
||||||
if (defaultDisplay is IDisplayUsage)
|
if (defaultDisplayTwoWay != null)
|
||||||
(defaultDisplay as IDisplayUsage).LampHours.LinkInputSig(FusionRoom.DisplayUsage.InputSig);
|
{
|
||||||
|
defaultDisplayTwoWay.PowerIsOnFeedback.LinkInputSig(FusionRoom.DisplayPowerOn.InputSig);
|
||||||
|
}
|
||||||
|
|
||||||
MapDisplayToRoomJoins(1, 158, defaultDisplay);
|
if (defaultDisplay is IDisplayUsage)
|
||||||
|
(defaultDisplay as IDisplayUsage).LampHours.LinkInputSig(FusionRoom.DisplayUsage.InputSig);
|
||||||
|
|
||||||
var deviceConfig = ConfigReader.ConfigObject.Devices.FirstOrDefault(d => d.Key.Equals(defaultDisplay.Key));
|
MapDisplayToRoomJoins(1, JoinMap.Display1Start.JoinNumber, defaultDisplay);
|
||||||
|
|
||||||
//Check for existing asset in GUIDs collection
|
var deviceConfig = ConfigReader.ConfigObject.Devices.FirstOrDefault(d => d.Key.Equals(defaultDisplay.Key));
|
||||||
|
|
||||||
var tempAsset = new FusionAsset();
|
//Check for existing asset in GUIDs collection
|
||||||
|
|
||||||
if (FusionStaticAssets.ContainsKey(deviceConfig.Uid))
|
var tempAsset = new FusionAsset();
|
||||||
{
|
|
||||||
tempAsset = FusionStaticAssets[deviceConfig.Uid];
|
if (FusionStaticAssets.ContainsKey(deviceConfig.Uid))
|
||||||
}
|
{
|
||||||
else
|
tempAsset = FusionStaticAssets[deviceConfig.Uid];
|
||||||
{
|
}
|
||||||
// Create a new asset
|
else
|
||||||
tempAsset = new FusionAsset(FusionRoomGuids.GetNextAvailableAssetNumber(FusionRoom), defaultDisplay.Name, "Display", "");
|
{
|
||||||
FusionStaticAssets.Add(deviceConfig.Uid, tempAsset);
|
// Create a new asset
|
||||||
}
|
tempAsset = new FusionAsset(FusionRoomGuids.GetNextAvailableAssetNumber(FusionRoom), defaultDisplay.Name, "Display", "");
|
||||||
|
FusionStaticAssets.Add(deviceConfig.Uid, tempAsset);
|
||||||
var dispAsset = FusionRoom.CreateStaticAsset(tempAsset.SlotNumber, tempAsset.Name, "Display", tempAsset.InstanceId);
|
}
|
||||||
dispAsset.PowerOn.OutputSig.UserObject = dispPowerOnAction;
|
|
||||||
dispAsset.PowerOff.OutputSig.UserObject = dispPowerOffAction;
|
var dispAsset = FusionRoom.CreateStaticAsset(tempAsset.SlotNumber, tempAsset.Name, "Display", tempAsset.InstanceId);
|
||||||
defaultDisplay.PowerIsOnFeedback.LinkInputSig(dispAsset.PowerOn.InputSig);
|
dispAsset.PowerOn.OutputSig.UserObject = dispPowerOnAction;
|
||||||
// NO!! display.PowerIsOn.LinkComplementInputSig(dispAsset.PowerOff.InputSig);
|
dispAsset.PowerOff.OutputSig.UserObject = dispPowerOffAction;
|
||||||
// Use extension methods
|
|
||||||
dispAsset.TrySetMakeModel(defaultDisplay);
|
|
||||||
dispAsset.TryLinkAssetErrorToCommunication(defaultDisplay);
|
var defaultTwoWayDisplay = defaultDisplay as IHasPowerControlWithFeedback;
|
||||||
}
|
if (defaultTwoWayDisplay != null)
|
||||||
catch (Exception e)
|
{
|
||||||
{
|
defaultTwoWayDisplay.PowerIsOnFeedback.LinkInputSig(FusionRoom.DisplayPowerOn.InputSig);
|
||||||
Debug.Console(1, this, "Error setting up display in Fusion: {0}", e);
|
if (defaultDisplay is IDisplayUsage)
|
||||||
}
|
(defaultDisplay as IDisplayUsage).LampHours.LinkInputSig(FusionRoom.DisplayUsage.InputSig);
|
||||||
|
|
||||||
}
|
defaultTwoWayDisplay.PowerIsOnFeedback.LinkInputSig(dispAsset.PowerOn.InputSig);
|
||||||
|
}
|
||||||
protected override void MapDisplayToRoomJoins(int displayIndex, int joinOffset, DisplayBase display)
|
|
||||||
{
|
// Use extension methods
|
||||||
string displayName = string.Format("Display {0} - ", displayIndex);
|
dispAsset.TrySetMakeModel(defaultDisplay);
|
||||||
|
dispAsset.TryLinkAssetErrorToCommunication(defaultDisplay);
|
||||||
|
}
|
||||||
if (display == (Room as EssentialsHuddleVtc1Room).DefaultDisplay)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
// Power on
|
Debug.Console(1, this, "Error setting up display in Fusion: {0}", e);
|
||||||
var defaultDisplayPowerOn = FusionRoom.CreateOffsetBoolSig((uint)joinOffset, displayName + "Power On", eSigIoMask.InputOutputSig);
|
}
|
||||||
defaultDisplayPowerOn.OutputSig.UserObject = new Action<bool>(b => { if (!b) display.PowerOn(); });
|
|
||||||
display.PowerIsOnFeedback.LinkInputSig(defaultDisplayPowerOn.InputSig);
|
}
|
||||||
|
|
||||||
// Power Off
|
protected override void MapDisplayToRoomJoins(int displayIndex, uint joinOffset, DisplayBase display)
|
||||||
var defaultDisplayPowerOff = FusionRoom.CreateOffsetBoolSig((uint)joinOffset + 1, displayName + "Power Off", eSigIoMask.InputOutputSig);
|
{
|
||||||
defaultDisplayPowerOn.OutputSig.UserObject = new Action<bool>(b => { if (!b) display.PowerOff(); }); ;
|
string displayName = string.Format("Display {0} - ", displayIndex);
|
||||||
display.PowerIsOnFeedback.LinkInputSig(defaultDisplayPowerOn.InputSig);
|
|
||||||
|
|
||||||
// Current Source
|
if (display == (Room as IEssentialsHuddleVtc1Room).DefaultDisplay)
|
||||||
var defaultDisplaySourceNone = FusionRoom.CreateOffsetBoolSig((uint)joinOffset + 8, displayName + "Source None", eSigIoMask.InputOutputSig);
|
{
|
||||||
defaultDisplaySourceNone.OutputSig.UserObject = new Action<bool>(b => { if (!b) (Room as EssentialsHuddleVtc1Room).RunRouteAction("roomOff", Room.SourceListKey); }); ;
|
// Power on
|
||||||
}
|
var defaultDisplayPowerOn = FusionRoom.CreateOffsetBoolSig((uint)joinOffset, displayName + "Power On", eSigIoMask.InputOutputSig);
|
||||||
}
|
defaultDisplayPowerOn.OutputSig.UserObject = new Action<bool>(b => { if (!b) display.PowerOn(); });
|
||||||
}
|
|
||||||
|
// Power Off
|
||||||
|
var defaultDisplayPowerOff = FusionRoom.CreateOffsetBoolSig((uint)joinOffset + 1, displayName + "Power Off", eSigIoMask.InputOutputSig);
|
||||||
|
defaultDisplayPowerOn.OutputSig.UserObject = new Action<bool>(b => { if (!b) display.PowerOff(); }); ;
|
||||||
|
|
||||||
|
var displayTwoWay = display as IHasPowerControlWithFeedback;
|
||||||
|
if (displayTwoWay != null)
|
||||||
|
{
|
||||||
|
displayTwoWay.PowerIsOnFeedback.LinkInputSig(defaultDisplayPowerOn.InputSig);
|
||||||
|
displayTwoWay.PowerIsOnFeedback.LinkInputSig(defaultDisplayPowerOn.InputSig);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Current Source
|
||||||
|
var defaultDisplaySourceNone = FusionRoom.CreateOffsetBoolSig((uint)joinOffset + 8, displayName + "Source None", eSigIoMask.InputOutputSig);
|
||||||
|
defaultDisplaySourceNone.OutputSig.UserObject = new Action<bool>(b => { if (!b) (Room as IEssentialsHuddleVtc1Room).RunRouteAction("roomOff", Room.SourceListKey); }); ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,106 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using Crestron.SimplSharp;
|
||||||
|
|
||||||
|
using PepperDash.Core;
|
||||||
|
using PepperDash.Essentials.Core;
|
||||||
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
using PepperDash.Essentials.Core.Fusion;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Fusion
|
||||||
|
{
|
||||||
|
public class EssentialsTechRoomFusionSystemController : EssentialsHuddleSpaceFusionSystemControllerBase
|
||||||
|
{
|
||||||
|
public EssentialsTechRoomFusionSystemController(EssentialsTechRoom room, uint ipId, string joinMapKey)
|
||||||
|
: base(room, ipId, joinMapKey)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void SetUpDisplay()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
|
||||||
|
var displays = (Room as EssentialsTechRoom).Displays;
|
||||||
|
|
||||||
|
Debug.Console(1, this, "Setting up Static Assets for {0} Displays", displays.Count);
|
||||||
|
|
||||||
|
foreach (var display in displays.Values.Cast<DisplayBase>())
|
||||||
|
{
|
||||||
|
var disp = display; // Local scope variable
|
||||||
|
|
||||||
|
Debug.Console(2, this, "Setting up Static Asset for {0}", disp.Key);
|
||||||
|
|
||||||
|
disp.UsageTracker = new UsageTracking(disp) { UsageIsTracked = true };
|
||||||
|
disp.UsageTracker.DeviceUsageEnded += UsageTracker_DeviceUsageEnded;
|
||||||
|
|
||||||
|
var dispPowerOnAction = new Action<bool>(b =>
|
||||||
|
{
|
||||||
|
if (!b)
|
||||||
|
{
|
||||||
|
disp.PowerOn();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var dispPowerOffAction = new Action<bool>(b =>
|
||||||
|
{
|
||||||
|
if (!b)
|
||||||
|
{
|
||||||
|
disp.PowerOff();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var deviceConfig = ConfigReader.ConfigObject.GetDeviceForKey(disp.Key);
|
||||||
|
|
||||||
|
FusionAsset tempAsset;
|
||||||
|
|
||||||
|
if (FusionStaticAssets.ContainsKey(deviceConfig.Uid))
|
||||||
|
{
|
||||||
|
// Used existing asset
|
||||||
|
tempAsset = FusionStaticAssets[deviceConfig.Uid];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Create a new asset
|
||||||
|
tempAsset = new FusionAsset(FusionRoomGuids.GetNextAvailableAssetNumber(FusionRoom),
|
||||||
|
disp.Name, "Display", "");
|
||||||
|
FusionStaticAssets.Add(deviceConfig.Uid, tempAsset);
|
||||||
|
}
|
||||||
|
|
||||||
|
var dispAsset = FusionRoom.CreateStaticAsset(tempAsset.SlotNumber, tempAsset.Name, "Display",
|
||||||
|
tempAsset.InstanceId);
|
||||||
|
|
||||||
|
if (dispAsset != null)
|
||||||
|
{
|
||||||
|
dispAsset.PowerOn.OutputSig.UserObject = dispPowerOnAction;
|
||||||
|
dispAsset.PowerOff.OutputSig.UserObject = dispPowerOffAction;
|
||||||
|
|
||||||
|
// Use extension methods
|
||||||
|
dispAsset.TrySetMakeModel(disp);
|
||||||
|
dispAsset.TryLinkAssetErrorToCommunication(disp);
|
||||||
|
}
|
||||||
|
|
||||||
|
var defaultTwoWayDisplay = disp as IHasPowerControlWithFeedback;
|
||||||
|
if (defaultTwoWayDisplay != null)
|
||||||
|
{
|
||||||
|
defaultTwoWayDisplay.PowerIsOnFeedback.LinkInputSig(FusionRoom.DisplayPowerOn.InputSig);
|
||||||
|
if (disp is IDisplayUsage)
|
||||||
|
{
|
||||||
|
(disp as IDisplayUsage).LampHours.LinkInputSig(FusionRoom.DisplayUsage.InputSig);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(dispAsset != null)
|
||||||
|
defaultTwoWayDisplay.PowerIsOnFeedback.LinkInputSig(dispAsset.PowerOn.InputSig);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Error setting up displays in Fusion: {0}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -71,13 +71,9 @@
|
|||||||
<HintPath>..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SSPDevices\Crestron.SimplSharpPro.UI.dll</HintPath>
|
<HintPath>..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SSPDevices\Crestron.SimplSharpPro.UI.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="mscorlib" />
|
<Reference Include="mscorlib" />
|
||||||
<Reference Include="PepperDash_Core, Version=1.0.26.30384, Culture=neutral, processorArchitecture=MSIL">
|
<Reference Include="PepperDash_Core, Version=1.0.42.30563, Culture=neutral, processorArchitecture=MSIL">
|
||||||
<SpecificVersion>False</SpecificVersion>
|
<SpecificVersion>False</SpecificVersion>
|
||||||
<HintPath>..\essentials-framework\pepperdashcore-builds\PepperDash_Core.dll</HintPath>
|
<HintPath>..\packages\PepperDashCore\lib\net35\PepperDash_Core.dll</HintPath>
|
||||||
</Reference>
|
|
||||||
<Reference Include="PepperDash_Essentials_DM, Version=1.0.0.19343, Culture=neutral, processorArchitecture=MSIL">
|
|
||||||
<SpecificVersion>False</SpecificVersion>
|
|
||||||
<HintPath>..\essentials-framework\Essentials DM\Essentials_DM\bin\PepperDash_Essentials_DM.dll</HintPath>
|
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="SimplSharpCustomAttributesInterface, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL">
|
<Reference Include="SimplSharpCustomAttributesInterface, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL">
|
||||||
<SpecificVersion>False</SpecificVersion>
|
<SpecificVersion>False</SpecificVersion>
|
||||||
@@ -137,24 +133,29 @@
|
|||||||
<Compile Include="Devices\Amplifier.cs" />
|
<Compile Include="Devices\Amplifier.cs" />
|
||||||
<Compile Include="ControlSystem.cs" />
|
<Compile Include="ControlSystem.cs" />
|
||||||
<Compile Include="Fusion\EssentialsHuddleVtc1FusionController.cs" />
|
<Compile Include="Fusion\EssentialsHuddleVtc1FusionController.cs" />
|
||||||
|
<Compile Include="Fusion\EssentialsTechRoomFusionSystemController.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="Room\Config\EssentialsDualDisplayRoomPropertiesConfig.cs" />
|
<Compile Include="Room\Config\EssentialsDualDisplayRoomPropertiesConfig.cs" />
|
||||||
<Compile Include="Room\Config\EssentialsNDisplayRoomPropertiesConfig.cs" />
|
<Compile Include="Room\Config\EssentialsNDisplayRoomPropertiesConfig.cs" />
|
||||||
<Compile Include="Room\Config\DDVC01RoomPropertiesConfig.cs" />
|
<Compile Include="Room\Config\SimplRoomPropertiesConfig.cs" />
|
||||||
<Compile Include="Room\Config\EssentialsPresentationPropertiesConfig.cs" />
|
<Compile Include="Room\Config\EssentialsPresentationPropertiesConfig.cs" />
|
||||||
<Compile Include="Room\Config\EssentialsHuddleRoomPropertiesConfig.cs" />
|
<Compile Include="Room\Config\EssentialsHuddleRoomPropertiesConfig.cs" />
|
||||||
<Compile Include="Room\Config\EssentialsHuddleVtc1PropertiesConfig.cs" />
|
<Compile Include="Room\Config\EssentialsHuddleVtc1PropertiesConfig.cs" />
|
||||||
<Compile Include="Room\Config\EssentialsRoomEmergencyConfig.cs" />
|
<Compile Include="Room\Config\EssentialsRoomEmergencyConfig.cs" />
|
||||||
|
<Compile Include="Room\Config\EssentialsTechRoomConfig.cs" />
|
||||||
<Compile Include="Room\Emergency\EsentialsRoomEmergencyContactClosure.cs" />
|
<Compile Include="Room\Emergency\EsentialsRoomEmergencyContactClosure.cs" />
|
||||||
<Compile Include="Room\Types\EssentialsDualDisplayRoom.cs" />
|
<Compile Include="Room\Types\EssentialsDualDisplayRoom.cs" />
|
||||||
<Compile Include="Room\Types\EssentialsHuddleVtc1Room.cs" />
|
<Compile Include="Room\Types\EssentialsHuddleVtc1Room.cs" />
|
||||||
<Compile Include="Room\Types\EssentialsNDisplayRoomBase.cs" />
|
<Compile Include="Room\Types\EssentialsNDisplayRoomBase.cs" />
|
||||||
<Compile Include="Room\Config\EssentialsRoomConfig.cs" />
|
<Compile Include="Room\Config\EssentialsRoomConfig.cs" />
|
||||||
|
<Compile Include="Room\Types\EssentialsTechRoom.cs" />
|
||||||
|
<Compile Include="Room\Types\IEssentialsHuddleSpaceRoom.cs" />
|
||||||
<Compile Include="UIDrivers\Environment Drivers\EssentialsEnvironmentDriver.cs" />
|
<Compile Include="UIDrivers\Environment Drivers\EssentialsEnvironmentDriver.cs" />
|
||||||
<Compile Include="UIDrivers\Environment Drivers\EssentialsLightingDriver.cs" />
|
<Compile Include="UIDrivers\Environment Drivers\EssentialsLightingDriver.cs" />
|
||||||
<Compile Include="UIDrivers\Environment Drivers\EssentialsShadeDriver.cs" />
|
<Compile Include="UIDrivers\Environment Drivers\EssentialsShadeDriver.cs" />
|
||||||
<Compile Include="UIDrivers\Essentials\EssentialsHeaderDriver.cs" />
|
<Compile Include="UIDrivers\Essentials\EssentialsHeaderDriver.cs" />
|
||||||
<Compile Include="UIDrivers\JoinedSigInterlock.cs" />
|
<Compile Include="UIDrivers\JoinedSigInterlock.cs" />
|
||||||
|
<Compile Include="UIDrivers\ScreenSaverController.cs" />
|
||||||
<Compile Include="UIDrivers\SigInterlock.cs" />
|
<Compile Include="UIDrivers\SigInterlock.cs" />
|
||||||
<Compile Include="UIDrivers\EssentialsHuddleVTC\EssentialsHuddlePresentationUiDriver.cs" />
|
<Compile Include="UIDrivers\EssentialsHuddleVTC\EssentialsHuddlePresentationUiDriver.cs" />
|
||||||
<Compile Include="UIDrivers\EssentialsHuddle\EssentialsHuddleTechPageDriver.cs" />
|
<Compile Include="UIDrivers\EssentialsHuddle\EssentialsHuddleTechPageDriver.cs" />
|
||||||
@@ -214,6 +215,10 @@
|
|||||||
<Project>{892B761C-E479-44CE-BD74-243E9214AF13}</Project>
|
<Project>{892B761C-E479-44CE-BD74-243E9214AF13}</Project>
|
||||||
<Name>Essentials Devices Common</Name>
|
<Name>Essentials Devices Common</Name>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\essentials-framework\Essentials DM\Essentials_DM\PepperDash_Essentials_DM.csproj">
|
||||||
|
<Project>{9199CE8A-0C9F-4952-8672-3EED798B284F}</Project>
|
||||||
|
<Name>PepperDash_Essentials_DM</Name>
|
||||||
|
</ProjectReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildBinPath)\Microsoft.CompactFramework.CSharp.targets" />
|
<Import Project="$(MSBuildBinPath)\Microsoft.CompactFramework.CSharp.targets" />
|
||||||
<ProjectExtensions>
|
<ProjectExtensions>
|
||||||
|
|||||||
@@ -22,37 +22,32 @@ namespace PepperDash.Essentials.Room.Config
|
|||||||
public static Device GetRoomObject(DeviceConfig roomConfig)
|
public static Device GetRoomObject(DeviceConfig roomConfig)
|
||||||
{
|
{
|
||||||
var typeName = roomConfig.Type.ToLower();
|
var typeName = roomConfig.Type.ToLower();
|
||||||
|
|
||||||
if (typeName == "huddle")
|
if (typeName == "huddle")
|
||||||
{
|
{
|
||||||
var huddle = new EssentialsHuddleSpaceRoom(roomConfig);
|
return new EssentialsHuddleSpaceRoom(roomConfig);
|
||||||
|
|
||||||
return huddle;
|
|
||||||
}
|
}
|
||||||
else if (typeName == "huddlevtc1")
|
if (typeName == "huddlevtc1")
|
||||||
{
|
{
|
||||||
var rm = new EssentialsHuddleVtc1Room(roomConfig);
|
return new EssentialsHuddleVtc1Room(roomConfig);
|
||||||
|
}
|
||||||
return rm;
|
if (typeName == "ddvc01bridge")
|
||||||
}
|
{
|
||||||
else if (typeName == "ddvc01Bridge")
|
return new Device(roomConfig.Key, roomConfig.Name); // placeholder device that does nothing.
|
||||||
{
|
}
|
||||||
return new Device(roomConfig.Key, roomConfig.Name); // placeholder device that does nothing.
|
if (typeName == "dualdisplay")
|
||||||
}
|
{
|
||||||
else if (typeName == "dualdisplay")
|
return new EssentialsDualDisplayRoom(roomConfig);
|
||||||
{
|
}
|
||||||
var rm = new EssentialsDualDisplayRoom(roomConfig);
|
|
||||||
|
|
||||||
return rm;
|
return typeName != "techroom" ? null : new EssentialsTechRoom(roomConfig);
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets and operating, standalone emergegncy object that can be plugged into a room.
|
/// Gets and operating, standalone emergegncy object that can be plugged into a room.
|
||||||
/// Returns null if there is no emergency defined
|
/// Returns null if there is no emergency defined
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static EssentialsRoomEmergencyBase GetEmergency(EssentialsRoomPropertiesConfig props, EssentialsRoomBase room)
|
public static EssentialsRoomEmergencyBase GetEmergency(EssentialsRoomPropertiesConfig props, IEssentialsRoom room)
|
||||||
{
|
{
|
||||||
// This emergency
|
// This emergency
|
||||||
var emergency = props.Emergency;
|
var emergency = props.Emergency;
|
||||||
@@ -101,7 +96,7 @@ namespace PepperDash.Essentials.Room.Config
|
|||||||
if (behaviour == "trackroomstate")
|
if (behaviour == "trackroomstate")
|
||||||
{
|
{
|
||||||
// Tie LED enable to room power state
|
// Tie LED enable to room power state
|
||||||
var essRoom = room as EssentialsRoomBase;
|
var essRoom = room as IEssentialsRoom;
|
||||||
essRoom.OnFeedback.OutputChange += (o, a) =>
|
essRoom.OnFeedback.OutputChange += (o, a) =>
|
||||||
{
|
{
|
||||||
if (essRoom.OnFeedback.BoolValue)
|
if (essRoom.OnFeedback.BoolValue)
|
||||||
@@ -152,11 +147,32 @@ namespace PepperDash.Essentials.Room.Config
|
|||||||
[JsonProperty("helpMessage")]
|
[JsonProperty("helpMessage")]
|
||||||
public string HelpMessage { get; set; }
|
public string HelpMessage { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Read this value to get the help message. It checks for the old and new config format.
|
||||||
|
/// </summary>
|
||||||
|
public string HelpMessageForDisplay
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if(Help != null && !string.IsNullOrEmpty(Help.Message))
|
||||||
|
{
|
||||||
|
return Help.Message;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return HelpMessage;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[JsonProperty("environment")]
|
[JsonProperty("environment")]
|
||||||
public EssentialsEnvironmentPropertiesConfig Environment { get; set; }
|
public EssentialsEnvironmentPropertiesConfig Environment { get; set; }
|
||||||
|
|
||||||
[JsonProperty("logo")]
|
[JsonProperty("logo")]
|
||||||
public EssentialsLogoPropertiesConfig Logo { get; set; }
|
public EssentialsLogoPropertiesConfig LogoLight { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("logoDark")]
|
||||||
|
public EssentialsLogoPropertiesConfig LogoDark { get; set; }
|
||||||
|
|
||||||
[JsonProperty("microphonePrivacy")]
|
[JsonProperty("microphonePrivacy")]
|
||||||
public EssentialsRoomMicrophonePrivacyConfig MicrophonePrivacy { get; set; }
|
public EssentialsRoomMicrophonePrivacyConfig MicrophonePrivacy { get; set; }
|
||||||
@@ -179,8 +195,17 @@ namespace PepperDash.Essentials.Room.Config
|
|||||||
[JsonProperty("volumes")]
|
[JsonProperty("volumes")]
|
||||||
public EssentialsRoomVolumesConfig Volumes { get; set; }
|
public EssentialsRoomVolumesConfig Volumes { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("fusion")]
|
||||||
|
public EssentialsRoomFusionConfig Fusion { get; set; }
|
||||||
|
|
||||||
[JsonProperty("zeroVolumeWhenSwtichingVolumeDevices")]
|
[JsonProperty("zeroVolumeWhenSwtichingVolumeDevices")]
|
||||||
public bool ZeroVolumeWhenSwtichingVolumeDevices { get; set; }
|
public bool ZeroVolumeWhenSwtichingVolumeDevices { get; set; }
|
||||||
|
|
||||||
|
public EssentialsRoomPropertiesConfig()
|
||||||
|
{
|
||||||
|
LogoLight = new EssentialsLogoPropertiesConfig();
|
||||||
|
LogoDark = new EssentialsLogoPropertiesConfig();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class EssentialsAvRoomPropertiesConfig : EssentialsRoomPropertiesConfig
|
public class EssentialsAvRoomPropertiesConfig : EssentialsRoomPropertiesConfig
|
||||||
@@ -189,9 +214,20 @@ namespace PepperDash.Essentials.Room.Config
|
|||||||
public string DefaultAudioKey { get; set; }
|
public string DefaultAudioKey { get; set; }
|
||||||
[JsonProperty("sourceListKey")]
|
[JsonProperty("sourceListKey")]
|
||||||
public string SourceListKey { get; set; }
|
public string SourceListKey { get; set; }
|
||||||
|
[JsonProperty("destinationListKey")]
|
||||||
|
public string DestinationListKey { get; set; }
|
||||||
[JsonProperty("defaultSourceItem")]
|
[JsonProperty("defaultSourceItem")]
|
||||||
public string DefaultSourceItem { get; set; }
|
public string DefaultSourceItem { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates if the room supports advanced sharing
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("supportsAdvancedSharing")]
|
||||||
|
public bool SupportsAdvancedSharing { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates if non-tech users can change the share mode
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("userCanChangeShareMode")]
|
||||||
|
public bool UserCanChangeShareMode { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class EssentialsConferenceRoomPropertiesConfig : EssentialsAvRoomPropertiesConfig
|
public class EssentialsConferenceRoomPropertiesConfig : EssentialsAvRoomPropertiesConfig
|
||||||
@@ -216,6 +252,32 @@ namespace PepperDash.Essentials.Room.Config
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class EssentialsRoomFusionConfig
|
||||||
|
{
|
||||||
|
public uint IpIdInt
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return Convert.ToUInt32(IpId, 16);
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
throw new FormatException(string.Format("ERROR:Unable to convert IP ID: {0} to hex. Error:\n{1}", IpId));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonProperty("ipId")]
|
||||||
|
public string IpId { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("joinMapKey")]
|
||||||
|
public string JoinMapKey { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public class EssentialsRoomMicrophonePrivacyConfig
|
public class EssentialsRoomMicrophonePrivacyConfig
|
||||||
{
|
{
|
||||||
[JsonProperty("deviceKey")]
|
[JsonProperty("deviceKey")]
|
||||||
@@ -280,7 +342,7 @@ namespace PepperDash.Essentials.Room.Config
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets either the custom URL, a local-to-processor URL, or null if it's a default logo
|
/// Gets either the custom URL, a local-to-processor URL, or null if it's a default logo
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string GetUrl()
|
public string GetLogoUrlLight()
|
||||||
{
|
{
|
||||||
if (Type == "url")
|
if (Type == "url")
|
||||||
return Url;
|
return Url;
|
||||||
@@ -289,6 +351,16 @@ namespace PepperDash.Essentials.Room.Config
|
|||||||
CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_ADDRESS, 0));
|
CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_ADDRESS, 0));
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string GetLogoUrlDark()
|
||||||
|
{
|
||||||
|
if (Type == "url")
|
||||||
|
return Url;
|
||||||
|
if (Type == "system")
|
||||||
|
return string.Format("http://{0}:8080/logo-dark.png",
|
||||||
|
CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_ADDRESS, 0));
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
72
PepperDashEssentials/Room/Config/EssentialsTechRoomConfig.cs
Normal file
72
PepperDashEssentials/Room/Config/EssentialsTechRoomConfig.cs
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Room.Config
|
||||||
|
{
|
||||||
|
public class EssentialsTechRoomConfig
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The key of the dummy device used to enable routing
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("dummySourceKey")]
|
||||||
|
public string DummySourceKey { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The keys of the displays assigned to this room
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("displays")]
|
||||||
|
public List<string> Displays { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The keys of the tuners assinged to this room
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("tuners")]
|
||||||
|
public List<string> Tuners { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// PIN to access the room as a normal user
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("userPin")]
|
||||||
|
public string UserPin { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// PIN to access the room as a tech user
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("techPin")]
|
||||||
|
public string TechPin { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Name of the presets file. Path prefix is assumed to be /html/presets/lists/
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("presetsFileName")]
|
||||||
|
public string PresetsFileName { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("scheduledEvents")]
|
||||||
|
public List<ScheduledEventConfig> ScheduledEvents { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates that the room is the primary when true
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("isPrimary")]
|
||||||
|
public bool IsPrimary { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates which tuners should mirror preset recall when two rooms are configured in a primary->secondary scenario
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("mirroredTuners")]
|
||||||
|
public Dictionary<uint, string> MirroredTuners { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates the room
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("isTvPresetsProvider")]
|
||||||
|
public bool IsTvPresetsProvider;
|
||||||
|
|
||||||
|
public EssentialsTechRoomConfig()
|
||||||
|
{
|
||||||
|
Displays = new List<string>();
|
||||||
|
Tuners = new List<string>();
|
||||||
|
ScheduledEvents = new List<ScheduledEventConfig>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,19 +8,19 @@ using Newtonsoft.Json;
|
|||||||
|
|
||||||
namespace PepperDash.Essentials.Room.Config
|
namespace PepperDash.Essentials.Room.Config
|
||||||
{
|
{
|
||||||
public class DDVC01RoomPropertiesConfig : EssentialsHuddleVtc1PropertiesConfig
|
public class SimplRoomPropertiesConfig : EssentialsHuddleVtc1PropertiesConfig
|
||||||
{
|
{
|
||||||
[JsonProperty("roomPhoneNumber")]
|
[JsonProperty("roomPhoneNumber")]
|
||||||
public string RoomPhoneNumber { get; set; }
|
public string RoomPhoneNumber { get; set; }
|
||||||
[JsonProperty("roomURI")]
|
[JsonProperty("roomURI")]
|
||||||
public string RoomURI { get; set; }
|
public string RoomURI { get; set; }
|
||||||
[JsonProperty("speedDials")]
|
[JsonProperty("speedDials")]
|
||||||
public List<DDVC01SpeedDial> SpeedDials { get; set; }
|
public List<SimplSpeedDial> SpeedDials { get; set; }
|
||||||
[JsonProperty("volumeSliderNames")]
|
[JsonProperty("volumeSliderNames")]
|
||||||
public List<string> VolumeSliderNames { get; set; }
|
public List<string> VolumeSliderNames { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class DDVC01SpeedDial
|
public class SimplSpeedDial
|
||||||
{
|
{
|
||||||
[JsonProperty("name")]
|
[JsonProperty("name")]
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
@@ -17,11 +17,11 @@ namespace PepperDash.Essentials.Room
|
|||||||
|
|
||||||
public class EssentialsRoomEmergencyContactClosure : EssentialsRoomEmergencyBase
|
public class EssentialsRoomEmergencyContactClosure : EssentialsRoomEmergencyBase
|
||||||
{
|
{
|
||||||
EssentialsRoomBase Room;
|
IEssentialsRoom Room;
|
||||||
string Behavior;
|
string Behavior;
|
||||||
bool TriggerOnClose;
|
bool TriggerOnClose;
|
||||||
|
|
||||||
public EssentialsRoomEmergencyContactClosure(string key, EssentialsRoomEmergencyConfig config, EssentialsRoomBase room) :
|
public EssentialsRoomEmergencyContactClosure(string key, EssentialsRoomEmergencyConfig config, IEssentialsRoom room) :
|
||||||
base(key)
|
base(key)
|
||||||
{
|
{
|
||||||
Room = room;
|
Room = room;
|
||||||
|
|||||||
@@ -207,7 +207,7 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
DefaultAudioDevice = DeviceManager.GetDeviceForKey(PropertiesConfig.DefaultAudioKey) as IBasicVolumeControls;
|
DefaultAudioDevice = DeviceManager.GetDeviceForKey(PropertiesConfig.DefaultAudioKey) as IBasicVolumeControls;
|
||||||
|
|
||||||
Initialize();
|
InitializeRoom();
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
@@ -215,7 +215,7 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Initialize()
|
void InitializeRoom()
|
||||||
{
|
{
|
||||||
if (DefaultAudioDevice is IBasicVolumeControls)
|
if (DefaultAudioDevice is IBasicVolumeControls)
|
||||||
DefaultVolumeControls = DefaultAudioDevice as IBasicVolumeControls;
|
DefaultVolumeControls = DefaultAudioDevice as IBasicVolumeControls;
|
||||||
@@ -274,28 +274,45 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
CallTypeFeedback = new IntFeedback(() => 0);
|
CallTypeFeedback = new IntFeedback(() => 0);
|
||||||
|
|
||||||
SourceListKey = "default";
|
SetSourceListKey();
|
||||||
EnablePowerOnToLastSource = true;
|
EnablePowerOnToLastSource = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SetSourceListKey()
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(PropertiesConfig.SourceListKey))
|
||||||
|
{
|
||||||
|
SetSourceListKey(PropertiesConfig.SourceListKey);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetSourceListKey(Key);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void InitializeDisplay(DisplayBase disp)
|
void InitializeDisplay(DisplayBase disp)
|
||||||
{
|
{
|
||||||
if (disp != null)
|
if (disp != null)
|
||||||
{
|
{
|
||||||
// Link power, warming, cooling to display
|
// Link power, warming, cooling to display
|
||||||
disp.PowerIsOnFeedback.OutputChange += (o, a) =>
|
var dispTwoWay = disp as IHasPowerControlWithFeedback;
|
||||||
{
|
if (dispTwoWay != null)
|
||||||
if (disp.PowerIsOnFeedback.BoolValue != OnFeedback.BoolValue)
|
{
|
||||||
|
dispTwoWay.PowerIsOnFeedback.OutputChange += (o, a) =>
|
||||||
{
|
{
|
||||||
if (!disp.PowerIsOnFeedback.BoolValue)
|
if (dispTwoWay.PowerIsOnFeedback.BoolValue != OnFeedback.BoolValue)
|
||||||
disp.CurrentSourceInfo = null;
|
{
|
||||||
OnFeedback.FireUpdate();
|
if (!dispTwoWay.PowerIsOnFeedback.BoolValue)
|
||||||
}
|
disp.CurrentSourceInfo = null;
|
||||||
if (disp.PowerIsOnFeedback.BoolValue)
|
OnFeedback.FireUpdate();
|
||||||
{
|
}
|
||||||
SetDefaultLevels();
|
if (dispTwoWay.PowerIsOnFeedback.BoolValue)
|
||||||
}
|
{
|
||||||
};
|
SetDefaultLevels();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
disp.IsWarmingUpFeedback.OutputChange += (o, a) =>
|
disp.IsWarmingUpFeedback.OutputChange += (o, a) =>
|
||||||
{
|
{
|
||||||
@@ -327,8 +344,8 @@ namespace PepperDash.Essentials
|
|||||||
this.SetRoomOccupancy(DeviceManager.GetDeviceForKey(PropertiesConfig.Occupancy.DeviceKey) as
|
this.SetRoomOccupancy(DeviceManager.GetDeviceForKey(PropertiesConfig.Occupancy.DeviceKey) as
|
||||||
IOccupancyStatusProvider, PropertiesConfig.Occupancy.TimeoutMinutes);
|
IOccupancyStatusProvider, PropertiesConfig.Occupancy.TimeoutMinutes);
|
||||||
|
|
||||||
this.LogoUrl = PropertiesConfig.Logo.GetUrl();
|
this.LogoUrlLightBkgnd = PropertiesConfig.LogoLight.GetLogoUrlLight();
|
||||||
this.SourceListKey = PropertiesConfig.SourceListKey;
|
this.LogoUrlDarkBkgnd = PropertiesConfig.LogoDark.GetLogoUrlDark();
|
||||||
this.DefaultSourceItem = PropertiesConfig.DefaultSourceItem;
|
this.DefaultSourceItem = PropertiesConfig.DefaultSourceItem;
|
||||||
this.DefaultVolume = (ushort)(PropertiesConfig.Volumes.Master.Level * 65535 / 100);
|
this.DefaultVolume = (ushort)(PropertiesConfig.Volumes.Master.Level * 65535 / 100);
|
||||||
|
|
||||||
@@ -578,8 +595,8 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (dest is IPower)
|
if (dest is IHasPowerControl)
|
||||||
(dest as IPower).PowerOff();
|
(dest as IHasPowerControl).PowerOff();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -628,9 +645,9 @@ namespace PepperDash.Essentials
|
|||||||
public static void AllRoomsOff()
|
public static void AllRoomsOff()
|
||||||
{
|
{
|
||||||
var allRooms = DeviceManager.AllDevices.Where(d =>
|
var allRooms = DeviceManager.AllDevices.Where(d =>
|
||||||
d is EssentialsHuddleSpaceRoom && !(d as EssentialsHuddleSpaceRoom).ExcludeFromGlobalFunctions);
|
d is IEssentialsHuddleSpaceRoom && !(d as IEssentialsHuddleSpaceRoom).ExcludeFromGlobalFunctions);
|
||||||
foreach (var room in allRooms)
|
foreach (var room in allRooms)
|
||||||
(room as EssentialsHuddleSpaceRoom).RunRouteAction("roomOff", (room as EssentialsHuddleSpaceRoom).SourceListKey);
|
(room as IEssentialsHuddleSpaceRoom).RunRouteAction("roomOff", (room as IEssentialsHuddleSpaceRoom).SourceListKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
#region IPrivacy Members
|
#region IPrivacy Members
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ using PepperDash.Essentials.Room.Config;
|
|||||||
|
|
||||||
namespace PepperDash.Essentials
|
namespace PepperDash.Essentials
|
||||||
{
|
{
|
||||||
public class EssentialsHuddleSpaceRoom : EssentialsRoomBase, IHasCurrentSourceInfoChange, IRunRouteAction, IRunDefaultPresentRoute, IHasCurrentVolumeControls, IHasDefaultDisplay
|
public class EssentialsHuddleSpaceRoom : EssentialsRoomBase, IEssentialsHuddleSpaceRoom
|
||||||
{
|
{
|
||||||
public event EventHandler<VolumeDeviceChangeEventArgs> CurrentVolumeDeviceChange;
|
public event EventHandler<VolumeDeviceChangeEventArgs> CurrentVolumeDeviceChange;
|
||||||
public event SourceInfoChangeHandler CurrentSourceChange;
|
public event SourceInfoChangeHandler CurrentSourceChange;
|
||||||
@@ -156,7 +156,7 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
DefaultAudioDevice = DeviceManager.GetDeviceForKey(PropertiesConfig.DefaultAudioKey) as IRoutingSinkWithSwitching;
|
DefaultAudioDevice = DeviceManager.GetDeviceForKey(PropertiesConfig.DefaultAudioKey) as IRoutingSinkWithSwitching;
|
||||||
|
|
||||||
Initialize();
|
InitializeRoom();
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
@@ -164,7 +164,7 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Initialize()
|
void InitializeRoom()
|
||||||
{
|
{
|
||||||
if (DefaultAudioDevice is IBasicVolumeControls)
|
if (DefaultAudioDevice is IBasicVolumeControls)
|
||||||
DefaultVolumeControls = DefaultAudioDevice as IBasicVolumeControls;
|
DefaultVolumeControls = DefaultAudioDevice as IBasicVolumeControls;
|
||||||
@@ -176,15 +176,19 @@ namespace PepperDash.Essentials
|
|||||||
if (disp != null)
|
if (disp != null)
|
||||||
{
|
{
|
||||||
// Link power, warming, cooling to display
|
// Link power, warming, cooling to display
|
||||||
disp.PowerIsOnFeedback.OutputChange += (o, a) =>
|
var dispTwoWay = disp as IHasPowerControlWithFeedback;
|
||||||
{
|
if (dispTwoWay != null)
|
||||||
if (disp.PowerIsOnFeedback.BoolValue != OnFeedback.BoolValue)
|
{
|
||||||
{
|
dispTwoWay.PowerIsOnFeedback.OutputChange += (o, a) =>
|
||||||
if (!disp.PowerIsOnFeedback.BoolValue)
|
{
|
||||||
CurrentSourceInfo = null;
|
if (dispTwoWay.PowerIsOnFeedback.BoolValue != OnFeedback.BoolValue)
|
||||||
OnFeedback.FireUpdate();
|
{
|
||||||
}
|
if (!dispTwoWay.PowerIsOnFeedback.BoolValue)
|
||||||
};
|
CurrentSourceInfo = null;
|
||||||
|
OnFeedback.FireUpdate();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
disp.IsWarmingUpFeedback.OutputChange += (o, a) =>
|
disp.IsWarmingUpFeedback.OutputChange += (o, a) =>
|
||||||
{
|
{
|
||||||
@@ -197,11 +201,42 @@ namespace PepperDash.Essentials
|
|||||||
IsCoolingDownFeedback.FireUpdate();
|
IsCoolingDownFeedback.FireUpdate();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SetupEnvironmentalControlDevices();
|
||||||
|
|
||||||
|
SetSourceListKey();
|
||||||
|
|
||||||
SourceListKey = "default";
|
|
||||||
EnablePowerOnToLastSource = true;
|
EnablePowerOnToLastSource = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SetupEnvironmentalControlDevices()
|
||||||
|
{
|
||||||
|
if (PropertiesConfig.Environment != null)
|
||||||
|
{
|
||||||
|
if (PropertiesConfig.Environment.Enabled)
|
||||||
|
{
|
||||||
|
foreach (var d in PropertiesConfig.Environment.DeviceKeys)
|
||||||
|
{
|
||||||
|
var envDevice = DeviceManager.GetDeviceForKey(d) as EssentialsDevice;
|
||||||
|
EnvironmentalControlDevices.Add(envDevice);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetSourceListKey()
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(PropertiesConfig.SourceListKey))
|
||||||
|
{
|
||||||
|
SetSourceListKey(PropertiesConfig.SourceListKey);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetSourceListKey(Key);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
protected override void CustomSetConfig(DeviceConfig config)
|
protected override void CustomSetConfig(DeviceConfig config)
|
||||||
{
|
{
|
||||||
var newPropertiesConfig = JsonConvert.DeserializeObject<EssentialsHuddleRoomPropertiesConfig>(config.Properties.ToString());
|
var newPropertiesConfig = JsonConvert.DeserializeObject<EssentialsHuddleRoomPropertiesConfig>(config.Properties.ToString());
|
||||||
@@ -250,8 +285,8 @@ namespace PepperDash.Essentials
|
|||||||
this.SetRoomOccupancy(DeviceManager.GetDeviceForKey(PropertiesConfig.Occupancy.DeviceKey) as
|
this.SetRoomOccupancy(DeviceManager.GetDeviceForKey(PropertiesConfig.Occupancy.DeviceKey) as
|
||||||
IOccupancyStatusProvider, PropertiesConfig.Occupancy.TimeoutMinutes);
|
IOccupancyStatusProvider, PropertiesConfig.Occupancy.TimeoutMinutes);
|
||||||
|
|
||||||
this.LogoUrl = PropertiesConfig.Logo.GetUrl();
|
this.LogoUrlLightBkgnd = PropertiesConfig.LogoLight.GetLogoUrlLight();
|
||||||
this.SourceListKey = PropertiesConfig.SourceListKey;
|
this.LogoUrlDarkBkgnd = PropertiesConfig.LogoDark.GetLogoUrlDark();
|
||||||
this.DefaultSourceItem = PropertiesConfig.DefaultSourceItem;
|
this.DefaultSourceItem = PropertiesConfig.DefaultSourceItem;
|
||||||
this.DefaultVolume = (ushort)(PropertiesConfig.Volumes.Master.Level * 65535 / 100);
|
this.DefaultVolume = (ushort)(PropertiesConfig.Volumes.Master.Level * 65535 / 100);
|
||||||
|
|
||||||
@@ -494,8 +529,8 @@ namespace PepperDash.Essentials
|
|||||||
if (route.SourceKey.Equals("$off", StringComparison.OrdinalIgnoreCase))
|
if (route.SourceKey.Equals("$off", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
dest.ReleaseRoute();
|
dest.ReleaseRoute();
|
||||||
if (dest is IPower)
|
if (dest is IHasPowerControl)
|
||||||
(dest as IPower).PowerOff();
|
(dest as IHasPowerControl).PowerOff();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -13,12 +13,13 @@ using PepperDash.Essentials.Room.Config;
|
|||||||
using PepperDash.Essentials.Devices.Common.Codec;
|
using PepperDash.Essentials.Devices.Common.Codec;
|
||||||
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
||||||
using PepperDash.Essentials.Devices.Common.AudioCodec;
|
using PepperDash.Essentials.Devices.Common.AudioCodec;
|
||||||
|
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
||||||
|
|
||||||
namespace PepperDash.Essentials
|
namespace PepperDash.Essentials
|
||||||
{
|
{
|
||||||
public class EssentialsHuddleVtc1Room : EssentialsRoomBase, IHasCurrentSourceInfoChange,
|
public class EssentialsHuddleVtc1Room : EssentialsRoomBase, IEssentialsHuddleVtc1Room
|
||||||
IPrivacy, IHasCurrentVolumeControls, IRunRouteAction, IRunDefaultCallRoute, IHasVideoCodec, IHasAudioCodec, IHasDefaultDisplay, IHasInCallFeedback
|
{
|
||||||
{
|
private bool _codecExternalSourceChange;
|
||||||
public event EventHandler<VolumeDeviceChangeEventArgs> CurrentVolumeDeviceChange;
|
public event EventHandler<VolumeDeviceChangeEventArgs> CurrentVolumeDeviceChange;
|
||||||
public event SourceInfoChangeHandler CurrentSourceChange;
|
public event SourceInfoChangeHandler CurrentSourceChange;
|
||||||
|
|
||||||
@@ -50,7 +51,6 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
//************************
|
//************************
|
||||||
|
|
||||||
|
|
||||||
protected override Func<bool> OnFeedbackFunc
|
protected override Func<bool> OnFeedbackFunc
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@@ -176,6 +176,14 @@ namespace PepperDash.Essentials
|
|||||||
(_CurrentSourceInfo.SourceDevice as IInUseTracking).InUseTracker.AddUser(this, "control");
|
(_CurrentSourceInfo.SourceDevice as IInUseTracking).InUseTracker.AddUser(this, "control");
|
||||||
if (handler != null)
|
if (handler != null)
|
||||||
handler(_CurrentSourceInfo, ChangeType.DidChange);
|
handler(_CurrentSourceInfo, ChangeType.DidChange);
|
||||||
|
|
||||||
|
var vc = VideoCodec as IHasExternalSourceSwitching;
|
||||||
|
if (vc != null && !_codecExternalSourceChange)
|
||||||
|
{
|
||||||
|
vc.SetSelectedSource(CurrentSourceInfoKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
_codecExternalSourceChange = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SourceListItem _CurrentSourceInfo;
|
SourceListItem _CurrentSourceInfo;
|
||||||
@@ -206,8 +214,13 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
VideoCodec = DeviceManager.GetDeviceForKey(PropertiesConfig.VideoCodecKey) as
|
VideoCodec = DeviceManager.GetDeviceForKey(PropertiesConfig.VideoCodecKey) as
|
||||||
PepperDash.Essentials.Devices.Common.VideoCodec.VideoCodecBase;
|
PepperDash.Essentials.Devices.Common.VideoCodec.VideoCodecBase;
|
||||||
|
|
||||||
|
|
||||||
if (VideoCodec == null)
|
if (VideoCodec == null)
|
||||||
throw new ArgumentNullException("codec cannot be null");
|
{
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Error, "No Video Codec set. Please check 'videoCodecKey' property in room config");
|
||||||
|
throw new ArgumentNullException("VideoCodec cannot be null");
|
||||||
|
}
|
||||||
|
|
||||||
AudioCodec = DeviceManager.GetDeviceForKey(PropertiesConfig.AudioCodecKey) as
|
AudioCodec = DeviceManager.GetDeviceForKey(PropertiesConfig.AudioCodecKey) as
|
||||||
PepperDash.Essentials.Devices.Common.AudioCodec.AudioCodecBase;
|
PepperDash.Essentials.Devices.Common.AudioCodec.AudioCodecBase;
|
||||||
@@ -215,8 +228,13 @@ namespace PepperDash.Essentials
|
|||||||
Debug.Console(0, this, "No Audio Codec Found");
|
Debug.Console(0, this, "No Audio Codec Found");
|
||||||
|
|
||||||
DefaultAudioDevice = DeviceManager.GetDeviceForKey(PropertiesConfig.DefaultAudioKey) as IBasicVolumeControls;
|
DefaultAudioDevice = DeviceManager.GetDeviceForKey(PropertiesConfig.DefaultAudioKey) as IBasicVolumeControls;
|
||||||
|
if (DefaultAudioDevice == null)
|
||||||
|
{
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Error, "No Default Audio Device set. Please check 'defaultAudioKey' property in room config");
|
||||||
|
throw new ArgumentNullException("DefaultAudioDevice cannot be null");
|
||||||
|
}
|
||||||
|
|
||||||
Initialize();
|
InitializeRoom();
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
@@ -224,7 +242,7 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Initialize()
|
void InitializeRoom()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -257,19 +275,23 @@ namespace PepperDash.Essentials
|
|||||||
if (disp != null)
|
if (disp != null)
|
||||||
{
|
{
|
||||||
// Link power, warming, cooling to display
|
// Link power, warming, cooling to display
|
||||||
disp.PowerIsOnFeedback.OutputChange += (o, a) =>
|
var dispTwoWay = disp as IHasPowerControlWithFeedback;
|
||||||
{
|
if (dispTwoWay != null)
|
||||||
if (disp.PowerIsOnFeedback.BoolValue != OnFeedback.BoolValue)
|
{
|
||||||
|
dispTwoWay.PowerIsOnFeedback.OutputChange += (o, a) =>
|
||||||
{
|
{
|
||||||
if (!disp.PowerIsOnFeedback.BoolValue)
|
if (dispTwoWay.PowerIsOnFeedback.BoolValue != OnFeedback.BoolValue)
|
||||||
CurrentSourceInfo = null;
|
{
|
||||||
OnFeedback.FireUpdate();
|
if (!dispTwoWay.PowerIsOnFeedback.BoolValue)
|
||||||
}
|
CurrentSourceInfo = null;
|
||||||
if (disp.PowerIsOnFeedback.BoolValue)
|
OnFeedback.FireUpdate();
|
||||||
{
|
}
|
||||||
SetDefaultLevels();
|
if (dispTwoWay.PowerIsOnFeedback.BoolValue)
|
||||||
}
|
{
|
||||||
};
|
SetDefaultLevels();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
disp.IsWarmingUpFeedback.OutputChange += (o, a) =>
|
disp.IsWarmingUpFeedback.OutputChange += (o, a) =>
|
||||||
{
|
{
|
||||||
@@ -298,6 +320,7 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
|
|
||||||
VideoCodec.CallStatusChange += (o, a) => this.InCallFeedback.FireUpdate();
|
VideoCodec.CallStatusChange += (o, a) => this.InCallFeedback.FireUpdate();
|
||||||
|
VideoCodec.IsReadyChange += (o, a) => { this.SetCodecExternalSources(); SetCodecBranding(); };
|
||||||
|
|
||||||
if (AudioCodec != null)
|
if (AudioCodec != null)
|
||||||
AudioCodec.CallStatusChange += (o, a) => this.InCallFeedback.FireUpdate();
|
AudioCodec.CallStatusChange += (o, a) => this.InCallFeedback.FireUpdate();
|
||||||
@@ -311,7 +334,10 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
CallTypeFeedback = new IntFeedback(() => 0);
|
CallTypeFeedback = new IntFeedback(() => 0);
|
||||||
|
|
||||||
SourceListKey = "default";
|
SetupEnvironmentalControlDevices();
|
||||||
|
|
||||||
|
SetSourceListKey();
|
||||||
|
|
||||||
EnablePowerOnToLastSource = true;
|
EnablePowerOnToLastSource = true;
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
@@ -320,6 +346,36 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SetupEnvironmentalControlDevices()
|
||||||
|
{
|
||||||
|
if (PropertiesConfig.Environment != null)
|
||||||
|
{
|
||||||
|
if (PropertiesConfig.Environment.Enabled)
|
||||||
|
{
|
||||||
|
foreach (var d in PropertiesConfig.Environment.DeviceKeys)
|
||||||
|
{
|
||||||
|
var envDevice = DeviceManager.GetDeviceForKey(d) as EssentialsDevice;
|
||||||
|
EnvironmentalControlDevices.Add(envDevice);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void SetSourceListKey()
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(PropertiesConfig.SourceListKey))
|
||||||
|
{
|
||||||
|
SetSourceListKey(PropertiesConfig.SourceListKey);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetSourceListKey(Key);
|
||||||
|
}
|
||||||
|
|
||||||
|
SetCodecExternalSources();
|
||||||
|
}
|
||||||
|
|
||||||
protected override void CustomSetConfig(DeviceConfig config)
|
protected override void CustomSetConfig(DeviceConfig config)
|
||||||
{
|
{
|
||||||
var newPropertiesConfig = JsonConvert.DeserializeObject<EssentialsHuddleVtc1PropertiesConfig>(config.Properties.ToString());
|
var newPropertiesConfig = JsonConvert.DeserializeObject<EssentialsHuddleVtc1PropertiesConfig>(config.Properties.ToString());
|
||||||
@@ -340,14 +396,16 @@ namespace PepperDash.Essentials
|
|||||||
IOccupancyStatusProvider, PropertiesConfig.Occupancy.TimeoutMinutes);
|
IOccupancyStatusProvider, PropertiesConfig.Occupancy.TimeoutMinutes);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.LogoUrl = PropertiesConfig.Logo.GetUrl();
|
this.LogoUrlLightBkgnd = PropertiesConfig.LogoLight.GetLogoUrlLight();
|
||||||
this.SourceListKey = PropertiesConfig.SourceListKey;
|
this.LogoUrlDarkBkgnd = PropertiesConfig.LogoDark.GetLogoUrlDark();
|
||||||
|
|
||||||
this.DefaultSourceItem = PropertiesConfig.DefaultSourceItem;
|
this.DefaultSourceItem = PropertiesConfig.DefaultSourceItem;
|
||||||
this.DefaultVolume = (ushort)(PropertiesConfig.Volumes.Master.Level * 65535 / 100);
|
this.DefaultVolume = (ushort)(PropertiesConfig.Volumes.Master.Level * 65535 / 100);
|
||||||
|
|
||||||
return base.CustomActivate();
|
return base.CustomActivate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
@@ -365,6 +423,8 @@ namespace PepperDash.Essentials
|
|||||||
Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Shutting down room");
|
Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Shutting down room");
|
||||||
|
|
||||||
RunRouteAction("roomOff");
|
RunRouteAction("roomOff");
|
||||||
|
VideoCodec.StopSharing();
|
||||||
|
VideoCodec.StandbyActivate();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -384,10 +444,24 @@ namespace PepperDash.Essentials
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public bool RunDefaultCallRoute()
|
public bool RunDefaultCallRoute()
|
||||||
{
|
{
|
||||||
|
Debug.Console(2, this, "RunDefaultCallRoute() Currently Sharing Content: {0}", VideoCodec.SharingContentIsOnFeedback.BoolValue);
|
||||||
|
|
||||||
|
if (VideoCodec.SharingContentIsOnFeedback.BoolValue)
|
||||||
|
{
|
||||||
|
Debug.Console(2, this, "Currently sharing content. Ignoring request to run default call route.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
RunRouteAction(DefaultCodecRouteString);
|
RunRouteAction(DefaultCodecRouteString);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void RunRouteActionCodec(string routeKey, string sourceListKey)
|
||||||
|
{
|
||||||
|
_codecExternalSourceChange = true;
|
||||||
|
RunRouteAction(routeKey, sourceListKey);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -407,10 +481,15 @@ namespace PepperDash.Essentials
|
|||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(sourceListKey))
|
if (string.IsNullOrEmpty(sourceListKey))
|
||||||
{
|
{
|
||||||
|
Debug.Console(1, this, "No sourceListKey present. RunRouteAction assumes default source list.");
|
||||||
RunRouteAction(routeKey, new Action(() => { }));
|
RunRouteAction(routeKey, new Action(() => { }));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
throw new NotImplementedException();
|
{
|
||||||
|
Debug.Console(1, this, "sourceListKey present but not yet implemented");
|
||||||
|
|
||||||
|
RunRouteAction(routeKey, new Action(() => { }));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -426,7 +505,11 @@ namespace PepperDash.Essentials
|
|||||||
RunRouteAction(routeKey, successCallback);
|
RunRouteAction(routeKey, successCallback);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
throw new NotImplementedException();
|
{
|
||||||
|
Debug.Console(1, this, "sourceListKey present but not yet implemented");
|
||||||
|
|
||||||
|
RunRouteAction(routeKey, successCallback);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -558,6 +641,28 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
OnFeedback.FireUpdate();
|
OnFeedback.FireUpdate();
|
||||||
|
|
||||||
|
if (OnFeedback.BoolValue)
|
||||||
|
{
|
||||||
|
if (VideoCodec.UsageTracker.InUseTracker.InUseFeedback.BoolValue)
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Video Codec in use, deactivating standby on codec");
|
||||||
|
VideoCodec.StandbyDeactivate();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (VideoCodec.StandbyIsOnFeedback.BoolValue)
|
||||||
|
{
|
||||||
|
VideoCodec.StandbyDeactivate();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Video codec not in standby. No need to wake.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Room OnFeedback state: {0}", OnFeedback.BoolValue);
|
||||||
|
}
|
||||||
|
|
||||||
// report back when done
|
// report back when done
|
||||||
if (successCallback != null)
|
if (successCallback != null)
|
||||||
successCallback();
|
successCallback();
|
||||||
@@ -618,8 +723,9 @@ namespace PepperDash.Essentials
|
|||||||
if (route.SourceKey.Equals("$off", StringComparison.OrdinalIgnoreCase))
|
if (route.SourceKey.Equals("$off", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
dest.ReleaseRoute();
|
dest.ReleaseRoute();
|
||||||
if (dest is IPower)
|
if (dest is IHasPowerControl)
|
||||||
(dest as IPower).PowerOff();
|
(dest as IHasPowerControl).PowerOff();
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -664,12 +770,62 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static void AllRoomsOff()
|
public static void AllRoomsOff()
|
||||||
{
|
{
|
||||||
var allRooms = DeviceManager.AllDevices.Where(d =>
|
var allRooms = DeviceManager.AllDevices.Where(d =>
|
||||||
d is EssentialsHuddleSpaceRoom && !(d as EssentialsHuddleSpaceRoom).ExcludeFromGlobalFunctions);
|
d is IEssentialsRoom && !(d as IEssentialsHuddleSpaceRoom).ExcludeFromGlobalFunctions);
|
||||||
foreach (var room in allRooms)
|
foreach (var room in allRooms)
|
||||||
(room as EssentialsHuddleSpaceRoom).RunRouteAction("roomOff");
|
(room as IEssentialsHuddleSpaceRoom).RunRouteAction("roomOff");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Setup the external sources for the Cisco Touch 10 devices that support IHasExternalSourceSwitch
|
||||||
|
/// </summary>
|
||||||
|
private void SetCodecExternalSources()
|
||||||
|
{
|
||||||
|
var videoCodecWithExternalSwitching = VideoCodec as IHasExternalSourceSwitching;
|
||||||
|
|
||||||
|
if (videoCodecWithExternalSwitching == null || !videoCodecWithExternalSwitching.ExternalSourceListEnabled)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Get the tie line that the external switcher is connected to
|
||||||
|
string codecInputConnectorName = ConfigReader.ConfigObject.TieLines.SingleOrDefault(
|
||||||
|
x => x.DestinationKey == VideoCodec.Key && x.DestinationPort == videoCodecWithExternalSwitching.ExternalSourceInputPort).DestinationPort;
|
||||||
|
|
||||||
|
videoCodecWithExternalSwitching.ClearExternalSources();
|
||||||
|
videoCodecWithExternalSwitching.RunRouteAction = RunRouteActionCodec;
|
||||||
|
var srcList = ConfigReader.ConfigObject.SourceLists.SingleOrDefault(x => x.Key == SourceListKey).Value.OrderBy(kv => kv.Value.Order); ;
|
||||||
|
|
||||||
|
foreach (var kvp in srcList)
|
||||||
|
{
|
||||||
|
var srcConfig = kvp.Value;
|
||||||
|
|
||||||
|
if (kvp.Key != DefaultCodecRouteString && kvp.Key != "roomOff")
|
||||||
|
{
|
||||||
|
videoCodecWithExternalSwitching.AddExternalSource(codecInputConnectorName, kvp.Key, srcConfig.PreferredName, PepperDash.Essentials.Devices.Common.VideoCodec.Cisco.eExternalSourceType.desktop);
|
||||||
|
videoCodecWithExternalSwitching.SetExternalSourceState(kvp.Key, PepperDash.Essentials.Devices.Common.VideoCodec.Cisco.eExternalSourceMode.Ready);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Debug.Console(2, this, "Error setting codec external sources: {0}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetCodecBranding()
|
||||||
|
{
|
||||||
|
var vcWithBranding = VideoCodec as IHasBranding;
|
||||||
|
|
||||||
|
if (vcWithBranding == null) return;
|
||||||
|
|
||||||
|
Debug.Console(1, this, "Setting Codec Branding");
|
||||||
|
vcWithBranding.InitializeBranding(Key);
|
||||||
|
}
|
||||||
|
|
||||||
#region IPrivacy Members
|
#region IPrivacy Members
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
517
PepperDashEssentials/Room/Types/EssentialsTechRoom.cs
Normal file
517
PepperDashEssentials/Room/Types/EssentialsTechRoom.cs
Normal file
@@ -0,0 +1,517 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using Crestron.SimplSharp;
|
||||||
|
using Crestron.SimplSharp.Scheduler;
|
||||||
|
using Crestron.SimplSharpPro.DeviceSupport;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
using PepperDash.Core;
|
||||||
|
using PepperDash.Essentials.Core;
|
||||||
|
using PepperDash.Essentials.Core.Bridges;
|
||||||
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
||||||
|
using PepperDash.Essentials.Core.Presets;
|
||||||
|
using PepperDash.Essentials.Devices.Common;
|
||||||
|
using PepperDash.Essentials.Room.Config;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials
|
||||||
|
{
|
||||||
|
public class EssentialsTechRoom : EssentialsRoomBase, ITvPresetsProvider, IBridgeAdvanced, IRunDirectRouteAction
|
||||||
|
{
|
||||||
|
private readonly EssentialsTechRoomConfig _config;
|
||||||
|
private readonly Dictionary<string, TwoWayDisplayBase> _displays;
|
||||||
|
|
||||||
|
private readonly DevicePresetsModel _tunerPresets;
|
||||||
|
private readonly Dictionary<string, IRSetTopBoxBase> _tuners;
|
||||||
|
|
||||||
|
private Dictionary<string, string> _currentPresets;
|
||||||
|
private ScheduledEventGroup _roomScheduledEventGroup;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
protected override Func<bool> IsWarmingFeedbackFunc
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return () =>
|
||||||
|
{
|
||||||
|
return _displays.All(kv => kv.Value.IsWarmingUpFeedback.BoolValue);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
protected override Func<bool> IsCoolingFeedbackFunc
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return () =>
|
||||||
|
{
|
||||||
|
return _displays.All(kv => kv.Value.IsCoolingDownFeedback.BoolValue);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public EssentialsTechRoom(DeviceConfig config) : base(config)
|
||||||
|
{
|
||||||
|
_config = config.Properties.ToObject<EssentialsTechRoomConfig>();
|
||||||
|
|
||||||
|
_tunerPresets = new DevicePresetsModel(String.Format("{0}-presets", config.Key), _config.PresetsFileName);
|
||||||
|
|
||||||
|
_tunerPresets.SetFileName(_config.PresetsFileName);
|
||||||
|
|
||||||
|
_tunerPresets.PresetRecalled += TunerPresetsOnPresetRecalled;
|
||||||
|
|
||||||
|
_tuners = GetDevices<IRSetTopBoxBase>(_config.Tuners);
|
||||||
|
_displays = GetDevices<TwoWayDisplayBase>(_config.Displays);
|
||||||
|
|
||||||
|
RoomPowerIsOnFeedback = new BoolFeedback(() => RoomPowerIsOn);
|
||||||
|
|
||||||
|
SetUpTunerPresetsFeedback();
|
||||||
|
|
||||||
|
SubscribeToDisplayFeedbacks();
|
||||||
|
|
||||||
|
CreateOrUpdateScheduledEvents();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Dictionary<string, StringFeedback> CurrentPresetsFeedbacks { get; private set; }
|
||||||
|
|
||||||
|
public Dictionary<string, IRSetTopBoxBase> Tuners
|
||||||
|
{
|
||||||
|
get { return _tuners; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public Dictionary<string, TwoWayDisplayBase> Displays
|
||||||
|
{
|
||||||
|
get { return _displays; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public BoolFeedback RoomPowerIsOnFeedback { get; private set; }
|
||||||
|
|
||||||
|
public bool RoomPowerIsOn
|
||||||
|
{
|
||||||
|
get { return _displays.All(kv => kv.Value.PowerIsOnFeedback.BoolValue); }
|
||||||
|
}
|
||||||
|
|
||||||
|
#region ITvPresetsProvider Members
|
||||||
|
|
||||||
|
public DevicePresetsModel TvPresets
|
||||||
|
{
|
||||||
|
get { return _tunerPresets; }
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private void TunerPresetsOnPresetRecalled(ISetTopBoxNumericKeypad device, string channel)
|
||||||
|
{
|
||||||
|
//Debug.Console(2, this, "TunerPresetsOnPresetRecalled");
|
||||||
|
|
||||||
|
if (!_currentPresets.ContainsKey(device.Key))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Debug.Console(2, this, "Tuner Key: {0} Channel: {1}", device.Key, channel);
|
||||||
|
|
||||||
|
_currentPresets[device.Key] = channel;
|
||||||
|
|
||||||
|
if (CurrentPresetsFeedbacks.ContainsKey(device.Key))
|
||||||
|
{
|
||||||
|
CurrentPresetsFeedbacks[device.Key].FireUpdate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetUpTunerPresetsFeedback()
|
||||||
|
{
|
||||||
|
_currentPresets = new Dictionary<string, string>();
|
||||||
|
CurrentPresetsFeedbacks = new Dictionary<string, StringFeedback>();
|
||||||
|
|
||||||
|
foreach (var setTopBox in _tuners)
|
||||||
|
{
|
||||||
|
var tuner = setTopBox.Value;
|
||||||
|
_currentPresets.Add(tuner.Key, String.Empty);
|
||||||
|
CurrentPresetsFeedbacks.Add(tuner.Key, new StringFeedback(() => _currentPresets[tuner.Key]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SubscribeToDisplayFeedbacks()
|
||||||
|
{
|
||||||
|
foreach (var display in _displays)
|
||||||
|
{
|
||||||
|
display.Value.PowerIsOnFeedback.OutputChange +=
|
||||||
|
(sender, args) =>
|
||||||
|
{
|
||||||
|
RoomPowerIsOnFeedback.InvokeFireUpdate();
|
||||||
|
IsWarmingUpFeedback.InvokeFireUpdate();
|
||||||
|
IsCoolingDownFeedback.InvokeFireUpdate();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CreateOrUpdateScheduledEvents()
|
||||||
|
{
|
||||||
|
var eventsConfig = _config.ScheduledEvents;
|
||||||
|
|
||||||
|
GetOrCreateScheduleGroup();
|
||||||
|
|
||||||
|
foreach (var eventConfig in eventsConfig)
|
||||||
|
{
|
||||||
|
CreateOrUpdateSingleEvent(eventConfig);
|
||||||
|
}
|
||||||
|
|
||||||
|
_roomScheduledEventGroup.UserGroupCallBack += HandleScheduledEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GetOrCreateScheduleGroup()
|
||||||
|
{
|
||||||
|
if (_roomScheduledEventGroup == null)
|
||||||
|
{
|
||||||
|
_roomScheduledEventGroup = Scheduler.GetEventGroup(Key) ?? new ScheduledEventGroup(Key);
|
||||||
|
|
||||||
|
Scheduler.AddEventGroup(_roomScheduledEventGroup);
|
||||||
|
}
|
||||||
|
|
||||||
|
_roomScheduledEventGroup.RetrieveAllEvents();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CreateOrUpdateSingleEvent(ScheduledEventConfig scheduledEvent)
|
||||||
|
{
|
||||||
|
if (!_roomScheduledEventGroup.ScheduledEvents.ContainsKey(scheduledEvent.Key))
|
||||||
|
{
|
||||||
|
SchedulerUtilities.CreateEventFromConfig(scheduledEvent, _roomScheduledEventGroup, HandleScheduledEvent);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var roomEvent = _roomScheduledEventGroup.ScheduledEvents[scheduledEvent.Key];
|
||||||
|
|
||||||
|
//if (SchedulerUtilities.CheckEventTimeForMatch(roomEvent, DateTime.Parse(scheduledEvent.Time)) &&
|
||||||
|
// SchedulerUtilities.CheckEventRecurrenceForMatch(roomEvent, scheduledEvent.Days))
|
||||||
|
//{
|
||||||
|
// Debug.Console(1, this, "Existing event matches new event properties. Nothing to update");
|
||||||
|
// return;
|
||||||
|
//}
|
||||||
|
|
||||||
|
Debug.Console(1, this,
|
||||||
|
"Existing event does not match new config properties. Deleting existing event '{0}' and creating new event from configuration",
|
||||||
|
roomEvent.Name);
|
||||||
|
|
||||||
|
_roomScheduledEventGroup.DeleteEvent(roomEvent);
|
||||||
|
|
||||||
|
SchedulerUtilities.CreateEventFromConfig(scheduledEvent, _roomScheduledEventGroup, HandleScheduledEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddOrUpdateScheduledEvent(ScheduledEventConfig scheduledEvent)
|
||||||
|
{
|
||||||
|
//update config based on key of scheduleEvent
|
||||||
|
GetOrCreateScheduleGroup();
|
||||||
|
var existingEventIndex = _config.ScheduledEvents.FindIndex((e) => e.Key == scheduledEvent.Key);
|
||||||
|
|
||||||
|
if (existingEventIndex < 0)
|
||||||
|
{
|
||||||
|
_config.ScheduledEvents.Add(scheduledEvent);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_config.ScheduledEvents[existingEventIndex] = scheduledEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
//create or update event based on config
|
||||||
|
CreateOrUpdateSingleEvent(scheduledEvent);
|
||||||
|
//save config
|
||||||
|
Config.Properties = JToken.FromObject(_config);
|
||||||
|
|
||||||
|
CustomSetConfig(Config);
|
||||||
|
//Fire Event
|
||||||
|
OnScheduledEventUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ScheduledEventConfig> GetScheduledEvents()
|
||||||
|
{
|
||||||
|
return _config.ScheduledEvents ?? new List<ScheduledEventConfig>();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnScheduledEventUpdate()
|
||||||
|
{
|
||||||
|
var handler = ScheduledEventsChanged;
|
||||||
|
|
||||||
|
if (handler == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
handler(this, new ScheduledEventEventArgs {ScheduledEvents = _config.ScheduledEvents});
|
||||||
|
}
|
||||||
|
|
||||||
|
public event EventHandler<ScheduledEventEventArgs> ScheduledEventsChanged;
|
||||||
|
|
||||||
|
private void HandleScheduledEvent(ScheduledEvent schevent, ScheduledEventCommon.eCallbackReason type)
|
||||||
|
{
|
||||||
|
var eventConfig = _config.ScheduledEvents.FirstOrDefault(e => e.Key == schevent.Name);
|
||||||
|
|
||||||
|
if (eventConfig == null)
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Event with name {0} not found", schevent.Name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.Console(1, this, "Running actions for event {0}", schevent.Name);
|
||||||
|
|
||||||
|
if (eventConfig.Acknowledgeable)
|
||||||
|
{
|
||||||
|
schevent.Acknowledge();
|
||||||
|
}
|
||||||
|
|
||||||
|
CrestronInvoke.BeginInvoke((o) =>
|
||||||
|
{
|
||||||
|
Debug.Console(2, this, "There are {0} actions to execute for this event.", eventConfig.Actions.Count);
|
||||||
|
|
||||||
|
foreach (var a in eventConfig.Actions)
|
||||||
|
{
|
||||||
|
Debug.Console(2, this,
|
||||||
|
@"Attempting to run action:
|
||||||
|
DeviceKey: {0}
|
||||||
|
MethodName: {1}
|
||||||
|
Params: {2}"
|
||||||
|
, a.DeviceKey, a.MethodName, a.Params);
|
||||||
|
DeviceJsonApi.DoDeviceAction(a);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void RoomPowerOn()
|
||||||
|
{
|
||||||
|
Debug.Console(2, this, "Room Powering On");
|
||||||
|
|
||||||
|
var dummySource = DeviceManager.GetDeviceForKey(_config.DummySourceKey) as IRoutingOutputs;
|
||||||
|
|
||||||
|
if (dummySource == null)
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Unable to get source with key: {0}", _config.DummySourceKey);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var display in _displays)
|
||||||
|
{
|
||||||
|
RunDirectRoute(dummySource, display.Value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RoomPowerOff()
|
||||||
|
{
|
||||||
|
Debug.Console(2, this, "Room Powering Off");
|
||||||
|
|
||||||
|
foreach (var display in _displays)
|
||||||
|
{
|
||||||
|
display.Value.PowerOff();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Dictionary<string, T> GetDevices<T>(ICollection<string> config) where T : IKeyed
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var returnValue = DeviceManager.AllDevices.OfType<T>()
|
||||||
|
.Where(d => config.Contains(d.Key))
|
||||||
|
.ToDictionary(d => d.Key, d => d);
|
||||||
|
|
||||||
|
return returnValue;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
Debug.Console(0, this, Debug.ErrorLogLevel.Error,
|
||||||
|
"Error getting devices. Check Essentials Configuration");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Overrides of EssentialsRoomBase
|
||||||
|
|
||||||
|
protected override Func<bool> OnFeedbackFunc
|
||||||
|
{
|
||||||
|
get { return () => RoomPowerIsOn; }
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void EndShutdown()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void SetDefaultLevels()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void PowerOnToDefaultOrLastSource()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool RunDefaultPresentRoute()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void RoomVacatedForTimeoutPeriod(object o)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Implementation of IBridgeAdvanced
|
||||||
|
|
||||||
|
public void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
||||||
|
{
|
||||||
|
|
||||||
|
var joinMap = new EssentialsTechRoomJoinMap(joinStart);
|
||||||
|
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
||||||
|
|
||||||
|
if (!String.IsNullOrEmpty(joinMapSerialized))
|
||||||
|
{
|
||||||
|
joinMap = JsonConvert.DeserializeObject<EssentialsTechRoomJoinMap>(joinMapSerialized);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bridge != null)
|
||||||
|
{
|
||||||
|
bridge.AddJoinMap(Key, joinMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_config.IsPrimary)
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Linking Primary system Tuner Preset Mirroring");
|
||||||
|
if (_config.MirroredTuners != null && _config.MirroredTuners.Count > 0)
|
||||||
|
{
|
||||||
|
foreach (var tuner in _config.MirroredTuners)
|
||||||
|
{
|
||||||
|
var f = CurrentPresetsFeedbacks[tuner.Value];
|
||||||
|
|
||||||
|
if (f == null)
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Unable to find feedback with key: {0}", tuner.Value);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var join = joinMap.CurrentPreset.JoinNumber + tuner.Key;
|
||||||
|
f.LinkInputSig(trilist.StringInput[(uint)(join)]);
|
||||||
|
Debug.Console(1, this, "Linked Current Preset feedback for tuner: {0} to serial join: {1}", tuner.Value, join);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//i = 0;
|
||||||
|
//foreach (var feedback in CurrentPresetsFeedbacks)
|
||||||
|
//{
|
||||||
|
// feedback.Value.LinkInputSig(trilist.StringInput[(uint) (joinMap.CurrentPreset.JoinNumber + i)]);
|
||||||
|
// i++;
|
||||||
|
//}
|
||||||
|
|
||||||
|
trilist.OnlineStatusChange += (device, args) =>
|
||||||
|
{
|
||||||
|
if (!args.DeviceOnLine)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var feedback in CurrentPresetsFeedbacks)
|
||||||
|
{
|
||||||
|
feedback.Value.FireUpdate();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Linking Secondary system Tuner Preset Mirroring");
|
||||||
|
|
||||||
|
if (_config.MirroredTuners != null && _config.MirroredTuners.Count > 0)
|
||||||
|
{
|
||||||
|
foreach (var tuner in _config.MirroredTuners)
|
||||||
|
{
|
||||||
|
var t = _tuners[tuner.Value];
|
||||||
|
|
||||||
|
if (t == null)
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Unable to find tuner with key: {0}", tuner.Value);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var join = joinMap.CurrentPreset.JoinNumber + tuner.Key;
|
||||||
|
trilist.SetStringSigAction(join, s => _tunerPresets.Dial(s, t));
|
||||||
|
Debug.Console(1, this, "Linked preset recall action for tuner: {0} to serial join: {1}", tuner.Value, join);
|
||||||
|
}
|
||||||
|
|
||||||
|
//foreach (var setTopBox in _tuners)
|
||||||
|
//{
|
||||||
|
// var tuner = setTopBox;
|
||||||
|
|
||||||
|
// trilist.SetStringSigAction(joinMap.CurrentPreset.JoinNumber + i, s => _tunerPresets.Dial(s, tuner.Value));
|
||||||
|
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private class EssentialsTechRoomJoinMap : JoinMapBaseAdvanced
|
||||||
|
{
|
||||||
|
[JoinName("currentPreset")]
|
||||||
|
public JoinDataComplete CurrentPreset = new JoinDataComplete(new JoinData {JoinNumber = 1, JoinSpan = 16},
|
||||||
|
new JoinMetadata {Description = "Current Tuner Preset", JoinType = eJoinType.Serial});
|
||||||
|
|
||||||
|
public EssentialsTechRoomJoinMap(uint joinStart) : base(joinStart, typeof(EssentialsTechRoomJoinMap))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#region IRunDirectRouteAction Members
|
||||||
|
|
||||||
|
private void RunDirectRoute(IRoutingOutputs source, IRoutingSink dest)
|
||||||
|
{
|
||||||
|
if (dest == null)
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Cannot route, unknown destination '{0}'", dest.Key);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (source == null)
|
||||||
|
{
|
||||||
|
dest.ReleaseRoute();
|
||||||
|
if (dest is IHasPowerControl)
|
||||||
|
(dest as IHasPowerControl).PowerOff();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dest.ReleaseAndMakeRoute(source, eRoutingSignalType.Video);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Attempts to route directly between a source and destination
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sourceKey"></param>
|
||||||
|
/// <param name="destinationKey"></param>
|
||||||
|
public void RunDirectRoute(string sourceKey, string destinationKey)
|
||||||
|
{
|
||||||
|
IRoutingSink dest = null;
|
||||||
|
|
||||||
|
dest = DeviceManager.GetDeviceForKey(destinationKey) as IRoutingSink;
|
||||||
|
|
||||||
|
var source = DeviceManager.GetDeviceForKey(sourceKey) as IRoutingOutputs;
|
||||||
|
|
||||||
|
if (source == null || dest == null)
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Cannot route unknown source or destination '{0}' to {1}", sourceKey, destinationKey);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
RunDirectRoute(source, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ScheduledEventEventArgs : EventArgs
|
||||||
|
{
|
||||||
|
public List<ScheduledEventConfig> ScheduledEvents;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using Crestron.SimplSharp;
|
||||||
|
|
||||||
|
using PepperDash.Essentials.Core;
|
||||||
|
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
||||||
|
using PepperDash.Essentials.Room.Config;
|
||||||
|
using PepperDash.Essentials.Core.Devices;
|
||||||
|
using PepperDash.Essentials.Devices.Common.Codec;
|
||||||
|
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
||||||
|
using PepperDash.Essentials.Devices.Common.AudioCodec;
|
||||||
|
|
||||||
|
|
||||||
|
using PepperDash.Core;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials
|
||||||
|
{
|
||||||
|
public interface IEssentialsHuddleSpaceRoom : IEssentialsRoom, IHasCurrentSourceInfoChange, IRunRouteAction, IHasDefaultDisplay
|
||||||
|
{
|
||||||
|
bool ExcludeFromGlobalFunctions { get; }
|
||||||
|
|
||||||
|
void RunRouteAction(string routeKey);
|
||||||
|
|
||||||
|
EssentialsHuddleRoomPropertiesConfig PropertiesConfig { get; }
|
||||||
|
|
||||||
|
IBasicVolumeControls CurrentVolumeControls { get; }
|
||||||
|
|
||||||
|
event EventHandler<VolumeDeviceChangeEventArgs> CurrentVolumeDeviceChange;
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IEssentialsHuddleVtc1Room : IEssentialsRoom, IHasCurrentSourceInfoChange,
|
||||||
|
IHasCurrentVolumeControls, IRunRouteAction, IRunDefaultCallRoute, IHasVideoCodec, IHasAudioCodec, IHasDefaultDisplay
|
||||||
|
{
|
||||||
|
EssentialsHuddleVtc1PropertiesConfig PropertiesConfig { get; }
|
||||||
|
|
||||||
|
void RunRouteAction(string routeKey);
|
||||||
|
|
||||||
|
IHasScheduleAwareness ScheduleSource { get; }
|
||||||
|
|
||||||
|
string DefaultCodecRouteString { get; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -79,6 +79,16 @@ namespace PepperDash.Essentials
|
|||||||
Panel = new Tsw1052(id, Global.ControlSystem);
|
Panel = new Tsw1052(id, Global.ControlSystem);
|
||||||
else if (type == "tsw1060")
|
else if (type == "tsw1060")
|
||||||
Panel = new Tsw1060(id, Global.ControlSystem);
|
Panel = new Tsw1060(id, Global.ControlSystem);
|
||||||
|
else if (type == "tsw570")
|
||||||
|
Panel = new Tsw570(id, Global.ControlSystem);
|
||||||
|
else if (type == "tsw770")
|
||||||
|
Panel = new Tsw770(id, Global.ControlSystem);
|
||||||
|
else if (type == "ts770")
|
||||||
|
Panel = new Ts770(id, Global.ControlSystem);
|
||||||
|
else if (type == "tsw1070")
|
||||||
|
Panel = new Tsw1070(id, Global.ControlSystem);
|
||||||
|
else if (type == "ts1070")
|
||||||
|
Panel = new Ts1070(id, Global.ControlSystem);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "WARNING: Cannot create TSW controller with type '{0}'", type);
|
Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "WARNING: Cannot create TSW controller with type '{0}'", type);
|
||||||
@@ -203,7 +213,7 @@ namespace PepperDash.Essentials
|
|||||||
{
|
{
|
||||||
public EssentialsTouchpanelControllerFactory()
|
public EssentialsTouchpanelControllerFactory()
|
||||||
{
|
{
|
||||||
TypeNames = new List<string>() { "tsw550", "tsw750", "tsw1050", "tsw560", "tsw760", "tsw1060", "xpanel" };
|
TypeNames = new List<string>() { "crestronapp", "tsw550", "tsw750", "tsw1050", "tsw560", "tsw760", "tsw1060", "tsw570", "tsw770", "ts770", "tsw1070", "ts1070", "xpanel" };
|
||||||
}
|
}
|
||||||
|
|
||||||
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
||||||
@@ -222,8 +232,10 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
// spin up different room drivers depending on room type
|
// spin up different room drivers depending on room type
|
||||||
var room = DeviceManager.GetDeviceForKey(props.DefaultRoomKey);
|
var room = DeviceManager.GetDeviceForKey(props.DefaultRoomKey);
|
||||||
if (room is EssentialsHuddleSpaceRoom)
|
if (room is IEssentialsHuddleSpaceRoom)
|
||||||
{
|
{
|
||||||
|
// Screen Saver Driver
|
||||||
|
mainDriver.ScreenSaverController = new ScreenSaverController(mainDriver, props);
|
||||||
|
|
||||||
// Header Driver
|
// Header Driver
|
||||||
Debug.Console(0, panelController, "Adding header driver");
|
Debug.Console(0, panelController, "Adding header driver");
|
||||||
@@ -234,7 +246,7 @@ namespace PepperDash.Essentials
|
|||||||
var avDriver = new EssentialsHuddlePanelAvFunctionsDriver(mainDriver, props);
|
var avDriver = new EssentialsHuddlePanelAvFunctionsDriver(mainDriver, props);
|
||||||
avDriver.DefaultRoomKey = props.DefaultRoomKey;
|
avDriver.DefaultRoomKey = props.DefaultRoomKey;
|
||||||
mainDriver.AvDriver = avDriver;
|
mainDriver.AvDriver = avDriver;
|
||||||
avDriver.CurrentRoom = room as EssentialsHuddleSpaceRoom;
|
avDriver.CurrentRoom = room as IEssentialsHuddleSpaceRoom;
|
||||||
|
|
||||||
// Environment Driver
|
// Environment Driver
|
||||||
if (avDriver.CurrentRoom.PropertiesConfig.Environment != null && avDriver.CurrentRoom.PropertiesConfig.Environment.DeviceKeys.Count > 0)
|
if (avDriver.CurrentRoom.PropertiesConfig.Environment != null && avDriver.CurrentRoom.PropertiesConfig.Environment.DeviceKeys.Count > 0)
|
||||||
@@ -268,10 +280,13 @@ namespace PepperDash.Essentials
|
|||||||
tsw.Down.UserObject = new Action<bool>(avDriver.VolumeDownPress);
|
tsw.Down.UserObject = new Action<bool>(avDriver.VolumeDownPress);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (room is EssentialsHuddleVtc1Room)
|
else if (room is IEssentialsHuddleVtc1Room)
|
||||||
{
|
{
|
||||||
Debug.Console(0, panelController, "Adding huddle space VTC AV driver");
|
Debug.Console(0, panelController, "Adding huddle space VTC AV driver");
|
||||||
|
|
||||||
|
// Screen Saver Driver
|
||||||
|
mainDriver.ScreenSaverController = new ScreenSaverController(mainDriver, props);
|
||||||
|
|
||||||
// Header Driver
|
// Header Driver
|
||||||
mainDriver.HeaderDriver = new EssentialsHeaderDriver(mainDriver, props);
|
mainDriver.HeaderDriver = new EssentialsHeaderDriver(mainDriver, props);
|
||||||
|
|
||||||
@@ -279,11 +294,11 @@ namespace PepperDash.Essentials
|
|||||||
var avDriver = new EssentialsHuddleVtc1PanelAvFunctionsDriver(mainDriver, props);
|
var avDriver = new EssentialsHuddleVtc1PanelAvFunctionsDriver(mainDriver, props);
|
||||||
|
|
||||||
var codecDriver = new PepperDash.Essentials.UIDrivers.VC.EssentialsVideoCodecUiDriver(panelController.Panel, avDriver,
|
var codecDriver = new PepperDash.Essentials.UIDrivers.VC.EssentialsVideoCodecUiDriver(panelController.Panel, avDriver,
|
||||||
(room as EssentialsHuddleVtc1Room).VideoCodec, mainDriver.HeaderDriver);
|
(room as IEssentialsHuddleVtc1Room).VideoCodec, mainDriver.HeaderDriver);
|
||||||
avDriver.SetVideoCodecDriver(codecDriver);
|
avDriver.SetVideoCodecDriver(codecDriver);
|
||||||
avDriver.DefaultRoomKey = props.DefaultRoomKey;
|
avDriver.DefaultRoomKey = props.DefaultRoomKey;
|
||||||
mainDriver.AvDriver = avDriver;
|
mainDriver.AvDriver = avDriver;
|
||||||
avDriver.CurrentRoom = room as EssentialsHuddleVtc1Room;
|
avDriver.CurrentRoom = room as IEssentialsHuddleVtc1Room;
|
||||||
|
|
||||||
// Environment Driver
|
// Environment Driver
|
||||||
if (avDriver.CurrentRoom.PropertiesConfig.Environment != null && avDriver.CurrentRoom.PropertiesConfig.Environment.DeviceKeys.Count > 0)
|
if (avDriver.CurrentRoom.PropertiesConfig.Environment != null && avDriver.CurrentRoom.PropertiesConfig.Environment.DeviceKeys.Count > 0)
|
||||||
|
|||||||
@@ -1,13 +1,10 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
using Crestron.SimplSharp.CrestronIO;
|
using Crestron.SimplSharp.CrestronIO;
|
||||||
using Crestron.SimplSharp.Net.Http;
|
using Crestron.SimplSharp.Net.Http;
|
||||||
|
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials
|
namespace PepperDash.Essentials
|
||||||
{
|
{
|
||||||
@@ -16,12 +13,12 @@ namespace PepperDash.Essentials
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
HttpServer Server;
|
readonly HttpServer _server;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
string FileDirectory;
|
readonly string _fileDirectory;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
@@ -45,18 +42,17 @@ namespace PepperDash.Essentials
|
|||||||
//{ ".js", "application/javascript" },
|
//{ ".js", "application/javascript" },
|
||||||
//{ ".json", "application/json" },
|
//{ ".json", "application/json" },
|
||||||
//{ ".map", "application/x-navimap" },
|
//{ ".map", "application/x-navimap" },
|
||||||
{ ".pdf", "application.pdf" },
|
{ ".pdf", "application/pdf" },
|
||||||
{ ".png", "image/png" },
|
{ ".png", "image/png" },
|
||||||
//{ ".txt", "text/plain" },
|
//{ ".txt", "text/plain" },
|
||||||
};
|
};
|
||||||
|
|
||||||
Server = new HttpServer();
|
_server = new HttpServer {Port = port};
|
||||||
Server.Port = port;
|
_fileDirectory = directory;
|
||||||
FileDirectory = directory;
|
_server.OnHttpRequest += Server_OnHttpRequest;
|
||||||
Server.OnHttpRequest += new OnHttpRequestHandler(Server_OnHttpRequest);
|
_server.Open();
|
||||||
Server.Open();
|
|
||||||
|
|
||||||
CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
|
CrestronEnvironment.ProgramStatusEventHandler += CrestronEnvironment_ProgramStatusEventHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -67,27 +63,40 @@ namespace PepperDash.Essentials
|
|||||||
var path = args.Request.Path;
|
var path = args.Request.Path;
|
||||||
Debug.Console(2, "HTTP Request with path: '{0}'", args.Request.Path);
|
Debug.Console(2, "HTTP Request with path: '{0}'", args.Request.Path);
|
||||||
|
|
||||||
if (File.Exists(FileDirectory + path))
|
try
|
||||||
{
|
{
|
||||||
string filePath = path.Replace('/', '\\');
|
if (File.Exists(_fileDirectory + path))
|
||||||
string localPath = string.Format(@"{0}{1}", FileDirectory, filePath);
|
|
||||||
|
|
||||||
Debug.Console(2, "HTTP Logo Server attempting to find file: '{0}'", localPath);
|
|
||||||
if (File.Exists(localPath))
|
|
||||||
{
|
{
|
||||||
args.Response.Header.ContentType = GetContentType(new FileInfo(localPath).Extension);
|
var filePath = path.Replace('/', '\\');
|
||||||
args.Response.ContentStream = new FileStream(localPath, FileMode.Open, FileAccess.Read);
|
var localPath = string.Format(@"{0}{1}", _fileDirectory, filePath);
|
||||||
|
|
||||||
|
Debug.Console(2, "HTTP Logo Server attempting to find file: '{0}'", localPath);
|
||||||
|
if (File.Exists(localPath))
|
||||||
|
{
|
||||||
|
args.Response.Header.ContentType = GetContentType(new FileInfo(localPath).Extension);
|
||||||
|
args.Response.ContentStream = new FileStream(localPath, FileMode.Open, FileAccess.Read);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Console(2, "HTTP Logo Server Cannot find file '{0}'", localPath);
|
||||||
|
args.Response.ContentString = string.Format("Not found: '{0}'", filePath);
|
||||||
|
args.Response.Code = 404;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Debug.Console(2, "HTTP Logo Server Cannot find file '{0}'", localPath);
|
Debug.Console(2, "HTTP Logo Server: '{0}' does not exist", _fileDirectory + path);
|
||||||
args.Response.ContentString = string.Format("Not found: '{0}'", filePath);
|
args.Response.ContentString = string.Format("Not found: '{0}'", _fileDirectory + path);
|
||||||
args.Response.Code = 404;
|
args.Response.Code = 404;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Debug.Console(2, "HTTP Logo Server: '{0}' does not exist", FileDirectory + path);
|
Debug.Console(0, Debug.ErrorLogLevel.Error, "Exception getting file: {0}", ex.Message);
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Error, "Stack Trace: {0}", ex.StackTrace);
|
||||||
|
|
||||||
|
args.Response.Code = 400;
|
||||||
|
args.Response.ContentString = string.Format("invalid request");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -97,7 +106,7 @@ namespace PepperDash.Essentials
|
|||||||
void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType)
|
void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType)
|
||||||
{
|
{
|
||||||
if (programEventType == eProgramStatusEventType.Stopping)
|
if (programEventType == eProgramStatusEventType.Stopping)
|
||||||
Server.Close();
|
_server.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -107,11 +116,7 @@ namespace PepperDash.Essentials
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static string GetContentType(string extension)
|
public static string GetContentType(string extension)
|
||||||
{
|
{
|
||||||
string type;
|
var type = ExtensionContentTypes.ContainsKey(extension) ? ExtensionContentTypes[extension] : "text/plain";
|
||||||
if (ExtensionContentTypes.ContainsKey(extension))
|
|
||||||
type = ExtensionContentTypes[extension];
|
|
||||||
else
|
|
||||||
type = "text/plain";
|
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -33,6 +33,21 @@
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public const uint VCLayoutsList = 1205;
|
public const uint VCLayoutsList = 1205;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 1206 VC Camera Mode horizontal list
|
||||||
|
/// </summary>
|
||||||
|
public const uint VCCameraMode = 1206;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 1207 VC Camera Mode Dpad
|
||||||
|
/// </summary>
|
||||||
|
public const uint VCCameraDpad = 1207;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 1208 VC Camera Select
|
||||||
|
/// </summary>
|
||||||
|
public const uint VCCameraSelect = 1208;
|
||||||
|
|
||||||
|
|
||||||
//******************************************************
|
//******************************************************
|
||||||
// General
|
// General
|
||||||
|
|||||||
@@ -27,6 +27,33 @@ namespace PepperDash.Essentials
|
|||||||
/// 1004
|
/// 1004
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const uint CallSharedSourceNameText = 1004;
|
public const uint CallSharedSourceNameText = 1004;
|
||||||
|
/// <summary>
|
||||||
|
/// 1005
|
||||||
|
/// </summary>
|
||||||
|
public const uint MeetingIdText = 1005;
|
||||||
|
/// <summary>
|
||||||
|
/// 1006
|
||||||
|
/// </summary>
|
||||||
|
public const uint MeetingHostText = 1006;
|
||||||
|
/// <summary>
|
||||||
|
/// 1007
|
||||||
|
/// </summary>
|
||||||
|
public const uint MeetingPasswordText = 1007;
|
||||||
|
/// <summary>
|
||||||
|
/// 1008
|
||||||
|
/// </summary>
|
||||||
|
public const uint MeetingLeaveText = 1008;
|
||||||
|
/// <summary>
|
||||||
|
/// 1009
|
||||||
|
/// </summary>
|
||||||
|
public const uint MeetingNameText = 1009;
|
||||||
|
|
||||||
|
///<summary>
|
||||||
|
/// 1240 - Used to determine text for meeting start button
|
||||||
|
///</summary>
|
||||||
|
public const uint MeetingStartButtonText = 1240;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -41,6 +68,21 @@ namespace PepperDash.Essentials
|
|||||||
public const uint VCRecentListTimeTextStart = 1231;
|
public const uint VCRecentListTimeTextStart = 1231;
|
||||||
// RANGE IN USE
|
// RANGE IN USE
|
||||||
public const uint VCRecentListTimeTextEnd = 1260;
|
public const uint VCRecentListTimeTextEnd = 1260;
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 1281
|
||||||
|
/// </summary>
|
||||||
|
public const uint VCCameraPresetLabel1 = 1281;
|
||||||
|
/// <summary>
|
||||||
|
/// 1282
|
||||||
|
/// </summary>
|
||||||
|
public const uint VCCameraPresetLabel2 = 1282;
|
||||||
|
/// <summary>
|
||||||
|
/// 1283
|
||||||
|
/// </summary>
|
||||||
|
public const uint VCCameraPresetLabel3 = 1283;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 1291 - the current layout mode
|
/// 1291 - the current layout mode
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -103,6 +145,14 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
//----- through 3120
|
//----- through 3120
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 3201
|
||||||
|
/// </summary>
|
||||||
|
public const uint PasswordPromptMessageText = 3201;
|
||||||
|
/// <summary>
|
||||||
|
/// 3202
|
||||||
|
/// </summary>
|
||||||
|
public const uint PasswordPromptPasswordText = 3202;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 3812
|
/// 3812
|
||||||
@@ -146,6 +196,10 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public const uint RoomPhoneText = 3904;
|
public const uint RoomPhoneText = 3904;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
/// 3905 - Video address/number for room header
|
||||||
|
/// </summary>
|
||||||
|
public const uint RoomVideoAddressText = 3905;
|
||||||
|
/// <summary>
|
||||||
/// 3906 - The separator for verbose-header text on addresses
|
/// 3906 - The separator for verbose-header text on addresses
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const uint RoomAddressPipeText = 3906;
|
public const uint RoomAddressPipeText = 3906;
|
||||||
@@ -154,6 +208,14 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public const uint RoomUserCode = 3907;
|
public const uint RoomUserCode = 3907;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
/// 3908 - The url for the mobile control server
|
||||||
|
/// </summary>
|
||||||
|
public const uint RoomMcUrl = 3908;
|
||||||
|
/// <summary>
|
||||||
|
/// 3909 - The url for the mobile control QR Code image
|
||||||
|
/// </summary>
|
||||||
|
public const uint RoomMcQrCodeUrl = 3909;
|
||||||
|
/// <summary>
|
||||||
/// 3911
|
/// 3911
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const uint PowerOffMessage = 3911;
|
public const uint PowerOffMessage = 3911;
|
||||||
@@ -189,12 +251,19 @@ namespace PepperDash.Essentials
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 3923
|
/// 3923
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const uint LogoUrl = 3923;
|
public const uint LogoUrlLightBkgnd = 3923;
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 3924 - the text on the "call help desk" button
|
/// 3924 - the text on the "call help desk" button
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const uint HelpPageCallButtonText = 3924;
|
public const uint HelpPageCallButtonText = 3924;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 3925
|
||||||
|
/// </summary>
|
||||||
|
public const uint LogoUrlDarkBkgnd = 3925;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 3951
|
/// 3951
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
{
|
{
|
||||||
// Video Codec
|
// Video Codec
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 1234: values 0 = Connect, 1 = End
|
/// 1234: values 0 = Connect, 1 = End, 2 = Start Meeting
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const uint VCStagingConnectButtonMode = 1234;
|
public const uint VCStagingConnectButtonMode = 1234;
|
||||||
|
|
||||||
|
|||||||
@@ -146,18 +146,18 @@
|
|||||||
|
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// void CurrentRoom_CurrentSourceInfoChange(EssentialsRoomBase room, SourceListItem info, ChangeType type)
|
// void CurrentRoom_CurrentSourceInfoChange(IEssentialsRoom room, SourceListItem info, ChangeType type)
|
||||||
// {
|
// {
|
||||||
|
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// void CurrentRoom_CurrentDisplay1SourceChange(EssentialsRoomBase room, SourceListItem info, ChangeType type)
|
// void CurrentRoom_CurrentDisplay1SourceChange(IEssentialsRoom room, SourceListItem info, ChangeType type)
|
||||||
// {
|
// {
|
||||||
// TriList.StringInput[UIStringJoin.Display1SourceLabel].StringValue = PendingSource.PreferredName;
|
// TriList.StringInput[UIStringJoin.Display1SourceLabel].StringValue = PendingSource.PreferredName;
|
||||||
|
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// void CurrentRoom_CurrentDisplay2SourceChange(EssentialsRoomBase room, SourceListItem info, ChangeType type)
|
// void CurrentRoom_CurrentDisplay2SourceChange(IEssentialsRoom room, SourceListItem info, ChangeType type)
|
||||||
// {
|
// {
|
||||||
// TriList.StringInput[UIStringJoin.Display2SourceLabel].StringValue = PendingSource.PreferredName;
|
// TriList.StringInput[UIStringJoin.Display2SourceLabel].StringValue = PendingSource.PreferredName;
|
||||||
// }
|
// }
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ using PepperDash.Core;
|
|||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using PepperDash.Essentials.Core.SmartObjects;
|
using PepperDash.Essentials.Core.SmartObjects;
|
||||||
using PepperDash.Essentials.Core.PageManagers;
|
using PepperDash.Essentials.Core.PageManagers;
|
||||||
|
using PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces;
|
||||||
using PepperDash.Essentials.Room.Config;
|
using PepperDash.Essentials.Room.Config;
|
||||||
using PepperDash.Essentials.Devices.Common.Codec;
|
using PepperDash.Essentials.Devices.Common.Codec;
|
||||||
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
||||||
@@ -52,7 +53,7 @@ namespace PepperDash.Essentials
|
|||||||
CaretInterlock = new JoinedSigInterlock(TriList);
|
CaretInterlock = new JoinedSigInterlock(TriList);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetUpGear(IAVDriver avDriver, EssentialsRoomBase currentRoom)
|
void SetUpGear(IAVDriver avDriver, IEssentialsRoom currentRoom)
|
||||||
{
|
{
|
||||||
// Gear
|
// Gear
|
||||||
TriList.SetString(UIStringJoin.HeaderButtonIcon5, "Gear");
|
TriList.SetString(UIStringJoin.HeaderButtonIcon5, "Gear");
|
||||||
@@ -105,7 +106,7 @@ namespace PepperDash.Essentials
|
|||||||
{
|
{
|
||||||
string message = null;
|
string message = null;
|
||||||
var room = DeviceManager.GetDeviceForKey(Config.DefaultRoomKey)
|
var room = DeviceManager.GetDeviceForKey(Config.DefaultRoomKey)
|
||||||
as EssentialsHuddleSpaceRoom;
|
as IEssentialsHuddleSpaceRoom;
|
||||||
if (room != null)
|
if (room != null)
|
||||||
message = room.PropertiesConfig.HelpMessage;
|
message = room.PropertiesConfig.HelpMessage;
|
||||||
else
|
else
|
||||||
@@ -164,7 +165,7 @@ namespace PepperDash.Essentials
|
|||||||
CallCaretVisible = tempJoin + 10;
|
CallCaretVisible = tempJoin + 10;
|
||||||
TriList.SetSigFalseAction(tempJoin, () =>
|
TriList.SetSigFalseAction(tempJoin, () =>
|
||||||
{
|
{
|
||||||
avDriver.ShowActiveCallsList();
|
avDriver.ShowActiveCallsListOrMeetingInfo();
|
||||||
if(avDriver.CurrentRoom.InCallFeedback.BoolValue)
|
if(avDriver.CurrentRoom.InCallFeedback.BoolValue)
|
||||||
CaretInterlock.ShowInterlocked(CallCaretVisible);
|
CaretInterlock.ShowInterlocked(CallCaretVisible);
|
||||||
});
|
});
|
||||||
@@ -191,26 +192,30 @@ namespace PepperDash.Essentials
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var meetingInfoCodec = codec as IHasMeetingInfo;
|
||||||
|
|
||||||
// Set mode of header button
|
// Set mode of header button
|
||||||
if (!codec.IsInCall)
|
SetHeaderCallIcon(codec);
|
||||||
{
|
|
||||||
HeaderCallButtonIconSig.StringValue = "DND";
|
|
||||||
//HeaderCallButton.SetIcon(HeaderListButton.OnHook);
|
|
||||||
}
|
|
||||||
else if (codec.ActiveCalls.Any(c => c.Type == eCodecCallType.Video))
|
|
||||||
HeaderCallButtonIconSig.StringValue = "Misc-06_Dark";
|
|
||||||
//HeaderCallButton.SetIcon(HeaderListButton.Camera);
|
|
||||||
//TriList.SetUshort(UIUshortJoin.CallHeaderButtonMode, 2);
|
|
||||||
else
|
|
||||||
HeaderCallButtonIconSig.StringValue = "Misc-09_Dark";
|
|
||||||
//HeaderCallButton.SetIcon(HeaderListButton.Phone);
|
|
||||||
//TriList.SetUshort(UIUshortJoin.CallHeaderButtonMode, 1);
|
|
||||||
|
|
||||||
// Set the call status text
|
// Set the call status text
|
||||||
|
Debug.Console(1, "Active Call Count: {0}", codec.ActiveCalls.Count);
|
||||||
|
|
||||||
if (codec.ActiveCalls.Count > 0)
|
if (codec.ActiveCalls.Count > 0)
|
||||||
{
|
{
|
||||||
if (codec.ActiveCalls.Count == 1)
|
if (codec.ActiveCalls.Count == 1 && meetingInfoCodec == null)
|
||||||
TriList.SetString(UIStringJoin.HeaderCallStatusLabel, "1 Active Call");
|
TriList.SetString(UIStringJoin.HeaderCallStatusLabel, "1 Active Call");
|
||||||
|
else if (codec.ActiveCalls.Count == 1 && meetingInfoCodec != null)
|
||||||
|
{
|
||||||
|
var headerCallStatusLabel = meetingInfoCodec.MeetingInfo.IsSharingMeeting
|
||||||
|
? "Sharing-Only Meeting"
|
||||||
|
: "Active Meeting";
|
||||||
|
|
||||||
|
headerCallStatusLabel = meetingInfoCodec.MeetingInfo.WaitingForHost
|
||||||
|
? "Waiting For Host"
|
||||||
|
: headerCallStatusLabel;
|
||||||
|
|
||||||
|
TriList.SetString(UIStringJoin.HeaderCallStatusLabel, headerCallStatusLabel);
|
||||||
|
}
|
||||||
else if (codec.ActiveCalls.Count > 1)
|
else if (codec.ActiveCalls.Count > 1)
|
||||||
TriList.SetString(UIStringJoin.HeaderCallStatusLabel, string.Format("{0} Active Calls", codec.ActiveCalls.Count));
|
TriList.SetString(UIStringJoin.HeaderCallStatusLabel, string.Format("{0} Active Calls", codec.ActiveCalls.Count));
|
||||||
}
|
}
|
||||||
@@ -218,10 +223,31 @@ namespace PepperDash.Essentials
|
|||||||
TriList.SetString(UIStringJoin.HeaderCallStatusLabel, "No Active Calls");
|
TriList.SetString(UIStringJoin.HeaderCallStatusLabel, "No Active Calls");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SetHeaderCallIcon(VideoCodecBase codec)
|
||||||
|
{
|
||||||
|
if (!codec.IsInCall)
|
||||||
|
{
|
||||||
|
HeaderCallButtonIconSig.StringValue = "DND";
|
||||||
|
//HeaderCallButton.SetIcon(HeaderListButton.OnHook);
|
||||||
|
}
|
||||||
|
else if (codec.ActiveCalls.Any(c => c.Type == eCodecCallType.Video))
|
||||||
|
{
|
||||||
|
HeaderCallButtonIconSig.StringValue = "Misc-06_Dark";
|
||||||
|
}
|
||||||
|
//HeaderCallButton.SetIcon(HeaderListButton.Camera);
|
||||||
|
//TriList.SetUshort(UIUshortJoin.CallHeaderButtonMode, 2);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
HeaderCallButtonIconSig.StringValue = "Misc-09_Dark";
|
||||||
|
}
|
||||||
|
//HeaderCallButton.SetIcon(HeaderListButton.Phone);
|
||||||
|
//TriList.SetUshort(UIUshortJoin.CallHeaderButtonMode, 1);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets up Header Buttons for the EssentialsHuddleVtc1Room type
|
/// Sets up Header Buttons for the EssentialsHuddleVtc1Room type
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void SetupHeaderButtons(EssentialsHuddleVtc1PanelAvFunctionsDriver avDriver, EssentialsHuddleVtc1Room currentRoom)
|
public void SetupHeaderButtons(EssentialsHuddleVtc1PanelAvFunctionsDriver avDriver, IEssentialsHuddleVtc1Room currentRoom)
|
||||||
{
|
{
|
||||||
HeaderButtonsAreSetUp = false;
|
HeaderButtonsAreSetUp = false;
|
||||||
|
|
||||||
@@ -255,7 +281,7 @@ namespace PepperDash.Essentials
|
|||||||
TriList.SetSigFalseAction(UIBoolJoin.HeaderCallStatusLabelPress,
|
TriList.SetSigFalseAction(UIBoolJoin.HeaderCallStatusLabelPress,
|
||||||
() =>
|
() =>
|
||||||
{
|
{
|
||||||
avDriver.ShowActiveCallsList();
|
avDriver.ShowActiveCallsListOrMeetingInfo();
|
||||||
if (avDriver.CurrentRoom.InCallFeedback.BoolValue)
|
if (avDriver.CurrentRoom.InCallFeedback.BoolValue)
|
||||||
CaretInterlock.ShowInterlocked(CallCaretVisible);
|
CaretInterlock.ShowInterlocked(CallCaretVisible);
|
||||||
});
|
});
|
||||||
@@ -283,7 +309,7 @@ namespace PepperDash.Essentials
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets up Header Buttons for the EssentialsHuddleSpaceRoom type
|
/// Sets up Header Buttons for the EssentialsHuddleSpaceRoom type
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void SetupHeaderButtons(EssentialsHuddlePanelAvFunctionsDriver avDriver, EssentialsHuddleSpaceRoom currentRoom)
|
public void SetupHeaderButtons(EssentialsHuddlePanelAvFunctionsDriver avDriver, IEssentialsHuddleSpaceRoom currentRoom)
|
||||||
{
|
{
|
||||||
HeaderButtonsAreSetUp = false;
|
HeaderButtonsAreSetUp = false;
|
||||||
|
|
||||||
@@ -349,10 +375,12 @@ namespace PepperDash.Essentials
|
|||||||
// Check if the popup interlock is shown, and if one of the header popups is current, then show the carets subpage
|
// Check if the popup interlock is shown, and if one of the header popups is current, then show the carets subpage
|
||||||
if (e.IsShown)
|
if (e.IsShown)
|
||||||
{
|
{
|
||||||
if (e.NewJoin == Parent.EnvironmentDriver.BackgroundSubpageJoin)
|
if (Parent.EnvironmentDriver != null && e.NewJoin == Parent.EnvironmentDriver.BackgroundSubpageJoin)
|
||||||
headerPopupShown = true;
|
headerPopupShown = true;
|
||||||
else if (e.NewJoin == UIBoolJoin.HeaderActiveCallsListVisible)
|
else if (e.NewJoin == UIBoolJoin.HeaderActiveCallsListVisible)
|
||||||
headerPopupShown = true;
|
headerPopupShown = true;
|
||||||
|
else if (e.NewJoin == UIBoolJoin.HeaderMeetingInfoVisible)
|
||||||
|
headerPopupShown = true;
|
||||||
else if (e.NewJoin == UIBoolJoin.HelpPageVisible)
|
else if (e.NewJoin == UIBoolJoin.HelpPageVisible)
|
||||||
headerPopupShown = true;
|
headerPopupShown = true;
|
||||||
else if (e.NewJoin == UIBoolJoin.MeetingsOrContacMethodsListVisible)
|
else if (e.NewJoin == UIBoolJoin.MeetingsOrContacMethodsListVisible)
|
||||||
|
|||||||
@@ -1,71 +1,139 @@
|
|||||||
using System;
|
using System;
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
using Crestron.SimplSharp;
|
||||||
using Crestron.SimplSharpPro.UI;
|
using Crestron.SimplSharpPro.DeviceSupport;
|
||||||
using PepperDash.Essentials.Core;
|
using Crestron.SimplSharpPro.UI;
|
||||||
using PepperDash.Essentials.Core.SmartObjects;
|
using PepperDash.Core;
|
||||||
|
using PepperDash.Essentials.Core;
|
||||||
namespace PepperDash.Essentials
|
using PepperDash.Essentials.Core.SmartObjects;
|
||||||
{
|
|
||||||
/// <summary>
|
namespace PepperDash.Essentials
|
||||||
///
|
{
|
||||||
/// </summary>
|
/// <summary>
|
||||||
public class EssentialsPanelMainInterfaceDriver : PanelDriverBase
|
///
|
||||||
{
|
/// </summary>
|
||||||
/// <summary>
|
public class EssentialsPanelMainInterfaceDriver : PanelDriverBase, IHasScreenSaverController
|
||||||
/// Assign the appropriate A/V driver.
|
{
|
||||||
/// Want to keep the AvDriver alive, because it may hold states
|
CTimer InactivityTimer;
|
||||||
/// </summary>
|
|
||||||
public IAVDriver AvDriver { get; set; }
|
/// <summary>
|
||||||
|
/// Assign the appropriate A/V driver.
|
||||||
public EssentialsHeaderDriver HeaderDriver { get; set; }
|
/// Want to keep the AvDriver alive, because it may hold states
|
||||||
|
/// </summary>
|
||||||
public EssentialsEnvironmentDriver EnvironmentDriver { get; set; }
|
public IAVDriver AvDriver { get; set;}
|
||||||
|
|
||||||
public PanelDriverBase CurrentChildDriver { get; private set; }
|
public EssentialsHeaderDriver HeaderDriver { get; set; }
|
||||||
|
|
||||||
CrestronTouchpanelPropertiesConfig Config;
|
public EssentialsEnvironmentDriver EnvironmentDriver { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
public PanelDriverBase CurrentChildDriver { get; private set; }
|
||||||
/// The main interlock for popups
|
|
||||||
/// </summary>
|
public ScreenSaverController ScreenSaverController { get; set; }
|
||||||
//public JoinedSigInterlock PopupInterlock { get; private set; }
|
|
||||||
|
private readonly long _timeoutMs;
|
||||||
public EssentialsPanelMainInterfaceDriver(BasicTriListWithSmartObject trilist,
|
|
||||||
CrestronTouchpanelPropertiesConfig config)
|
CrestronTouchpanelPropertiesConfig Config;
|
||||||
: base(trilist)
|
|
||||||
{
|
/// <summary>
|
||||||
Config = config;
|
/// The main interlock for popups
|
||||||
}
|
/// </summary>
|
||||||
|
//public JoinedSigInterlock PopupInterlock { get; private set; }
|
||||||
public override void Show()
|
|
||||||
{
|
public EssentialsPanelMainInterfaceDriver(BasicTriListWithSmartObject trilist,
|
||||||
CurrentChildDriver = null;
|
CrestronTouchpanelPropertiesConfig config)
|
||||||
ShowSubDriver(AvDriver as PanelDriverBase);
|
: base(trilist)
|
||||||
base.Show();
|
{
|
||||||
}
|
Config = config;
|
||||||
|
|
||||||
public override void Hide()
|
_timeoutMs = Config.ScreenSaverTimeoutMin * 60 * 1000;
|
||||||
{
|
|
||||||
TriList.BooleanInput[UIBoolJoin.StartPageVisible].BoolValue = false;
|
var tsx52or60 = trilist as Tswx52ButtonVoiceControl;
|
||||||
base.Hide();
|
|
||||||
}
|
if (tsx52or60 != null)
|
||||||
|
{
|
||||||
void ShowSubDriver(PanelDriverBase driver)
|
tsx52or60.ExtenderTouchDetectionReservedSigs.Use();
|
||||||
{
|
tsx52or60.ExtenderTouchDetectionReservedSigs.DeviceExtenderSigChange += ExtenderTouchDetectionReservedSigs_DeviceExtenderSigChange;
|
||||||
CurrentChildDriver = driver;
|
tsx52or60.ExtenderTouchDetectionReservedSigs.Time.UShortValue = 1;
|
||||||
if (driver == null)
|
ManageInactivityTimer();
|
||||||
return;
|
|
||||||
this.Hide();
|
}
|
||||||
driver.Show();
|
else
|
||||||
}
|
{
|
||||||
|
var tswx70 = trilist as TswX70Base;
|
||||||
/// <summary>
|
if (tswx70 != null)
|
||||||
///
|
{
|
||||||
/// </summary>
|
tswx70.ExtenderTouchDetectionReservedSigs.Use();
|
||||||
public override void BackButtonPressed()
|
tswx70.ExtenderTouchDetectionReservedSigs.DeviceExtenderSigChange += ExtenderTouchDetectionReservedSigs_DeviceExtenderSigChange;
|
||||||
{
|
tswx70.ExtenderTouchDetectionReservedSigs.Time.UShortValue = 1;
|
||||||
if(CurrentChildDriver != null)
|
ManageInactivityTimer();
|
||||||
CurrentChildDriver.BackButtonPressed();
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ExtenderTouchDetectionReservedSigs_DeviceExtenderSigChange(Crestron.SimplSharpPro.DeviceExtender currentDeviceExtender, Crestron.SimplSharpPro.SigEventArgs args)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (args.Sig.BoolValue)
|
||||||
|
{
|
||||||
|
ManageInactivityTimer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ManageInactivityTimer()
|
||||||
|
{
|
||||||
|
if (InactivityTimer != null)
|
||||||
|
{
|
||||||
|
InactivityTimer.Reset(_timeoutMs);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
InactivityTimer = new CTimer((o) => InactivityTimerExpired(), _timeoutMs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void InactivityTimerExpired()
|
||||||
|
{
|
||||||
|
InactivityTimer.Stop();
|
||||||
|
InactivityTimer.Dispose();
|
||||||
|
InactivityTimer = null;
|
||||||
|
|
||||||
|
ScreenSaverController.Show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Show()
|
||||||
|
{
|
||||||
|
CurrentChildDriver = null;
|
||||||
|
ShowSubDriver(AvDriver as PanelDriverBase);
|
||||||
|
|
||||||
|
base.Show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Hide()
|
||||||
|
{
|
||||||
|
TriList.BooleanInput[AvDriver.StartPageVisibleJoin].BoolValue = false;
|
||||||
|
base.Hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShowSubDriver(PanelDriverBase driver)
|
||||||
|
{
|
||||||
|
CurrentChildDriver = driver;
|
||||||
|
if (driver == null)
|
||||||
|
return;
|
||||||
|
this.Hide();
|
||||||
|
driver.Show();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
public override void BackButtonPressed()
|
||||||
|
{
|
||||||
|
if(CurrentChildDriver != null)
|
||||||
|
CurrentChildDriver.BackButtonPressed();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IHasScreenSaverController
|
||||||
|
{
|
||||||
|
ScreenSaverController ScreenSaverController { get; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -267,7 +267,7 @@
|
|||||||
// HideAndClearCurrentDisplayModeSigsInUse();
|
// HideAndClearCurrentDisplayModeSigsInUse();
|
||||||
// tl[UIBoolJoin.TopBarHabaneroVisible].BoolValue = false;
|
// tl[UIBoolJoin.TopBarHabaneroVisible].BoolValue = false;
|
||||||
// tl[UIBoolJoin.ActivityFooterVisible].BoolValue = false;
|
// tl[UIBoolJoin.ActivityFooterVisible].BoolValue = false;
|
||||||
// tl[UIBoolJoin.StartPageVisible].BoolValue = false;
|
// tl[StartPageVisibleJoin].BoolValue = false;
|
||||||
// tl[UIBoolJoin.TapToBeginVisible].BoolValue = false;
|
// tl[UIBoolJoin.TapToBeginVisible].BoolValue = false;
|
||||||
// tl[UIBoolJoin.ToggleSharingModeVisible].BoolValue = false;
|
// tl[UIBoolJoin.ToggleSharingModeVisible].BoolValue = false;
|
||||||
// tl[UIBoolJoin.SourceStagingBarVisible].BoolValue = false;
|
// tl[UIBoolJoin.SourceStagingBarVisible].BoolValue = false;
|
||||||
@@ -335,7 +335,7 @@
|
|||||||
// }
|
// }
|
||||||
// else
|
// else
|
||||||
// {
|
// {
|
||||||
// TriList.BooleanInput[UIBoolJoin.StartPageVisible].BoolValue = true;
|
// TriList.BooleanInput[StartPageVisibleJoin].BoolValue = true;
|
||||||
// TriList.BooleanInput[UIBoolJoin.TapToBeginVisible].BoolValue = true;
|
// TriList.BooleanInput[UIBoolJoin.TapToBeginVisible].BoolValue = true;
|
||||||
// TriList.BooleanInput[UIBoolJoin.SelectASourceVisible].BoolValue = false;
|
// TriList.BooleanInput[UIBoolJoin.SelectASourceVisible].BoolValue = false;
|
||||||
// }
|
// }
|
||||||
@@ -525,7 +525,7 @@
|
|||||||
// if (!_CurrentRoom.OnFeedback.BoolValue)
|
// if (!_CurrentRoom.OnFeedback.BoolValue)
|
||||||
// {
|
// {
|
||||||
// ShareButtonSig.BoolValue = true;
|
// ShareButtonSig.BoolValue = true;
|
||||||
// TriList.BooleanInput[UIBoolJoin.StartPageVisible].BoolValue = false;
|
// TriList.BooleanInput[StartPageVisibleJoin].BoolValue = false;
|
||||||
// ShowCurrentSharingMode();
|
// ShowCurrentSharingMode();
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
@@ -953,13 +953,13 @@
|
|||||||
// if (value)
|
// if (value)
|
||||||
// {
|
// {
|
||||||
// SetupActivityFooterWhenRoomOn();
|
// SetupActivityFooterWhenRoomOn();
|
||||||
// TriList.BooleanInput[UIBoolJoin.StartPageVisible].BoolValue = false;
|
// TriList.BooleanInput[StartPageVisibleJoin].BoolValue = false;
|
||||||
// }
|
// }
|
||||||
// else
|
// else
|
||||||
// {
|
// {
|
||||||
// HideCurrentSharingMode();
|
// HideCurrentSharingMode();
|
||||||
// SetupActivityFooterWhenRoomOff();
|
// SetupActivityFooterWhenRoomOff();
|
||||||
// TriList.BooleanInput[UIBoolJoin.StartPageVisible].BoolValue = true;
|
// TriList.BooleanInput[StartPageVisibleJoin].BoolValue = true;
|
||||||
// if (LastSelectedSourceSig != null)
|
// if (LastSelectedSourceSig != null)
|
||||||
// {
|
// {
|
||||||
// LastSelectedSourceSig.BoolValue = false;
|
// LastSelectedSourceSig.BoolValue = false;
|
||||||
@@ -983,7 +983,7 @@
|
|||||||
// /// <summary>
|
// /// <summary>
|
||||||
// /// Handles source change
|
// /// Handles source change
|
||||||
// /// </summary>
|
// /// </summary>
|
||||||
// void _CurrentRoom_SourceInfoChange(EssentialsRoomBase room,
|
// void _CurrentRoom_SourceInfoChange(IEssentialsRoom room,
|
||||||
// SourceListItem info, ChangeType change)
|
// SourceListItem info, ChangeType change)
|
||||||
// {
|
// {
|
||||||
// if (change == ChangeType.WillChange)
|
// if (change == ChangeType.WillChange)
|
||||||
@@ -995,7 +995,7 @@
|
|||||||
// /// <summary>
|
// /// <summary>
|
||||||
// ///
|
// ///
|
||||||
// /// </summary>
|
// /// </summary>
|
||||||
// void _CurrentRoom_CurrentDisplay1SourceChange(EssentialsRoomBase room, SourceListItem info, ChangeType type)
|
// void _CurrentRoom_CurrentDisplay1SourceChange(IEssentialsRoom room, SourceListItem info, ChangeType type)
|
||||||
// {
|
// {
|
||||||
// if (type == ChangeType.DidChange)
|
// if (type == ChangeType.DidChange)
|
||||||
// {
|
// {
|
||||||
@@ -1021,7 +1021,7 @@
|
|||||||
// /// <summary>
|
// /// <summary>
|
||||||
// ///
|
// ///
|
||||||
// /// </summary>
|
// /// </summary>
|
||||||
// void _CurrentRoom_CurrentDisplay2SourceChange(EssentialsRoomBase room, SourceListItem info, ChangeType type)
|
// void _CurrentRoom_CurrentDisplay2SourceChange(IEssentialsRoom room, SourceListItem info, ChangeType type)
|
||||||
// {
|
// {
|
||||||
// if (type == ChangeType.DidChange)
|
// if (type == ChangeType.DidChange)
|
||||||
// {
|
// {
|
||||||
|
|||||||
@@ -24,6 +24,9 @@ namespace PepperDash.Essentials
|
|||||||
PresentationMode, AudioSetup
|
PresentationMode, AudioSetup
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public uint StartPageVisibleJoin { get; private set; }
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Whether volume ramping from this panel will show the volume
|
/// Whether volume ramping from this panel will show the volume
|
||||||
/// gauge popup.
|
/// gauge popup.
|
||||||
@@ -75,7 +78,7 @@ namespace PepperDash.Essentials
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public EssentialsHuddleSpaceRoom CurrentRoom
|
public IEssentialsHuddleSpaceRoom CurrentRoom
|
||||||
{
|
{
|
||||||
get { return _CurrentRoom; }
|
get { return _CurrentRoom; }
|
||||||
set
|
set
|
||||||
@@ -83,7 +86,7 @@ namespace PepperDash.Essentials
|
|||||||
SetCurrentRoom(value);
|
SetCurrentRoom(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EssentialsHuddleSpaceRoom _CurrentRoom;
|
IEssentialsHuddleSpaceRoom _CurrentRoom;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
@@ -111,7 +114,7 @@ namespace PepperDash.Essentials
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// The parent driver for this
|
/// The parent driver for this
|
||||||
/// </summary>
|
/// </summary>
|
||||||
PanelDriverBase Parent;
|
public PanelDriverBase Parent { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// All children attached to this driver. For hiding and showing as a group.
|
/// All children attached to this driver. For hiding and showing as a group.
|
||||||
@@ -209,6 +212,7 @@ namespace PepperDash.Essentials
|
|||||||
"Tap Share to begin";
|
"Tap Share to begin";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -225,20 +229,34 @@ namespace PepperDash.Essentials
|
|||||||
if (Config.HeaderStyle.ToLower() == CrestronTouchpanelPropertiesConfig.Habanero)
|
if (Config.HeaderStyle.ToLower() == CrestronTouchpanelPropertiesConfig.Habanero)
|
||||||
{
|
{
|
||||||
TriList.SetSigFalseAction(UIBoolJoin.HeaderRoomButtonPress, () =>
|
TriList.SetSigFalseAction(UIBoolJoin.HeaderRoomButtonPress, () =>
|
||||||
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.RoomHeaderPageVisible));
|
{
|
||||||
|
if (CurrentRoom.IsMobileControlEnabled)
|
||||||
|
{
|
||||||
|
Debug.Console(1, "Showing Mobile Control Header Info");
|
||||||
|
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.RoomHeaderInfoMCPageVisible);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Console(1, "Showing Non Mobile Control Header Info");
|
||||||
|
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.RoomHeaderInfoPageVisible);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
else if (Config.HeaderStyle.ToLower() == CrestronTouchpanelPropertiesConfig.Verbose)
|
else if (Config.HeaderStyle.ToLower() == CrestronTouchpanelPropertiesConfig.Verbose)
|
||||||
{
|
{
|
||||||
// room name on join 1, concat phone and sip on join 2, no button method
|
TriList.SetSigFalseAction(UIBoolJoin.HeaderRoomButtonPress, () =>
|
||||||
//var addr = roomConf.Addresses;
|
{
|
||||||
//if (addr == null) // protect from missing values by using default empties
|
if (CurrentRoom.IsMobileControlEnabled)
|
||||||
// addr = new EssentialsRoomAddressPropertiesConfig();
|
{
|
||||||
//// empty string when either missing, pipe when both showing
|
Debug.Console(1, "Showing Mobile Control Header Info");
|
||||||
//TriList.SetString(UIStringJoin.RoomAddressPipeText,
|
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.RoomHeaderInfoMCPageVisible);
|
||||||
// (string.IsNullOrEmpty(addr.PhoneNumber.Trim())
|
}
|
||||||
// || string.IsNullOrEmpty(addr.SipAddress.Trim())) ? "" : " | ");
|
else
|
||||||
//TriList.SetString(UIStringJoin.RoomPhoneText, addr.PhoneNumber);
|
{
|
||||||
//TriList.SetString(UIStringJoin.RoomSipText, addr.SipAddress);
|
Debug.Console(1, "Showing Non Mobile Control Header Info");
|
||||||
|
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.RoomHeaderInfoPageVisible);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
TriList.SetBool(UIBoolJoin.DateAndTimeVisible, Config.ShowDate && Config.ShowTime);
|
TriList.SetBool(UIBoolJoin.DateAndTimeVisible, Config.ShowDate && Config.ShowTime);
|
||||||
@@ -256,7 +274,7 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
TriList.SetBool(UIBoolJoin.StartPageVisible, true);
|
TriList.SetBool(StartPageVisibleJoin, true);
|
||||||
TriList.SetBool(UIBoolJoin.TapToBeginVisible, true);
|
TriList.SetBool(UIBoolJoin.TapToBeginVisible, true);
|
||||||
SetupActivityFooterWhenRoomOff();
|
SetupActivityFooterWhenRoomOff();
|
||||||
}
|
}
|
||||||
@@ -287,9 +305,9 @@ namespace PepperDash.Essentials
|
|||||||
TriList.SetSigFalseAction(UIBoolJoin.ShowPowerOffPress, EndMeetingPress);
|
TriList.SetSigFalseAction(UIBoolJoin.ShowPowerOffPress, EndMeetingPress);
|
||||||
|
|
||||||
TriList.SetSigFalseAction(UIBoolJoin.DisplayPowerTogglePress, () =>
|
TriList.SetSigFalseAction(UIBoolJoin.DisplayPowerTogglePress, () =>
|
||||||
{
|
{
|
||||||
if (CurrentRoom != null && CurrentRoom.DefaultDisplay is IPower)
|
if (CurrentRoom != null && CurrentRoom.DefaultDisplay is IHasPowerControl)
|
||||||
(CurrentRoom.DefaultDisplay as IPower).PowerToggle();
|
(CurrentRoom.DefaultDisplay as IHasPowerControl).PowerToggle();
|
||||||
});
|
});
|
||||||
|
|
||||||
base.Show();
|
base.Show();
|
||||||
@@ -321,7 +339,7 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
void ShowLogo()
|
void ShowLogo()
|
||||||
{
|
{
|
||||||
if (CurrentRoom.LogoUrl == null)
|
if (CurrentRoom.LogoUrlLightBkgnd == null)
|
||||||
{
|
{
|
||||||
TriList.SetBool(UIBoolJoin.LogoDefaultVisible, true);
|
TriList.SetBool(UIBoolJoin.LogoDefaultVisible, true);
|
||||||
TriList.SetBool(UIBoolJoin.LogoUrlVisible, false);
|
TriList.SetBool(UIBoolJoin.LogoUrlVisible, false);
|
||||||
@@ -330,7 +348,8 @@ namespace PepperDash.Essentials
|
|||||||
{
|
{
|
||||||
TriList.SetBool(UIBoolJoin.LogoDefaultVisible, false);
|
TriList.SetBool(UIBoolJoin.LogoDefaultVisible, false);
|
||||||
TriList.SetBool(UIBoolJoin.LogoUrlVisible, true);
|
TriList.SetBool(UIBoolJoin.LogoUrlVisible, true);
|
||||||
TriList.SetString(UIStringJoin.LogoUrl, _CurrentRoom.LogoUrl);
|
TriList.SetString(UIStringJoin.LogoUrlLightBkgnd, _CurrentRoom.LogoUrlLightBkgnd);
|
||||||
|
TriList.SetString(UIStringJoin.LogoUrlDarkBkgnd, _CurrentRoom.LogoUrlDarkBkgnd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -351,7 +370,7 @@ namespace PepperDash.Essentials
|
|||||||
HideAndClearCurrentDisplayModeSigsInUse();
|
HideAndClearCurrentDisplayModeSigsInUse();
|
||||||
TriList.BooleanInput[UIBoolJoin.TopBarHabaneroDynamicVisible].BoolValue = false;
|
TriList.BooleanInput[UIBoolJoin.TopBarHabaneroDynamicVisible].BoolValue = false;
|
||||||
TriList.BooleanInput[UIBoolJoin.ActivityFooterVisible].BoolValue = false;
|
TriList.BooleanInput[UIBoolJoin.ActivityFooterVisible].BoolValue = false;
|
||||||
TriList.BooleanInput[UIBoolJoin.StartPageVisible].BoolValue = false;
|
TriList.BooleanInput[StartPageVisibleJoin].BoolValue = false;
|
||||||
TriList.BooleanInput[UIBoolJoin.TapToBeginVisible].BoolValue = false;
|
TriList.BooleanInput[UIBoolJoin.TapToBeginVisible].BoolValue = false;
|
||||||
TriList.BooleanInput[UIBoolJoin.SelectASourceVisible].BoolValue = false;
|
TriList.BooleanInput[UIBoolJoin.SelectASourceVisible].BoolValue = false;
|
||||||
//TriList.BooleanInput[UIBoolJoin.StagingPageVisible].BoolValue = false;
|
//TriList.BooleanInput[UIBoolJoin.StagingPageVisible].BoolValue = false;
|
||||||
@@ -416,7 +435,7 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
TriList.BooleanInput[UIBoolJoin.StartPageVisible].BoolValue = true;
|
TriList.BooleanInput[StartPageVisibleJoin].BoolValue = true;
|
||||||
TriList.BooleanInput[UIBoolJoin.TapToBeginVisible].BoolValue = true;
|
TriList.BooleanInput[UIBoolJoin.TapToBeginVisible].BoolValue = true;
|
||||||
TriList.BooleanInput[UIBoolJoin.SelectASourceVisible].BoolValue = false;
|
TriList.BooleanInput[UIBoolJoin.SelectASourceVisible].BoolValue = false;
|
||||||
}
|
}
|
||||||
@@ -474,12 +493,12 @@ namespace PepperDash.Essentials
|
|||||||
void ShareButtonPressed()
|
void ShareButtonPressed()
|
||||||
{
|
{
|
||||||
ShareButtonSig.BoolValue = true;
|
ShareButtonSig.BoolValue = true;
|
||||||
TriList.BooleanInput[UIBoolJoin.StartPageVisible].BoolValue = false;
|
TriList.BooleanInput[StartPageVisibleJoin].BoolValue = false;
|
||||||
TriList.BooleanInput[UIBoolJoin.SourceStagingBarVisible].BoolValue = true;
|
TriList.BooleanInput[UIBoolJoin.SourceStagingBarVisible].BoolValue = true;
|
||||||
TriList.BooleanInput[UIBoolJoin.SelectASourceVisible].BoolValue = true;
|
TriList.BooleanInput[UIBoolJoin.SelectASourceVisible].BoolValue = true;
|
||||||
// Run default source when room is off and share is pressed
|
// Run default source when room is off and share is pressed
|
||||||
if (!CurrentRoom.OnFeedback.BoolValue)
|
if (!CurrentRoom.OnFeedback.BoolValue)
|
||||||
CurrentRoom.RunDefaultPresentRoute();
|
(CurrentRoom as IRunDefaultPresentRoute).RunDefaultPresentRoute();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -564,7 +583,7 @@ namespace PepperDash.Essentials
|
|||||||
void UiSelectSource(string key)
|
void UiSelectSource(string key)
|
||||||
{
|
{
|
||||||
// Run the route and when it calls back, show the source
|
// Run the route and when it calls back, show the source
|
||||||
CurrentRoom.RunRouteAction(key, new Action(() => { }));
|
CurrentRoom.RunRouteAction(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -726,7 +745,7 @@ namespace PepperDash.Essentials
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Helper for property setter. Sets the panel to the given room, latching up all functionality
|
/// Helper for property setter. Sets the panel to the given room, latching up all functionality
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void RefreshCurrentRoom(EssentialsHuddleSpaceRoom room)
|
public void RefreshCurrentRoom(IEssentialsHuddleSpaceRoom room)
|
||||||
{
|
{
|
||||||
if (_CurrentRoom != null)
|
if (_CurrentRoom != null)
|
||||||
{
|
{
|
||||||
@@ -778,7 +797,7 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
// Name and logo
|
// Name and logo
|
||||||
TriList.StringInput[UIStringJoin.CurrentRoomName].StringValue = _CurrentRoom.Name;
|
TriList.StringInput[UIStringJoin.CurrentRoomName].StringValue = _CurrentRoom.Name;
|
||||||
if (_CurrentRoom.LogoUrl == null)
|
if (_CurrentRoom.LogoUrlLightBkgnd == null)
|
||||||
{
|
{
|
||||||
TriList.BooleanInput[UIBoolJoin.LogoDefaultVisible].BoolValue = true;
|
TriList.BooleanInput[UIBoolJoin.LogoDefaultVisible].BoolValue = true;
|
||||||
TriList.BooleanInput[UIBoolJoin.LogoUrlVisible].BoolValue = false;
|
TriList.BooleanInput[UIBoolJoin.LogoUrlVisible].BoolValue = false;
|
||||||
@@ -787,7 +806,9 @@ namespace PepperDash.Essentials
|
|||||||
{
|
{
|
||||||
TriList.BooleanInput[UIBoolJoin.LogoDefaultVisible].BoolValue = false;
|
TriList.BooleanInput[UIBoolJoin.LogoDefaultVisible].BoolValue = false;
|
||||||
TriList.BooleanInput[UIBoolJoin.LogoUrlVisible].BoolValue = true;
|
TriList.BooleanInput[UIBoolJoin.LogoUrlVisible].BoolValue = true;
|
||||||
TriList.StringInput[UIStringJoin.LogoUrl].StringValue = _CurrentRoom.LogoUrl;
|
TriList.StringInput[UIStringJoin.LogoUrlLightBkgnd].StringValue = _CurrentRoom.LogoUrlLightBkgnd;
|
||||||
|
TriList.StringInput[UIStringJoin.LogoUrlLightBkgnd].StringValue = _CurrentRoom.LogoUrlDarkBkgnd;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shutdown timer
|
// Shutdown timer
|
||||||
@@ -815,17 +836,48 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetCurrentRoom(EssentialsHuddleSpaceRoom room)
|
void SetCurrentRoom(IEssentialsHuddleSpaceRoom room)
|
||||||
{
|
{
|
||||||
if (_CurrentRoom == room) return;
|
if (_CurrentRoom == room) return;
|
||||||
// Disconnect current (probably never called)
|
// Disconnect current (probably never called)
|
||||||
|
|
||||||
|
if (_CurrentRoom != null)
|
||||||
|
_CurrentRoom.ConfigChanged -= room_ConfigChanged;
|
||||||
|
|
||||||
room.ConfigChanged -= room_ConfigChanged;
|
room.ConfigChanged -= room_ConfigChanged;
|
||||||
room.ConfigChanged += room_ConfigChanged;
|
room.ConfigChanged += room_ConfigChanged;
|
||||||
|
|
||||||
|
if (room.IsMobileControlEnabled)
|
||||||
|
{
|
||||||
|
StartPageVisibleJoin = UIBoolJoin.StartMCPageVisible;
|
||||||
|
UpdateMCJoins(room);
|
||||||
|
|
||||||
|
if (_CurrentRoom != null)
|
||||||
|
_CurrentRoom.MobileControlRoomBridge.UserCodeChanged -= MobileControlRoomBridge_UserCodeChanged;
|
||||||
|
|
||||||
|
room.MobileControlRoomBridge.UserCodeChanged -= MobileControlRoomBridge_UserCodeChanged;
|
||||||
|
room.MobileControlRoomBridge.UserCodeChanged += MobileControlRoomBridge_UserCodeChanged;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
StartPageVisibleJoin = UIBoolJoin.StartPageVisible;
|
||||||
|
}
|
||||||
|
|
||||||
RefreshCurrentRoom(room);
|
RefreshCurrentRoom(room);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MobileControlRoomBridge_UserCodeChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
UpdateMCJoins(_CurrentRoom);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateMCJoins(IEssentialsHuddleSpaceRoom room)
|
||||||
|
{
|
||||||
|
TriList.SetString(UIStringJoin.RoomMcUrl, room.MobileControlRoomBridge.McServerUrl);
|
||||||
|
TriList.SetString(UIStringJoin.RoomMcQrCodeUrl, room.MobileControlRoomBridge.QrCodeUrl);
|
||||||
|
TriList.SetString(UIStringJoin.RoomUserCode, room.MobileControlRoomBridge.UserCode);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Fires when room config of current room has changed. Meant to refresh room values to propegate any updates to UI
|
/// Fires when room config of current room has changed. Meant to refresh room values to propegate any updates to UI
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -855,7 +907,7 @@ namespace PepperDash.Essentials
|
|||||||
SetupActivityFooterWhenRoomOn();
|
SetupActivityFooterWhenRoomOn();
|
||||||
TriList.BooleanInput[UIBoolJoin.SelectASourceVisible].BoolValue = false;
|
TriList.BooleanInput[UIBoolJoin.SelectASourceVisible].BoolValue = false;
|
||||||
TriList.BooleanInput[UIBoolJoin.SourceStagingBarVisible].BoolValue = true;
|
TriList.BooleanInput[UIBoolJoin.SourceStagingBarVisible].BoolValue = true;
|
||||||
TriList.BooleanInput[UIBoolJoin.StartPageVisible].BoolValue = false;
|
TriList.BooleanInput[StartPageVisibleJoin].BoolValue = false;
|
||||||
TriList.BooleanInput[UIBoolJoin.VolumeSingleMute1Visible].BoolValue = true;
|
TriList.BooleanInput[UIBoolJoin.VolumeSingleMute1Visible].BoolValue = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -863,9 +915,10 @@ namespace PepperDash.Essentials
|
|||||||
{
|
{
|
||||||
SetupActivityFooterWhenRoomOff();
|
SetupActivityFooterWhenRoomOff();
|
||||||
ShowLogo();
|
ShowLogo();
|
||||||
TriList.BooleanInput[UIBoolJoin.StartPageVisible].BoolValue = true;
|
TriList.BooleanInput[StartPageVisibleJoin].BoolValue = true;
|
||||||
TriList.BooleanInput[UIBoolJoin.VolumeSingleMute1Visible].BoolValue = false;
|
TriList.BooleanInput[UIBoolJoin.VolumeSingleMute1Visible].BoolValue = false;
|
||||||
TriList.BooleanInput[UIBoolJoin.SourceStagingBarVisible].BoolValue = false;
|
TriList.BooleanInput[UIBoolJoin.SourceStagingBarVisible].BoolValue = false;
|
||||||
|
TriList.BooleanInput[UIBoolJoin.SelectASourceVisible].BoolValue = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -932,8 +985,8 @@ namespace PepperDash.Essentials
|
|||||||
(previousDev as IDvr).UnlinkButtons(TriList);
|
(previousDev as IDvr).UnlinkButtons(TriList);
|
||||||
if (previousDev is INumericKeypad)
|
if (previousDev is INumericKeypad)
|
||||||
(previousDev as INumericKeypad).UnlinkButtons(TriList);
|
(previousDev as INumericKeypad).UnlinkButtons(TriList);
|
||||||
if (previousDev is IPower)
|
if (previousDev is IHasPowerControl)
|
||||||
(previousDev as IPower).UnlinkButtons(TriList);
|
(previousDev as IHasPowerControl).UnlinkButtons(TriList);
|
||||||
if (previousDev is ITransport)
|
if (previousDev is ITransport)
|
||||||
(previousDev as ITransport).UnlinkButtons(TriList);
|
(previousDev as ITransport).UnlinkButtons(TriList);
|
||||||
//if (previousDev is IRadio)
|
//if (previousDev is IRadio)
|
||||||
@@ -992,8 +1045,8 @@ namespace PepperDash.Essentials
|
|||||||
(dev as IDvr).LinkButtons(TriList);
|
(dev as IDvr).LinkButtons(TriList);
|
||||||
if (dev is INumericKeypad)
|
if (dev is INumericKeypad)
|
||||||
(dev as INumericKeypad).LinkButtons(TriList);
|
(dev as INumericKeypad).LinkButtons(TriList);
|
||||||
if (dev is IPower)
|
if (dev is IHasPowerControl)
|
||||||
(dev as IPower).LinkButtons(TriList);
|
(dev as IHasPowerControl).LinkButtons(TriList);
|
||||||
if (dev is ITransport)
|
if (dev is ITransport)
|
||||||
(dev as ITransport).LinkButtons(TriList);
|
(dev as ITransport).LinkButtons(TriList);
|
||||||
//if (dev is IRadio)
|
//if (dev is IRadio)
|
||||||
|
|||||||
@@ -1,326 +1,326 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
using Crestron.SimplSharpPro.DeviceSupport;
|
||||||
|
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials;
|
using PepperDash.Essentials;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
using PepperDash.Essentials.Core.SmartObjects;
|
using PepperDash.Essentials.Core.SmartObjects;
|
||||||
using PepperDash.Essentials.Core.Touchpanels.Keyboards;
|
using PepperDash.Essentials.Core.Touchpanels.Keyboards;
|
||||||
using PepperDash.Essentials.Devices.Displays;
|
using PepperDash.Essentials.Devices.Displays;
|
||||||
using PepperDash.Essentials.Room.Config;
|
using PepperDash.Essentials.Room.Config;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.UIDrivers
|
namespace PepperDash.Essentials.UIDrivers
|
||||||
{
|
{
|
||||||
public class EssentialsHuddleTechPageDriver : PanelDriverBase
|
public class EssentialsHuddleTechPageDriver : PanelDriverBase
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
SmartObjectDynamicList MenuList;
|
SmartObjectDynamicList MenuList;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
SubpageReferenceList StatusList;
|
SubpageReferenceList StatusList;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The list of display controls
|
/// The list of display controls
|
||||||
/// </summary>
|
/// </summary>
|
||||||
SubpageReferenceList DisplayList;
|
SubpageReferenceList DisplayList;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// References lines in the list against device instances
|
/// References lines in the list against device instances
|
||||||
/// </summary>
|
/// </summary>
|
||||||
Dictionary<ICommunicationMonitor, uint> StatusListDeviceIndexes;
|
Dictionary<ICommunicationMonitor, uint> StatusListDeviceIndexes;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
JoinedSigInterlock PagesInterlock;
|
JoinedSigInterlock PagesInterlock;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 1
|
/// 1
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const uint JoinText = 1;
|
public const uint JoinText = 1;
|
||||||
|
|
||||||
CTimer PinAuthorizedTimer;
|
CTimer PinAuthorizedTimer;
|
||||||
|
|
||||||
EssentialsRoomTechConfig Config;
|
EssentialsRoomTechConfig Config;
|
||||||
|
|
||||||
StringBuilder PinEntryBuilder = new StringBuilder(4);
|
StringBuilder PinEntryBuilder = new StringBuilder(4);
|
||||||
|
|
||||||
bool IsAuthorized;
|
bool IsAuthorized;
|
||||||
|
|
||||||
SmartObjectNumeric PinKeypad;
|
SmartObjectNumeric PinKeypad;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="trilist"></param>
|
/// <param name="trilist"></param>
|
||||||
/// <param name="parent"></param>
|
/// <param name="parent"></param>
|
||||||
public EssentialsHuddleTechPageDriver(BasicTriListWithSmartObject trilist, EssentialsRoomTechConfig config)
|
public EssentialsHuddleTechPageDriver(BasicTriListWithSmartObject trilist, EssentialsRoomTechConfig config)
|
||||||
: base(trilist)
|
: base(trilist)
|
||||||
{
|
{
|
||||||
Config = config;
|
Config = config;
|
||||||
|
|
||||||
PagesInterlock = new JoinedSigInterlock(trilist);
|
PagesInterlock = new JoinedSigInterlock(trilist);
|
||||||
PagesInterlock.SetButDontShow(UIBoolJoin.TechSystemStatusVisible);
|
PagesInterlock.SetButDontShow(UIBoolJoin.TechSystemStatusVisible);
|
||||||
|
|
||||||
trilist.SetSigFalseAction(UIBoolJoin.TechExitButton, Hide);
|
trilist.SetSigFalseAction(UIBoolJoin.TechExitButton, Hide);
|
||||||
|
|
||||||
MenuList = new SmartObjectDynamicList(trilist.SmartObjects[UISmartObjectJoin.TechMenuList],
|
MenuList = new SmartObjectDynamicList(trilist.SmartObjects[UISmartObjectJoin.TechMenuList],
|
||||||
true, 3100);
|
true, 3100);
|
||||||
|
|
||||||
MenuList.SetFeedback(1, true); // initial fb
|
MenuList.SetFeedback(1, true); // initial fb
|
||||||
ushort count = 0;
|
ushort count = 0;
|
||||||
|
|
||||||
MenuList.SetItemMainText(1, "System Status");
|
MenuList.SetItemMainText(1, "System Status");
|
||||||
MenuList.SetItemButtonAction(1, b => {
|
MenuList.SetItemButtonAction(1, b => {
|
||||||
if (b) PagesInterlock.ShowInterlocked(UIBoolJoin.TechSystemStatusVisible);
|
if (b) PagesInterlock.ShowInterlocked(UIBoolJoin.TechSystemStatusVisible);
|
||||||
MenuList.SetFeedback(1, true);
|
MenuList.SetFeedback(1, true);
|
||||||
});
|
});
|
||||||
|
|
||||||
MenuList.SetItemMainText(2, "Display Controls");
|
MenuList.SetItemMainText(2, "Display Controls");
|
||||||
MenuList.SetItemButtonAction(2, b => {
|
MenuList.SetItemButtonAction(2, b => {
|
||||||
if (b) PagesInterlock.ShowInterlocked(UIBoolJoin.TechDisplayControlsVisible);
|
if (b) PagesInterlock.ShowInterlocked(UIBoolJoin.TechDisplayControlsVisible);
|
||||||
MenuList.SetFeedback(2, true);
|
MenuList.SetFeedback(2, true);
|
||||||
});
|
});
|
||||||
|
|
||||||
count = 2;
|
count = 2;
|
||||||
|
|
||||||
// Don't show panel setup on iPad or xpanel
|
// Don't show panel setup on iPad or xpanel
|
||||||
if (TriList is Crestron.SimplSharpPro.DeviceSupport.TswFt5Button)
|
if (TriList is Crestron.SimplSharpPro.DeviceSupport.TswFt5Button)
|
||||||
{
|
{
|
||||||
count++;
|
count++;
|
||||||
MenuList.SetItemMainText(count, "Panel Setup");
|
MenuList.SetItemMainText(count, "Panel Setup");
|
||||||
MenuList.SetItemButtonAction(count, b =>
|
MenuList.SetItemButtonAction(count, b =>
|
||||||
{
|
{
|
||||||
if (b) PagesInterlock.ShowInterlocked(UIBoolJoin.TechPanelSetupVisible);
|
if (b) PagesInterlock.ShowInterlocked(UIBoolJoin.TechPanelSetupVisible);
|
||||||
MenuList.SetFeedback(count, true);
|
MenuList.SetFeedback(count, true);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
MenuList.Count = count;
|
MenuList.Count = count;
|
||||||
BuildStatusList();
|
BuildStatusList();
|
||||||
BuildDisplayList();
|
BuildDisplayList();
|
||||||
SetupPinModal();
|
SetupPinModal();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public override void Show()
|
public override void Show()
|
||||||
{
|
{
|
||||||
// divert to PIN if we need auth
|
// divert to PIN if we need auth
|
||||||
if (IsAuthorized)
|
if (IsAuthorized)
|
||||||
{
|
{
|
||||||
// Cancel the auth timer so we don't deauth after coming back in
|
// Cancel the auth timer so we don't deauth after coming back in
|
||||||
if (PinAuthorizedTimer != null)
|
if (PinAuthorizedTimer != null)
|
||||||
PinAuthorizedTimer.Stop();
|
PinAuthorizedTimer.Stop();
|
||||||
|
|
||||||
TriList.SetBool(UIBoolJoin.TechCommonItemsVisbible, true);
|
TriList.SetBool(UIBoolJoin.TechCommonItemsVisbible, true);
|
||||||
PagesInterlock.Show();
|
PagesInterlock.Show();
|
||||||
base.Show();
|
base.Show();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
TriList.SetBool(UIBoolJoin.PinDialog4DigitVisible, true);
|
TriList.SetBool(UIBoolJoin.PinDialog4DigitVisible, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public override void Hide()
|
public override void Hide()
|
||||||
{
|
{
|
||||||
// Leave it authorized for 60 seconds.
|
// Leave it authorized for 60 seconds.
|
||||||
if (IsAuthorized)
|
if (IsAuthorized)
|
||||||
PinAuthorizedTimer = new CTimer(o => {
|
PinAuthorizedTimer = new CTimer(o => {
|
||||||
IsAuthorized = false;
|
IsAuthorized = false;
|
||||||
PinAuthorizedTimer = null;
|
PinAuthorizedTimer = null;
|
||||||
}, 60000);
|
}, 60000);
|
||||||
TriList.SetBool(UIBoolJoin.TechCommonItemsVisbible, false);
|
TriList.SetBool(UIBoolJoin.TechCommonItemsVisbible, false);
|
||||||
PagesInterlock.Hide();
|
PagesInterlock.Hide();
|
||||||
base.Hide();
|
base.Hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Wire up the keypad and buttons
|
/// Wire up the keypad and buttons
|
||||||
/// </summary>
|
/// </summary>
|
||||||
void SetupPinModal()
|
void SetupPinModal()
|
||||||
{
|
{
|
||||||
TriList.SetSigFalseAction(UIBoolJoin.PinDialogCancelPress, CancelPinDialog);
|
TriList.SetSigFalseAction(UIBoolJoin.PinDialogCancelPress, CancelPinDialog);
|
||||||
PinKeypad = new SmartObjectNumeric(TriList.SmartObjects[UISmartObjectJoin.TechPinDialogKeypad], true);
|
PinKeypad = new SmartObjectNumeric(TriList.SmartObjects[UISmartObjectJoin.TechPinDialogKeypad], true);
|
||||||
PinKeypad.Digit0.UserObject = new Action<bool>(b => { if (b)DialPinDigit('0'); });
|
PinKeypad.Digit0.UserObject = new Action<bool>(b => { if (b)DialPinDigit('0'); });
|
||||||
PinKeypad.Digit1.UserObject = new Action<bool>(b => { if (b)DialPinDigit('1'); });
|
PinKeypad.Digit1.UserObject = new Action<bool>(b => { if (b)DialPinDigit('1'); });
|
||||||
PinKeypad.Digit2.UserObject = new Action<bool>(b => { if (b)DialPinDigit('2'); });
|
PinKeypad.Digit2.UserObject = new Action<bool>(b => { if (b)DialPinDigit('2'); });
|
||||||
PinKeypad.Digit3.UserObject = new Action<bool>(b => { if (b)DialPinDigit('3'); });
|
PinKeypad.Digit3.UserObject = new Action<bool>(b => { if (b)DialPinDigit('3'); });
|
||||||
PinKeypad.Digit4.UserObject = new Action<bool>(b => { if (b)DialPinDigit('4'); });
|
PinKeypad.Digit4.UserObject = new Action<bool>(b => { if (b)DialPinDigit('4'); });
|
||||||
PinKeypad.Digit5.UserObject = new Action<bool>(b => { if (b)DialPinDigit('5'); });
|
PinKeypad.Digit5.UserObject = new Action<bool>(b => { if (b)DialPinDigit('5'); });
|
||||||
PinKeypad.Digit6.UserObject = new Action<bool>(b => { if (b)DialPinDigit('6'); });
|
PinKeypad.Digit6.UserObject = new Action<bool>(b => { if (b)DialPinDigit('6'); });
|
||||||
PinKeypad.Digit7.UserObject = new Action<bool>(b => { if (b)DialPinDigit('7'); });
|
PinKeypad.Digit7.UserObject = new Action<bool>(b => { if (b)DialPinDigit('7'); });
|
||||||
PinKeypad.Digit8.UserObject = new Action<bool>(b => { if (b)DialPinDigit('8'); });
|
PinKeypad.Digit8.UserObject = new Action<bool>(b => { if (b)DialPinDigit('8'); });
|
||||||
PinKeypad.Digit9.UserObject = new Action<bool>(b => { if (b)DialPinDigit('9'); });
|
PinKeypad.Digit9.UserObject = new Action<bool>(b => { if (b)DialPinDigit('9'); });
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="d"></param>
|
/// <param name="d"></param>
|
||||||
void DialPinDigit(char d)
|
void DialPinDigit(char d)
|
||||||
{
|
{
|
||||||
PinEntryBuilder.Append(d);
|
PinEntryBuilder.Append(d);
|
||||||
var len = PinEntryBuilder.Length;
|
var len = PinEntryBuilder.Length;
|
||||||
SetPinDotsFeedback(len);
|
SetPinDotsFeedback(len);
|
||||||
|
|
||||||
// check it!
|
// check it!
|
||||||
if (len == 4)
|
if (len == 4)
|
||||||
{
|
{
|
||||||
if (Config.Password == PinEntryBuilder.ToString())
|
if (Config.Password == PinEntryBuilder.ToString())
|
||||||
{
|
{
|
||||||
IsAuthorized = true;
|
IsAuthorized = true;
|
||||||
SetPinDotsFeedback(0);
|
SetPinDotsFeedback(0);
|
||||||
TriList.SetBool(UIBoolJoin.PinDialog4DigitVisible, false);
|
TriList.SetBool(UIBoolJoin.PinDialog4DigitVisible, false);
|
||||||
Show();
|
Show();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SetPinDotsFeedback(0);
|
SetPinDotsFeedback(0);
|
||||||
TriList.SetBool(UIBoolJoin.PinDialogErrorVisible, true);
|
TriList.SetBool(UIBoolJoin.PinDialogErrorVisible, true);
|
||||||
new CTimer(o =>
|
new CTimer(o =>
|
||||||
{
|
{
|
||||||
TriList.SetBool(UIBoolJoin.PinDialogErrorVisible, false);
|
TriList.SetBool(UIBoolJoin.PinDialogErrorVisible, false);
|
||||||
}, 1500);
|
}, 1500);
|
||||||
}
|
}
|
||||||
|
|
||||||
PinEntryBuilder.Remove(0, len); // clear it either way
|
PinEntryBuilder.Remove(0, len); // clear it either way
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Draws the dots as pin is entered
|
/// Draws the dots as pin is entered
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="len"></param>
|
/// <param name="len"></param>
|
||||||
void SetPinDotsFeedback(int len)
|
void SetPinDotsFeedback(int len)
|
||||||
{
|
{
|
||||||
TriList.SetBool(UIBoolJoin.PinDialogDot1, len >= 1);
|
TriList.SetBool(UIBoolJoin.PinDialogDot1, len >= 1);
|
||||||
TriList.SetBool(UIBoolJoin.PinDialogDot2, len >= 2);
|
TriList.SetBool(UIBoolJoin.PinDialogDot2, len >= 2);
|
||||||
TriList.SetBool(UIBoolJoin.PinDialogDot3, len >= 3);
|
TriList.SetBool(UIBoolJoin.PinDialogDot3, len >= 3);
|
||||||
TriList.SetBool(UIBoolJoin.PinDialogDot4, len == 4);
|
TriList.SetBool(UIBoolJoin.PinDialogDot4, len == 4);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Does what it says
|
/// Does what it says
|
||||||
/// </summary>
|
/// </summary>
|
||||||
void CancelPinDialog()
|
void CancelPinDialog()
|
||||||
{
|
{
|
||||||
PinEntryBuilder.Remove(0, PinEntryBuilder.Length);
|
PinEntryBuilder.Remove(0, PinEntryBuilder.Length);
|
||||||
TriList.SetBool(UIBoolJoin.PinDialog4DigitVisible, false);
|
TriList.SetBool(UIBoolJoin.PinDialog4DigitVisible, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
void BuildStatusList()
|
void BuildStatusList()
|
||||||
{
|
{
|
||||||
StatusList = new SubpageReferenceList(TriList, UISmartObjectJoin.TechStatusList, 3, 3, 3);
|
StatusList = new SubpageReferenceList(TriList, UISmartObjectJoin.TechStatusList, 3, 3, 3);
|
||||||
StatusListDeviceIndexes = new Dictionary<ICommunicationMonitor, uint>();
|
StatusListDeviceIndexes = new Dictionary<ICommunicationMonitor, uint>();
|
||||||
uint i = 0;
|
uint i = 0;
|
||||||
foreach (var d in DeviceManager.AllDevices)
|
foreach (var d in DeviceManager.AllDevices)
|
||||||
{
|
{
|
||||||
// make sure it is both ICommunicationMonitor and a Device
|
// make sure it is both ICommunicationMonitor and a Device
|
||||||
var sd = d as ICommunicationMonitor;
|
var sd = d as ICommunicationMonitor;
|
||||||
if (sd == null)
|
if (sd == null)
|
||||||
continue;
|
continue;
|
||||||
var dd = sd as Device;
|
var dd = sd as Device;
|
||||||
if(dd == null)
|
if(dd == null)
|
||||||
continue;
|
continue;
|
||||||
i++;
|
i++;
|
||||||
StatusList.StringInputSig(i, 1).StringValue = dd.Name;
|
StatusList.StringInputSig(i, 1).StringValue = dd.Name;
|
||||||
StatusList.UShortInputSig(i, 1).UShortValue = (ushort)sd.CommunicationMonitor.Status;
|
StatusList.UShortInputSig(i, 1).UShortValue = (ushort)sd.CommunicationMonitor.Status;
|
||||||
StatusListDeviceIndexes.Add(sd, i);
|
StatusListDeviceIndexes.Add(sd, i);
|
||||||
sd.CommunicationMonitor.StatusChange += CommunicationMonitor_StatusChange ;
|
sd.CommunicationMonitor.StatusChange += CommunicationMonitor_StatusChange ;
|
||||||
}
|
}
|
||||||
StatusList.Count = (ushort)i;
|
StatusList.Count = (ushort)i;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Builds the list of display controls
|
/// Builds the list of display controls
|
||||||
/// </summary>
|
/// </summary>
|
||||||
void BuildDisplayList()
|
void BuildDisplayList()
|
||||||
{
|
{
|
||||||
DisplayList = new SubpageReferenceList(TriList, UISmartObjectJoin.TechDisplayControlsList, 10, 3, 3);
|
DisplayList = new SubpageReferenceList(TriList, UISmartObjectJoin.TechDisplayControlsList, 10, 3, 3);
|
||||||
|
|
||||||
var devKeys = ConfigReader.ConfigObject.Devices.Where(d =>
|
var devKeys = ConfigReader.ConfigObject.Devices.Where(d =>
|
||||||
d.Group.Equals("display", StringComparison.OrdinalIgnoreCase)
|
d.Group.Equals("display", StringComparison.OrdinalIgnoreCase)
|
||||||
|| d.Group.Equals("projector", StringComparison.OrdinalIgnoreCase))
|
|| d.Group.Equals("projector", StringComparison.OrdinalIgnoreCase))
|
||||||
.Select(dd => dd.Key);
|
.Select(dd => dd.Key);
|
||||||
var disps = DeviceManager.AllDevices.Where(d =>
|
var disps = DeviceManager.AllDevices.Where(d =>
|
||||||
devKeys.Contains(d.Key));
|
devKeys.Contains(d.Key));
|
||||||
ushort i = 0;
|
ushort i = 0;
|
||||||
foreach (var disp in disps)
|
foreach (var disp in disps)
|
||||||
{
|
{
|
||||||
var display = disp as DisplayBase;
|
var display = disp as DisplayBase;
|
||||||
if (display != null)
|
if (display != null)
|
||||||
{
|
{
|
||||||
i++;
|
i++;
|
||||||
DisplayList.StringInputSig(i, 1).StringValue = display.Name;
|
DisplayList.StringInputSig(i, 1).StringValue = display.Name;
|
||||||
DisplayList.GetBoolFeedbackSig(i, 1).SetSigFalseAction(display.PowerOn);
|
DisplayList.GetBoolFeedbackSig(i, 1).SetSigFalseAction(display.PowerOn);
|
||||||
DisplayList.GetBoolFeedbackSig(i, 2).SetSigFalseAction(display.PowerOff);
|
DisplayList.GetBoolFeedbackSig(i, 2).SetSigFalseAction(display.PowerOff);
|
||||||
if (display is TwoWayDisplayBase)
|
if (display is TwoWayDisplayBase)
|
||||||
{
|
{
|
||||||
var powerOnSig = DisplayList.BoolInputSig(i, 1);
|
var powerOnSig = DisplayList.BoolInputSig(i, 1);
|
||||||
(display as TwoWayDisplayBase).PowerIsOnFeedback.LinkInputSig(powerOnSig);
|
(display as TwoWayDisplayBase).PowerIsOnFeedback.LinkInputSig(powerOnSig);
|
||||||
|
|
||||||
var powerOffSig = DisplayList.BoolInputSig(1, 2);
|
var powerOffSig = DisplayList.BoolInputSig(1, 2);
|
||||||
(display as TwoWayDisplayBase).PowerIsOnFeedback.LinkComplementInputSig(powerOffSig);
|
(display as TwoWayDisplayBase).PowerIsOnFeedback.LinkComplementInputSig(powerOffSig);
|
||||||
}
|
}
|
||||||
DisplayList.GetBoolFeedbackSig(i, 3).SetSigFalseAction(() =>
|
DisplayList.GetBoolFeedbackSig(i, 3).SetSigFalseAction(() =>
|
||||||
{ if (display is IInputHdmi1) (display as IInputHdmi1).InputHdmi1(); });
|
{ if (display is IInputHdmi1) (display as IInputHdmi1).InputHdmi1(); });
|
||||||
DisplayList.GetBoolFeedbackSig(i, 4).SetSigFalseAction(() =>
|
DisplayList.GetBoolFeedbackSig(i, 4).SetSigFalseAction(() =>
|
||||||
{ if (display is IInputHdmi2) (display as IInputHdmi2).InputHdmi2(); });
|
{ if (display is IInputHdmi2) (display as IInputHdmi2).InputHdmi2(); });
|
||||||
DisplayList.GetBoolFeedbackSig(i, 5).SetSigFalseAction(() =>
|
DisplayList.GetBoolFeedbackSig(i, 5).SetSigFalseAction(() =>
|
||||||
{ if (display is IInputHdmi3) (display as IInputHdmi3).InputHdmi3(); });
|
{ if (display is IInputHdmi3) (display as IInputHdmi3).InputHdmi3(); });
|
||||||
//DisplayList.GetBoolFeedbackSig(i, 6).SetSigFalseAction(() =>
|
//DisplayList.GetBoolFeedbackSig(i, 6).SetSigFalseAction(() =>
|
||||||
//{ if (display is IInputHdmi4) (display as IInputHdmi4).InputHdmi4(); });
|
//{ if (display is IInputHdmi4) (display as IInputHdmi4).InputHdmi4(); });
|
||||||
DisplayList.GetBoolFeedbackSig(i, 6).SetSigFalseAction(() =>
|
DisplayList.GetBoolFeedbackSig(i, 6).SetSigFalseAction(() =>
|
||||||
{ if (display is IInputDisplayPort1) (display as IInputDisplayPort1).InputDisplayPort1(); });
|
{ if (display is IInputDisplayPort1) (display as IInputDisplayPort1).InputDisplayPort1(); });
|
||||||
|
|
||||||
|
|
||||||
// Figure out some way to provide current input feedback
|
// Figure out some way to provide current input feedback
|
||||||
if (display is TwoWayDisplayBase)
|
if (display is TwoWayDisplayBase)
|
||||||
{
|
{
|
||||||
(display as TwoWayDisplayBase).CurrentInputFeedback.OutputChange += CurrentInputFeedback_OutputChange;
|
(display as TwoWayDisplayBase).CurrentInputFeedback.OutputChange += CurrentInputFeedback_OutputChange;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DisplayList.Count = i;
|
DisplayList.Count = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CurrentInputFeedback_OutputChange(object sender, EventArgs e)
|
void CurrentInputFeedback_OutputChange(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
void CommunicationMonitor_StatusChange(object sender, MonitorStatusChangeEventArgs e)
|
void CommunicationMonitor_StatusChange(object sender, MonitorStatusChangeEventArgs e)
|
||||||
{
|
{
|
||||||
var c = sender as ICommunicationMonitor;
|
var c = sender as ICommunicationMonitor;
|
||||||
if (StatusListDeviceIndexes.ContainsKey(c))
|
if (c != null && StatusListDeviceIndexes.ContainsKey(c))
|
||||||
{
|
{
|
||||||
var i = StatusListDeviceIndexes[c];
|
var i = StatusListDeviceIndexes[c];
|
||||||
StatusList.UShortInputSig(i, 1).UShortValue = (ushort)e.Status;
|
StatusList.UShortInputSig(i, 1).UShortValue = (ushort)e.Status;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
using Crestron.SimplSharpPro;
|
using Crestron.SimplSharpPro;
|
||||||
using Crestron.SimplSharpPro.UI;
|
using Crestron.SimplSharpPro.UI;
|
||||||
@@ -8,11 +9,13 @@ using Crestron.SimplSharpPro.UI;
|
|||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
||||||
using PepperDash.Essentials.Core.SmartObjects;
|
using PepperDash.Essentials.Core.SmartObjects;
|
||||||
using PepperDash.Essentials.Core.PageManagers;
|
using PepperDash.Essentials.Core.PageManagers;
|
||||||
using PepperDash.Essentials.Room.Config;
|
using PepperDash.Essentials.Room.Config;
|
||||||
using PepperDash.Essentials.Devices.Common.Codec;
|
using PepperDash.Essentials.Devices.Common.Codec;
|
||||||
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
||||||
|
using PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces;
|
||||||
|
|
||||||
namespace PepperDash.Essentials
|
namespace PepperDash.Essentials
|
||||||
{
|
{
|
||||||
@@ -28,6 +31,8 @@ namespace PepperDash.Essentials
|
|||||||
Presentation, AudioSetup, Call, Start
|
Presentation, AudioSetup, Call, Start
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public uint StartPageVisibleJoin { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Whether volume ramping from this panel will show the volume
|
/// Whether volume ramping from this panel will show the volume
|
||||||
/// gauge popup.
|
/// gauge popup.
|
||||||
@@ -48,7 +53,7 @@ namespace PepperDash.Essentials
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public EssentialsHuddleVtc1Room CurrentRoom
|
public IEssentialsHuddleVtc1Room CurrentRoom
|
||||||
{
|
{
|
||||||
get { return _CurrentRoom; }
|
get { return _CurrentRoom; }
|
||||||
set
|
set
|
||||||
@@ -56,7 +61,7 @@ namespace PepperDash.Essentials
|
|||||||
SetCurrentRoom(value);
|
SetCurrentRoom(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EssentialsHuddleVtc1Room _CurrentRoom;
|
IEssentialsHuddleVtc1Room _CurrentRoom;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// For hitting feedbacks
|
/// For hitting feedbacks
|
||||||
@@ -70,7 +75,7 @@ namespace PepperDash.Essentials
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// The parent driver for this
|
/// The parent driver for this
|
||||||
/// </summary>
|
/// </summary>
|
||||||
PanelDriverBase Parent;
|
public PanelDriverBase Parent { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// All children attached to this driver. For hiding and showing as a group.
|
/// All children attached to this driver. For hiding and showing as a group.
|
||||||
@@ -96,6 +101,9 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public SubpageReferenceList MeetingOrContactMethodModalSrl { get; set; }
|
public SubpageReferenceList MeetingOrContactMethodModalSrl { get; set; }
|
||||||
|
|
||||||
|
public uint CallListOrMeetingInfoPopoverVisibilityJoin { get; private set; }
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The list of buttons on the header. Managed with visibility only
|
/// The list of buttons on the header. Managed with visibility only
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -171,10 +179,38 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public PepperDash.Essentials.Core.Touchpanels.Keyboards.HabaneroKeyboardController Keyboard { get; private set; }
|
public PepperDash.Essentials.Core.Touchpanels.Keyboards.HabaneroKeyboardController Keyboard { get; private set; }
|
||||||
|
|
||||||
|
|
||||||
|
private UiDisplayMode _currentMode;
|
||||||
|
|
||||||
|
private bool _isZoomRoomWithNoExternalSources
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return CurrentRoom.VideoCodec is Essentials.Devices.Common.VideoCodec.ZoomRoom.ZoomRoom && _sourceListCount <= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private uint _sourceListCount;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The mode showing. Presentation or call.
|
/// The mode showing. Presentation or call.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
UiDisplayMode CurrentMode = UiDisplayMode.Start;
|
UiDisplayMode CurrentMode
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _currentMode;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value != _currentMode)
|
||||||
|
{
|
||||||
|
_currentMode = value;
|
||||||
|
|
||||||
|
SetActivityFooterFeedbacks();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
CTimer NextMeetingTimer;
|
CTimer NextMeetingTimer;
|
||||||
|
|
||||||
@@ -205,6 +241,7 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
MeetingOrContactMethodModalSrl = new SubpageReferenceList(TriList, UISmartObjectJoin.MeetingListSRL, 3, 3, 5);
|
MeetingOrContactMethodModalSrl = new SubpageReferenceList(TriList, UISmartObjectJoin.MeetingListSRL, 3, 3, 5);
|
||||||
|
|
||||||
|
CurrentMode = UiDisplayMode.Start;
|
||||||
|
|
||||||
// buttons are added in SetCurrentRoom
|
// buttons are added in SetCurrentRoom
|
||||||
//HeaderButtonsList = new SmartObjectHeaderButtonList(TriList.SmartObjects[UISmartObjectJoin.HeaderButtonList]);
|
//HeaderButtonsList = new SmartObjectHeaderButtonList(TriList.SmartObjects[UISmartObjectJoin.HeaderButtonList]);
|
||||||
@@ -240,20 +277,34 @@ namespace PepperDash.Essentials
|
|||||||
if (Config.HeaderStyle.ToLower() == CrestronTouchpanelPropertiesConfig.Habanero)
|
if (Config.HeaderStyle.ToLower() == CrestronTouchpanelPropertiesConfig.Habanero)
|
||||||
{
|
{
|
||||||
TriList.SetSigFalseAction(UIBoolJoin.HeaderRoomButtonPress, () =>
|
TriList.SetSigFalseAction(UIBoolJoin.HeaderRoomButtonPress, () =>
|
||||||
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.RoomHeaderPageVisible));
|
{
|
||||||
|
if (CurrentRoom.IsMobileControlEnabled)
|
||||||
|
{
|
||||||
|
Debug.Console(1, "Showing Mobile Control Header Info");
|
||||||
|
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.RoomHeaderInfoMCPageVisible);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Console(1, "Showing Non Mobile Control Header Info");
|
||||||
|
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.RoomHeaderInfoPageVisible);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
else if (Config.HeaderStyle.ToLower() == CrestronTouchpanelPropertiesConfig.Verbose)
|
else if (Config.HeaderStyle.ToLower() == CrestronTouchpanelPropertiesConfig.Verbose)
|
||||||
{
|
{
|
||||||
// room name on join 1, concat phone and sip on join 2, no button method
|
TriList.SetSigFalseAction(UIBoolJoin.HeaderRoomButtonPress, () =>
|
||||||
//var addr = roomConf.Addresses;
|
{
|
||||||
//if (addr == null) // protect from missing values by using default empties
|
if (CurrentRoom.IsMobileControlEnabled)
|
||||||
// addr = new EssentialsRoomAddressPropertiesConfig();
|
{
|
||||||
//// empty string when either missing, pipe when both showing
|
Debug.Console(1, "Showing Mobile Control Header Info");
|
||||||
//TriList.SetString(UIStringJoin.RoomAddressPipeText,
|
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.RoomHeaderInfoMCPageVisible);
|
||||||
// (string.IsNullOrEmpty(addr.PhoneNumber.Trim())
|
}
|
||||||
// || string.IsNullOrEmpty(addr.SipAddress.Trim())) ? "" : " | ");
|
else
|
||||||
//TriList.SetString(UIStringJoin.RoomPhoneText, addr.PhoneNumber);
|
{
|
||||||
//TriList.SetString(UIStringJoin.RoomSipText, addr.SipAddress);
|
Debug.Console(1, "Showing Non Mobile Control Header Info");
|
||||||
|
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.RoomHeaderInfoPageVisible);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
TriList.SetBool(UIBoolJoin.DateAndTimeVisible, Config.ShowDate && Config.ShowTime);
|
TriList.SetBool(UIBoolJoin.DateAndTimeVisible, Config.ShowDate && Config.ShowTime);
|
||||||
@@ -276,7 +327,7 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
TriList.SetBool(UIBoolJoin.StartPageVisible, true);
|
TriList.SetBool(StartPageVisibleJoin, true);
|
||||||
TriList.SetBool(UIBoolJoin.TapToBeginVisible, true);
|
TriList.SetBool(UIBoolJoin.TapToBeginVisible, true);
|
||||||
SetupActivityFooterWhenRoomOff();
|
SetupActivityFooterWhenRoomOff();
|
||||||
}
|
}
|
||||||
@@ -303,8 +354,8 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
TriList.SetSigFalseAction(UIBoolJoin.DisplayPowerTogglePress, () =>
|
TriList.SetSigFalseAction(UIBoolJoin.DisplayPowerTogglePress, () =>
|
||||||
{
|
{
|
||||||
if (CurrentRoom != null && CurrentRoom.DefaultDisplay is IPower)
|
if (CurrentRoom != null && CurrentRoom.DefaultDisplay is IHasPowerControl)
|
||||||
(CurrentRoom.DefaultDisplay as IPower).PowerToggle();
|
(CurrentRoom.DefaultDisplay as IHasPowerControl).PowerToggle();
|
||||||
});
|
});
|
||||||
|
|
||||||
SetupNextMeetingTimer();
|
SetupNextMeetingTimer();
|
||||||
@@ -315,15 +366,17 @@ namespace PepperDash.Essentials
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Allows PopupInterlock to be toggled if the calls list is already visible, or if the codec is in a call
|
/// Allows PopupInterlock to be toggled if the calls list is already visible, or if the codec is in a call
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void ShowActiveCallsList()
|
public void ShowActiveCallsListOrMeetingInfo()
|
||||||
{
|
{
|
||||||
TriList.SetBool(UIBoolJoin.CallEndAllConfirmVisible, true);
|
TriList.SetBool(UIBoolJoin.CallEndAllConfirmVisible, true);
|
||||||
if(PopupInterlock.CurrentJoin == UIBoolJoin.HeaderActiveCallsListVisible)
|
|
||||||
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.HeaderActiveCallsListVisible);
|
|
||||||
|
if(PopupInterlock.CurrentJoin == CallListOrMeetingInfoPopoverVisibilityJoin)
|
||||||
|
PopupInterlock.ShowInterlockedWithToggle(CallListOrMeetingInfoPopoverVisibilityJoin);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if((CurrentRoom.ScheduleSource as VideoCodecBase).IsInCall)
|
if(CurrentRoom.VideoCodec.IsInCall)
|
||||||
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.HeaderActiveCallsListVisible);
|
PopupInterlock.ShowInterlockedWithToggle(CallListOrMeetingInfoPopoverVisibilityJoin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -332,7 +385,7 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
void ShowLogo()
|
void ShowLogo()
|
||||||
{
|
{
|
||||||
if (CurrentRoom.LogoUrl == null)
|
if (CurrentRoom.LogoUrlLightBkgnd == null)
|
||||||
{
|
{
|
||||||
TriList.SetBool(UIBoolJoin.LogoDefaultVisible, true);
|
TriList.SetBool(UIBoolJoin.LogoDefaultVisible, true);
|
||||||
TriList.SetBool(UIBoolJoin.LogoUrlVisible, false);
|
TriList.SetBool(UIBoolJoin.LogoUrlVisible, false);
|
||||||
@@ -341,7 +394,8 @@ namespace PepperDash.Essentials
|
|||||||
{
|
{
|
||||||
TriList.SetBool(UIBoolJoin.LogoDefaultVisible, false);
|
TriList.SetBool(UIBoolJoin.LogoDefaultVisible, false);
|
||||||
TriList.SetBool(UIBoolJoin.LogoUrlVisible, true);
|
TriList.SetBool(UIBoolJoin.LogoUrlVisible, true);
|
||||||
TriList.SetString(UIStringJoin.LogoUrl, _CurrentRoom.LogoUrl);
|
TriList.SetString(UIStringJoin.LogoUrlLightBkgnd, _CurrentRoom.LogoUrlLightBkgnd);
|
||||||
|
TriList.SetString(UIStringJoin.LogoUrlDarkBkgnd, _CurrentRoom.LogoUrlDarkBkgnd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -362,7 +416,7 @@ namespace PepperDash.Essentials
|
|||||||
HideAndClearCurrentDisplayModeSigsInUse();
|
HideAndClearCurrentDisplayModeSigsInUse();
|
||||||
TriList.SetBool(UIBoolJoin.TopBarHabaneroDynamicVisible, false);
|
TriList.SetBool(UIBoolJoin.TopBarHabaneroDynamicVisible, false);
|
||||||
TriList.BooleanInput[UIBoolJoin.ActivityFooterVisible].BoolValue = false;
|
TriList.BooleanInput[UIBoolJoin.ActivityFooterVisible].BoolValue = false;
|
||||||
TriList.BooleanInput[UIBoolJoin.StartPageVisible].BoolValue = false;
|
TriList.BooleanInput[StartPageVisibleJoin].BoolValue = false;
|
||||||
TriList.BooleanInput[UIBoolJoin.TapToBeginVisible].BoolValue = false;
|
TriList.BooleanInput[UIBoolJoin.TapToBeginVisible].BoolValue = false;
|
||||||
TriList.BooleanInput[UIBoolJoin.SelectASourceVisible].BoolValue = false;
|
TriList.BooleanInput[UIBoolJoin.SelectASourceVisible].BoolValue = false;
|
||||||
if (NextMeetingTimer != null)
|
if (NextMeetingTimer != null)
|
||||||
@@ -418,79 +472,92 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
void ShowNextMeetingTimerCallback()
|
void ShowNextMeetingTimerCallback()
|
||||||
{
|
{
|
||||||
|
//Update calendar for Zoom. Zoom doesn't automatically update when meetings are in the past
|
||||||
|
if (_isZoomRoomWithNoExternalSources)
|
||||||
|
{
|
||||||
|
CurrentRoom.ScheduleSource.GetSchedule();
|
||||||
|
}
|
||||||
|
|
||||||
// Every 60 seconds, refresh the calendar
|
// Every 60 seconds, refresh the calendar
|
||||||
RefreshMeetingsList();
|
RefreshMeetingsList();
|
||||||
// check meetings list for the closest, joinable meeting
|
// check meetings list for the closest, joinable meeting
|
||||||
var ss = CurrentRoom.ScheduleSource;
|
var ss = CurrentRoom.ScheduleSource;
|
||||||
var meetings = ss.CodecSchedule.Meetings;
|
var meetings = ss.CodecSchedule.Meetings;
|
||||||
|
|
||||||
if (meetings.Count > 0)
|
if (meetings.Count <= 0)
|
||||||
{
|
{
|
||||||
// If the room is off pester the user
|
return;
|
||||||
// If the room is on, and the meeting is joinable
|
}
|
||||||
// and the LastMeetingDismissed != this meeting
|
// If the room is off pester the user
|
||||||
|
// If the room is on, and the meeting is joinable
|
||||||
|
// and the LastMeetingDismissed != this meeting
|
||||||
|
|
||||||
var lastMeetingDismissed = meetings.FirstOrDefault(m => m.Id == LastMeetingDismissedId);
|
var lastMeetingDismissed = meetings.FirstOrDefault(m => m.Id == LastMeetingDismissedId);
|
||||||
Debug.Console(0, "*#* Room on: {0}, lastMeetingDismissedId: {1} {2} *#*",
|
Debug.Console(0, "*#* Room on: {0}, lastMeetingDismissedId: {1} {2} *#*",
|
||||||
CurrentRoom.OnFeedback.BoolValue,
|
CurrentRoom.OnFeedback.BoolValue,
|
||||||
LastMeetingDismissedId,
|
LastMeetingDismissedId,
|
||||||
lastMeetingDismissed != null ? lastMeetingDismissed.StartTime.ToShortTimeString() : "");
|
lastMeetingDismissed != null ? lastMeetingDismissed.StartTime.ToString("t", Global.Culture) : "");
|
||||||
|
|
||||||
var meeting = meetings.LastOrDefault(m => m.Joinable);
|
var meeting = meetings.LastOrDefault(m => m.Joinable);
|
||||||
if (CurrentRoom.OnFeedback.BoolValue
|
if (CurrentRoom.OnFeedback.BoolValue
|
||||||
&& lastMeetingDismissed == meeting)
|
&& lastMeetingDismissed == meeting)
|
||||||
{
|
{
|
||||||
return;
|
// meeting no longer joinable, hide popup
|
||||||
}
|
if(meeting == null)
|
||||||
|
HideNextMeetingPopup();
|
||||||
|
|
||||||
LastMeetingDismissedId = null;
|
return;
|
||||||
// Clear the popup when we run out of meetings
|
}
|
||||||
if (meeting == null)
|
|
||||||
{
|
|
||||||
HideNextMeetingPopup();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
TriList.SetString(UIStringJoin.MeetingsOrContactMethodListTitleText, "Upcoming meeting");
|
|
||||||
TriList.SetString(UIStringJoin.NextMeetingStartTimeText, meeting.StartTime.ToShortTimeString());
|
|
||||||
TriList.SetString(UIStringJoin.NextMeetingEndTimeText, meeting.EndTime.ToShortTimeString());
|
|
||||||
TriList.SetString(UIStringJoin.NextMeetingTitleText, meeting.Title);
|
|
||||||
TriList.SetString(UIStringJoin.NextMeetingNameText, meeting.Organizer);
|
|
||||||
TriList.SetString(UIStringJoin.NextMeetingButtonLabel, "Join");
|
|
||||||
TriList.SetSigFalseAction(UIBoolJoin.NextMeetingJoinPress, () =>
|
|
||||||
{
|
|
||||||
HideNextMeetingPopup();
|
|
||||||
PopupInterlock.Hide();
|
|
||||||
RoomOnAndDialMeeting(meeting);
|
|
||||||
});
|
|
||||||
TriList.SetString(UIStringJoin.NextMeetingSecondaryButtonLabel, "Show Schedule");
|
|
||||||
TriList.SetSigFalseAction(UIBoolJoin.CalendarHeaderButtonPress, () =>
|
|
||||||
{
|
|
||||||
HideNextMeetingPopup();
|
|
||||||
//CalendarPress();
|
|
||||||
RefreshMeetingsList();
|
|
||||||
PopupInterlock.ShowInterlocked(UIBoolJoin.MeetingsOrContacMethodsListVisible);
|
|
||||||
});
|
|
||||||
var indexOfNext = meetings.IndexOf(meeting) + 1;
|
|
||||||
|
|
||||||
// indexOf = 3, 4 meetings :
|
LastMeetingDismissedId = null;
|
||||||
if (indexOfNext < meetings.Count)
|
// Clear the popup when we run out of meetings
|
||||||
TriList.SetString(UIStringJoin.NextMeetingFollowingMeetingText,
|
if (meeting == null)
|
||||||
meetings[indexOfNext].StartTime.ToShortTimeString());
|
{
|
||||||
else
|
HideNextMeetingPopup();
|
||||||
TriList.SetString(UIStringJoin.NextMeetingFollowingMeetingText, "No more meetings today");
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
TriList.SetSigFalseAction(UIBoolJoin.NextMeetingModalClosePress, () =>
|
|
||||||
{
|
|
||||||
// Mark the meeting to not re-harass the user
|
|
||||||
if(CurrentRoom.OnFeedback.BoolValue)
|
|
||||||
LastMeetingDismissedId = meeting.Id;
|
|
||||||
HideNextMeetingPopup();
|
|
||||||
});
|
|
||||||
|
|
||||||
TriList.SetBool(UIBoolJoin.NextMeetingModalVisible, true);
|
TriList.SetString(UIStringJoin.MeetingsOrContactMethodListTitleText, "Upcoming meeting");
|
||||||
}
|
TriList.SetString(UIStringJoin.NextMeetingStartTimeText, meeting.StartTime.ToString("t", Global.Culture));
|
||||||
}
|
TriList.SetString(UIStringJoin.NextMeetingEndTimeText, meeting.EndTime.ToString("t", Global.Culture));
|
||||||
|
TriList.SetString(UIStringJoin.NextMeetingTitleText, meeting.Title);
|
||||||
|
TriList.SetString(UIStringJoin.NextMeetingNameText, meeting.Organizer);
|
||||||
|
TriList.SetString(UIStringJoin.NextMeetingButtonLabel, "Join");
|
||||||
|
TriList.SetSigFalseAction(UIBoolJoin.NextMeetingJoinPress, () =>
|
||||||
|
{
|
||||||
|
HideNextMeetingPopup();
|
||||||
|
PopupInterlock.Hide();
|
||||||
|
RoomOnAndDialMeeting(meeting);
|
||||||
|
});
|
||||||
|
TriList.SetString(UIStringJoin.NextMeetingSecondaryButtonLabel, "Show Schedule");
|
||||||
|
TriList.SetSigFalseAction(UIBoolJoin.CalendarHeaderButtonPress, () =>
|
||||||
|
{
|
||||||
|
HideNextMeetingPopup();
|
||||||
|
//CalendarPress();
|
||||||
|
RefreshMeetingsList();
|
||||||
|
PopupInterlock.ShowInterlocked(UIBoolJoin.MeetingsOrContacMethodsListVisible);
|
||||||
|
});
|
||||||
|
var indexOfNext = meetings.IndexOf(meeting) + 1;
|
||||||
|
|
||||||
|
// indexOf = 3, 4 meetings :
|
||||||
|
if (indexOfNext < meetings.Count)
|
||||||
|
TriList.SetString(UIStringJoin.NextMeetingFollowingMeetingText,
|
||||||
|
meetings[indexOfNext].StartTime.ToString("t", Global.Culture));
|
||||||
|
else
|
||||||
|
TriList.SetString(UIStringJoin.NextMeetingFollowingMeetingText, "No more meetings today");
|
||||||
|
|
||||||
|
TriList.SetSigFalseAction(UIBoolJoin.NextMeetingModalClosePress, () =>
|
||||||
|
{
|
||||||
|
// Mark the meeting to not re-harass the user
|
||||||
|
if(CurrentRoom.OnFeedback.BoolValue)
|
||||||
|
LastMeetingDismissedId = meeting.Id;
|
||||||
|
HideNextMeetingPopup();
|
||||||
|
});
|
||||||
|
|
||||||
|
TriList.SetBool(UIBoolJoin.NextMeetingModalVisible, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -516,19 +583,26 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
void RoomOnAndDialMeeting(Meeting meeting)
|
void RoomOnAndDialMeeting(Meeting meeting)
|
||||||
{
|
{
|
||||||
|
Debug.Console(1, "[RoomOnAndDialMeeting] Joining meeting [{0}]", meeting);
|
||||||
Action dialAction = () =>
|
Action dialAction = () =>
|
||||||
{
|
{
|
||||||
var d = CurrentRoom.ScheduleSource as VideoCodecBase;
|
var d = CurrentRoom.ScheduleSource as VideoCodecBase;
|
||||||
if (d != null)
|
if (d != null)
|
||||||
{
|
{
|
||||||
|
Debug.Console(1,
|
||||||
|
"[RoomOnAndDialMeeting] [dialAction] Sending command to codec to join meeting {0}", meeting);
|
||||||
d.Dial(meeting);
|
d.Dial(meeting);
|
||||||
LastMeetingDismissedId = meeting.Id; // To prevent prompts for already-joined call
|
LastMeetingDismissedId = meeting.Id; // To prevent prompts for already-joined call
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
if (CurrentRoom.OnFeedback.BoolValue)
|
if (CurrentRoom.OnFeedback.BoolValue)
|
||||||
dialAction();
|
{
|
||||||
|
Debug.Console(1, "[RoomOnAndDialMeeting] Room is on.");
|
||||||
|
dialAction();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Debug.Console(1, "RoomOnAndDialMeeting] Room is off or warming. Registering for Warming Feedback");
|
||||||
// Rig a one-time handler to catch when the room is warmed and then dial call
|
// Rig a one-time handler to catch when the room is warmed and then dial call
|
||||||
EventHandler<FeedbackEventArgs> oneTimeHandler = null;
|
EventHandler<FeedbackEventArgs> oneTimeHandler = null;
|
||||||
oneTimeHandler = (o, a) =>
|
oneTimeHandler = (o, a) =>
|
||||||
@@ -590,11 +664,39 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
void SetActivityFooterFeedbacks()
|
void SetActivityFooterFeedbacks()
|
||||||
{
|
{
|
||||||
CallButtonSig.BoolValue = CurrentMode == UiDisplayMode.Call
|
if (CurrentRoom != null)
|
||||||
&& CurrentRoom.ShutdownType == eShutdownType.None;
|
{
|
||||||
ShareButtonSig.BoolValue = CurrentMode == UiDisplayMode.Presentation
|
var startMode = CurrentMode == UiDisplayMode.Start;
|
||||||
&& CurrentRoom.ShutdownType == eShutdownType.None;
|
var presentationMode = CurrentMode == UiDisplayMode.Presentation;
|
||||||
EndMeetingButtonSig.BoolValue = CurrentRoom.ShutdownType != eShutdownType.None;
|
var callMode = CurrentMode == UiDisplayMode.Call;
|
||||||
|
|
||||||
|
TriList.SetBool(StartPageVisibleJoin, startMode ? true : false);
|
||||||
|
|
||||||
|
if (presentationMode &&_isZoomRoomWithNoExternalSources)
|
||||||
|
{
|
||||||
|
// For now, if this is a Zoom Room and there are no shareable sources just display the informational subpage
|
||||||
|
TriList.SetBool(UIBoolJoin.SourceStagingBarVisible, false);
|
||||||
|
TriList.SetBool(UIBoolJoin.ZoomRoomContentSharingVisible, true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Otherwise, show the staging bar
|
||||||
|
TriList.SetBool(UIBoolJoin.ZoomRoomContentSharingVisible, false);
|
||||||
|
TriList.SetBool(UIBoolJoin.SourceStagingBarVisible, presentationMode ? true : false);
|
||||||
|
|
||||||
|
}
|
||||||
|
if (!presentationMode)
|
||||||
|
{
|
||||||
|
TriList.SetBool(UIBoolJoin.ZoomRoomContentSharingVisible, false);
|
||||||
|
TriList.SetBool(UIBoolJoin.SelectASourceVisible, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
CallButtonSig.BoolValue = callMode
|
||||||
|
&& CurrentRoom.ShutdownType == eShutdownType.None;
|
||||||
|
ShareButtonSig.BoolValue = presentationMode
|
||||||
|
&& CurrentRoom.ShutdownType == eShutdownType.None;
|
||||||
|
EndMeetingButtonSig.BoolValue = CurrentRoom.ShutdownType != eShutdownType.None;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -606,14 +708,13 @@ namespace PepperDash.Essentials
|
|||||||
return;
|
return;
|
||||||
HideLogo();
|
HideLogo();
|
||||||
HideNextMeetingPopup();
|
HideNextMeetingPopup();
|
||||||
TriList.SetBool(UIBoolJoin.StartPageVisible, false);
|
//TriList.SetBool(StartPageVisibleJoin, false);
|
||||||
TriList.SetBool(UIBoolJoin.SourceStagingBarVisible, false);
|
//TriList.SetBool(UIBoolJoin.SourceStagingBarVisible, false);
|
||||||
TriList.SetBool(UIBoolJoin.SelectASourceVisible, false);
|
//TriList.SetBool(UIBoolJoin.SelectASourceVisible, false);
|
||||||
if (CurrentSourcePageManager != null)
|
if (CurrentSourcePageManager != null)
|
||||||
CurrentSourcePageManager.Hide();
|
CurrentSourcePageManager.Hide();
|
||||||
PowerOnFromCall();
|
PowerOnFromCall();
|
||||||
CurrentMode = UiDisplayMode.Call;
|
CurrentMode = UiDisplayMode.Call;
|
||||||
SetActivityFooterFeedbacks();
|
|
||||||
VCDriver.Show();
|
VCDriver.Show();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -626,29 +727,63 @@ namespace PepperDash.Essentials
|
|||||||
if (VCDriver.IsVisible)
|
if (VCDriver.IsVisible)
|
||||||
VCDriver.Hide();
|
VCDriver.Hide();
|
||||||
HideNextMeetingPopup();
|
HideNextMeetingPopup();
|
||||||
TriList.SetBool(UIBoolJoin.StartPageVisible, false);
|
|
||||||
TriList.SetBool(UIBoolJoin.CallStagingBarVisible, false);
|
|
||||||
TriList.SetBool(UIBoolJoin.SourceStagingBarVisible, true);
|
if (_isZoomRoomWithNoExternalSources)
|
||||||
// Run default source when room is off and share is pressed
|
|
||||||
if (!CurrentRoom.OnFeedback.BoolValue)
|
|
||||||
{
|
|
||||||
if (!CurrentRoom.OnFeedback.BoolValue)
|
|
||||||
{
|
|
||||||
// If there's no default, show UI elements
|
|
||||||
if (!CurrentRoom.RunDefaultPresentRoute())
|
|
||||||
TriList.SetBool(UIBoolJoin.SelectASourceVisible, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else // room is on show what's active or select a source if nothing is yet active
|
|
||||||
{
|
{
|
||||||
if(CurrentRoom.CurrentSourceInfo == null || CurrentRoom.CurrentSourceInfoKey == CurrentRoom.DefaultCodecRouteString)
|
if (!CurrentRoom.OnFeedback.BoolValue)
|
||||||
TriList.SetBool(UIBoolJoin.SelectASourceVisible, true);
|
{
|
||||||
else if (CurrentSourcePageManager != null)
|
CurrentRoom.RunDefaultPresentRoute();
|
||||||
CurrentSourcePageManager.Show();
|
}
|
||||||
|
// For now, if this is a Zoom Room and there are no shareable sources just display the informational subpage
|
||||||
|
TriList.SetBool(UIBoolJoin.ZoomRoomContentSharingVisible, true);
|
||||||
|
|
||||||
|
var presentationMeetingCodec = CurrentRoom.VideoCodec as IHasPresentationOnlyMeeting;
|
||||||
|
var farEndContentStatusCodec = CurrentRoom.VideoCodec as IHasFarEndContentStatus;
|
||||||
|
var receivingContent = false;
|
||||||
|
|
||||||
|
if (farEndContentStatusCodec != null)
|
||||||
|
{
|
||||||
|
receivingContent = farEndContentStatusCodec.ReceivingContent.BoolValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (presentationMeetingCodec != null && !CurrentRoom.VideoCodec.IsInCall)
|
||||||
|
{
|
||||||
|
presentationMeetingCodec.StartSharingOnlyMeeting(eSharingMeetingMode.Laptop);
|
||||||
|
}
|
||||||
|
else if (CurrentRoom.VideoCodec.IsInCall && !CurrentRoom.VideoCodec.SharingContentIsOnFeedback.BoolValue &&
|
||||||
|
!receivingContent)
|
||||||
|
{
|
||||||
|
CurrentRoom.VideoCodec.StartSharing();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CurrentSourcePageManager != null)
|
||||||
|
CurrentSourcePageManager.Hide();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Run default source when room is off and share is pressed
|
||||||
|
if (!CurrentRoom.OnFeedback.BoolValue)
|
||||||
|
{
|
||||||
|
// If there's no default, show UI elements
|
||||||
|
if (!(CurrentRoom as IRunDefaultPresentRoute).RunDefaultPresentRoute())
|
||||||
|
TriList.SetBool(UIBoolJoin.SelectASourceVisible, true);
|
||||||
|
}
|
||||||
|
else // room is on show what's active or select a source if nothing is yet active
|
||||||
|
{
|
||||||
|
if (CurrentRoom.CurrentSourceInfo == null ||
|
||||||
|
(CurrentRoom.VideoCodec != null &&
|
||||||
|
CurrentRoom.CurrentSourceInfo.SourceDevice.Key == CurrentRoom.VideoCodec.OsdSource.Key))
|
||||||
|
TriList.SetBool(UIBoolJoin.SelectASourceVisible, true);
|
||||||
|
else if (CurrentSourcePageManager != null)
|
||||||
|
{
|
||||||
|
TriList.SetBool(UIBoolJoin.SelectASourceVisible, false);
|
||||||
|
CurrentSourcePageManager.Show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SetupSourceList();
|
||||||
}
|
}
|
||||||
CurrentMode = UiDisplayMode.Presentation;
|
CurrentMode = UiDisplayMode.Presentation;
|
||||||
SetupSourceList();
|
|
||||||
SetActivityFooterFeedbacks();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -687,9 +822,11 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
void ShowCurrentSource()
|
void ShowCurrentSource()
|
||||||
{
|
{
|
||||||
if (CurrentRoom.CurrentSourceInfo == null)
|
if (CurrentRoom.CurrentSourceInfo == null || _isZoomRoomWithNoExternalSources)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
CurrentMode = UiDisplayMode.Presentation;
|
||||||
|
|
||||||
if (CurrentRoom.CurrentSourceInfo.SourceDevice == null)
|
if (CurrentRoom.CurrentSourceInfo.SourceDevice == null)
|
||||||
{
|
{
|
||||||
TriList.SetBool(UIBoolJoin.SelectASourceVisible, true);
|
TriList.SetBool(UIBoolJoin.SelectASourceVisible, true);
|
||||||
@@ -726,7 +863,7 @@ namespace PepperDash.Essentials
|
|||||||
void UiSelectSource(string key)
|
void UiSelectSource(string key)
|
||||||
{
|
{
|
||||||
// Run the route and when it calls back, show the source
|
// Run the route and when it calls back, show the source
|
||||||
CurrentRoom.RunRouteAction(key, new Action(() => { }));
|
CurrentRoom.RunRouteAction(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -877,7 +1014,7 @@ namespace PepperDash.Essentials
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Helper for property setter. Sets the panel to the given room, latching up all functionality
|
/// Helper for property setter. Sets the panel to the given room, latching up all functionality
|
||||||
/// </summary>
|
/// </summary>
|
||||||
void RefreshCurrentRoom(EssentialsHuddleVtc1Room room)
|
void RefreshCurrentRoom(IEssentialsHuddleVtc1Room room)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (_CurrentRoom != null)
|
if (_CurrentRoom != null)
|
||||||
@@ -895,6 +1032,18 @@ namespace PepperDash.Essentials
|
|||||||
_CurrentRoom.IsWarmingUpFeedback.OutputChange -= CurrentRoom_IsWarmingFeedback_OutputChange;
|
_CurrentRoom.IsWarmingUpFeedback.OutputChange -= CurrentRoom_IsWarmingFeedback_OutputChange;
|
||||||
_CurrentRoom.IsCoolingDownFeedback.OutputChange -= CurrentRoom_IsCoolingDownFeedback_OutputChange;
|
_CurrentRoom.IsCoolingDownFeedback.OutputChange -= CurrentRoom_IsCoolingDownFeedback_OutputChange;
|
||||||
_CurrentRoom.InCallFeedback.OutputChange -= CurrentRoom_InCallFeedback_OutputChange;
|
_CurrentRoom.InCallFeedback.OutputChange -= CurrentRoom_InCallFeedback_OutputChange;
|
||||||
|
|
||||||
|
var scheduleAwareCodec = _CurrentRoom.VideoCodec as IHasScheduleAwareness;
|
||||||
|
if (scheduleAwareCodec != null)
|
||||||
|
{
|
||||||
|
scheduleAwareCodec.CodecSchedule.MeetingsListHasChanged -= CodecSchedule_MeetingsListHasChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
var meetingInfoCodec = _CurrentRoom.VideoCodec as IHasMeetingInfo;
|
||||||
|
if (meetingInfoCodec != null)
|
||||||
|
{
|
||||||
|
meetingInfoCodec.MeetingInfoChanged -= meetingInfoCodec_MeetingInfoChanged;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_CurrentRoom = room;
|
_CurrentRoom = room;
|
||||||
@@ -927,9 +1076,23 @@ namespace PepperDash.Essentials
|
|||||||
_CurrentRoom.CurrentSourceChange += CurrentRoom_SourceInfoChange;
|
_CurrentRoom.CurrentSourceChange += CurrentRoom_SourceInfoChange;
|
||||||
RefreshSourceInfo();
|
RefreshSourceInfo();
|
||||||
|
|
||||||
if (_CurrentRoom.VideoCodec is IHasScheduleAwareness)
|
|
||||||
|
var scheduleAwareCodec = _CurrentRoom.VideoCodec as IHasScheduleAwareness;
|
||||||
|
if (scheduleAwareCodec != null)
|
||||||
{
|
{
|
||||||
(_CurrentRoom.VideoCodec as IHasScheduleAwareness).CodecSchedule.MeetingsListHasChanged += CodecSchedule_MeetingsListHasChanged;
|
scheduleAwareCodec.CodecSchedule.MeetingsListHasChanged += CodecSchedule_MeetingsListHasChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
var meetingInfoCodec = _CurrentRoom.VideoCodec as IHasMeetingInfo;
|
||||||
|
if (meetingInfoCodec != null)
|
||||||
|
{
|
||||||
|
meetingInfoCodec.MeetingInfoChanged += new EventHandler<MeetingInfoEventArgs>(meetingInfoCodec_MeetingInfoChanged);
|
||||||
|
|
||||||
|
CallListOrMeetingInfoPopoverVisibilityJoin = UIBoolJoin.HeaderMeetingInfoVisible;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CallListOrMeetingInfoPopoverVisibilityJoin = UIBoolJoin.HeaderActiveCallsListVisible;
|
||||||
}
|
}
|
||||||
|
|
||||||
CallSharingInfoVisibleFeedback = new BoolFeedback(() => _CurrentRoom.VideoCodec.SharingContentIsOnFeedback.BoolValue);
|
CallSharingInfoVisibleFeedback = new BoolFeedback(() => _CurrentRoom.VideoCodec.SharingContentIsOnFeedback.BoolValue);
|
||||||
@@ -941,7 +1104,8 @@ namespace PepperDash.Essentials
|
|||||||
if (_CurrentRoom != null)
|
if (_CurrentRoom != null)
|
||||||
_CurrentRoom.CurrentSourceChange += new SourceInfoChangeHandler(CurrentRoom_CurrentSingleSourceChange);
|
_CurrentRoom.CurrentSourceChange += new SourceInfoChangeHandler(CurrentRoom_CurrentSingleSourceChange);
|
||||||
|
|
||||||
TriList.SetSigFalseAction(UIBoolJoin.CallStopSharingPress, () => _CurrentRoom.RunRouteAction("codecOsd", _CurrentRoom.SourceListKey));
|
// Moved to EssentialsVideoCodecUiDriver
|
||||||
|
//TriList.SetSigFalseAction(UIBoolJoin.CallStopSharingPress, () => _CurrentRoom.RunRouteAction("codecOsd", _CurrentRoom.SourceListKey));
|
||||||
|
|
||||||
(Parent as EssentialsPanelMainInterfaceDriver).HeaderDriver.SetupHeaderButtons(this, CurrentRoom);
|
(Parent as EssentialsPanelMainInterfaceDriver).HeaderDriver.SetupHeaderButtons(this, CurrentRoom);
|
||||||
}
|
}
|
||||||
@@ -952,17 +1116,68 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetCurrentRoom(EssentialsHuddleVtc1Room room)
|
void meetingInfoCodec_MeetingInfoChanged(object sender, MeetingInfoEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.Info == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
TriList.SetString(UIStringJoin.MeetingIdText, e.Info.Id);
|
||||||
|
TriList.SetString(UIStringJoin.MeetingHostText, e.Info.Host);
|
||||||
|
TriList.SetString(UIStringJoin.MeetingNameText, e.Info.Name);
|
||||||
|
|
||||||
|
TriList.SetString(UIStringJoin.MeetingPasswordText, e.Info.Password);
|
||||||
|
// Show the password fields if one is present
|
||||||
|
TriList.SetBool(UIBoolJoin.MeetingPasswordVisible, !string.IsNullOrEmpty(e.Info.Password));
|
||||||
|
|
||||||
|
TriList.SetString(UIStringJoin.CallSharedSourceNameText, e.Info.ShareStatus);
|
||||||
|
|
||||||
|
TriList.SetString(UIStringJoin.MeetingLeaveText, e.Info.IsHost ? "End Meeting" : "Leave Meeting");
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetCurrentRoom(IEssentialsHuddleVtc1Room room)
|
||||||
{
|
{
|
||||||
if (_CurrentRoom == room) return;
|
if (_CurrentRoom == room) return;
|
||||||
// Disconnect current (probably never called)
|
// Disconnect current (probably never called)
|
||||||
|
|
||||||
|
if(_CurrentRoom != null)
|
||||||
|
_CurrentRoom.ConfigChanged -= room_ConfigChanged;
|
||||||
|
|
||||||
room.ConfigChanged -= room_ConfigChanged;
|
room.ConfigChanged -= room_ConfigChanged;
|
||||||
room.ConfigChanged += room_ConfigChanged;
|
room.ConfigChanged += room_ConfigChanged;
|
||||||
|
|
||||||
|
if (room.IsMobileControlEnabled)
|
||||||
|
{
|
||||||
|
StartPageVisibleJoin = UIBoolJoin.StartMCPageVisible;
|
||||||
|
UpdateMCJoins(room);
|
||||||
|
|
||||||
|
if (_CurrentRoom != null)
|
||||||
|
_CurrentRoom.MobileControlRoomBridge.UserCodeChanged -= MobileControlRoomBridge_UserCodeChanged;
|
||||||
|
|
||||||
|
room.MobileControlRoomBridge.UserCodeChanged -= MobileControlRoomBridge_UserCodeChanged;
|
||||||
|
room.MobileControlRoomBridge.UserCodeChanged += MobileControlRoomBridge_UserCodeChanged;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
StartPageVisibleJoin = UIBoolJoin.StartPageVisible;
|
||||||
|
}
|
||||||
|
|
||||||
RefreshCurrentRoom(room);
|
RefreshCurrentRoom(room);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MobileControlRoomBridge_UserCodeChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
UpdateMCJoins(_CurrentRoom);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateMCJoins(IEssentialsHuddleVtc1Room room)
|
||||||
|
{
|
||||||
|
TriList.SetString(UIStringJoin.RoomMcUrl, room.MobileControlRoomBridge.McServerUrl);
|
||||||
|
TriList.SetString(UIStringJoin.RoomMcQrCodeUrl, room.MobileControlRoomBridge.QrCodeUrl);
|
||||||
|
TriList.SetString(UIStringJoin.RoomUserCode, room.MobileControlRoomBridge.UserCode);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Fires when room config of current room has changed. Meant to refresh room values to propegate any updates to UI
|
/// Fires when room config of current room has changed. Meant to refresh room values to propegate any updates to UI
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -987,7 +1202,7 @@ namespace PepperDash.Essentials
|
|||||||
if (CurrentRoom.CurrentSourceInfo != null && CurrentRoom.CurrentSourceInfo.DisableCodecSharing)
|
if (CurrentRoom.CurrentSourceInfo != null && CurrentRoom.CurrentSourceInfo.DisableCodecSharing)
|
||||||
{
|
{
|
||||||
Debug.Console(1, CurrentRoom, "Transitioning to in-call, cancelling non-sharable source");
|
Debug.Console(1, CurrentRoom, "Transitioning to in-call, cancelling non-sharable source");
|
||||||
CurrentRoom.RunRouteAction("codecOsd", CurrentRoom.SourceListKey);
|
CurrentRoom.RunRouteAction("codecOsd");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -999,12 +1214,15 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
void SetupSourceList()
|
void SetupSourceList()
|
||||||
{
|
{
|
||||||
|
|
||||||
var inCall = CurrentRoom.InCallFeedback.BoolValue;
|
var inCall = CurrentRoom.InCallFeedback.BoolValue;
|
||||||
var config = ConfigReader.ConfigObject.SourceLists;
|
var config = ConfigReader.ConfigObject.SourceLists;
|
||||||
|
|
||||||
|
|
||||||
if (config.ContainsKey(_CurrentRoom.SourceListKey))
|
if (config.ContainsKey(_CurrentRoom.SourceListKey))
|
||||||
{
|
{
|
||||||
var srcList = config[_CurrentRoom.SourceListKey].OrderBy(kv => kv.Value.Order);
|
var srcList = config[_CurrentRoom.SourceListKey].OrderBy(kv => kv.Value.Order);
|
||||||
|
|
||||||
|
|
||||||
// Setup sources list
|
// Setup sources list
|
||||||
SourceStagingSrl.Clear();
|
SourceStagingSrl.Clear();
|
||||||
@@ -1028,8 +1246,11 @@ namespace PepperDash.Essentials
|
|||||||
b => { if (!b) UiSelectSource(routeKey); });
|
b => { if (!b) UiSelectSource(routeKey); });
|
||||||
SourceStagingSrl.AddItem(item); // add to the SRL
|
SourceStagingSrl.AddItem(item); // add to the SRL
|
||||||
item.RegisterForSourceChange(_CurrentRoom);
|
item.RegisterForSourceChange(_CurrentRoom);
|
||||||
|
Debug.Console(1, "**** KEY {0}", kvp.Key);
|
||||||
|
|
||||||
}
|
}
|
||||||
SourceStagingSrl.Count = (ushort)(i - 1);
|
_sourceListCount = (i - 1);
|
||||||
|
SourceStagingSrl.Count = (ushort)_sourceListCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1052,6 +1273,30 @@ namespace PepperDash.Essentials
|
|||||||
/// <param name="type"></param>
|
/// <param name="type"></param>
|
||||||
void CurrentRoom_CurrentSingleSourceChange(SourceListItem info, ChangeType type)
|
void CurrentRoom_CurrentSingleSourceChange(SourceListItem info, ChangeType type)
|
||||||
{
|
{
|
||||||
|
Debug.Console(1, "AvFunctionsDriver: CurrentSingleSourceChange");
|
||||||
|
|
||||||
|
// Show the Select a source subpage
|
||||||
|
if (TriList.BooleanInput[UIBoolJoin.SourceStagingBarVisible].BoolValue)
|
||||||
|
{
|
||||||
|
Debug.Console(1, "AvFunctionsDriver: CurrentSingleSourceChange SourceStagingBarVisisble: true");
|
||||||
|
|
||||||
|
if (_CurrentRoom.CurrentSourceInfo == null || (_CurrentRoom.VideoCodec != null && _CurrentRoom.CurrentSourceInfo.SourceDevice.Key == _CurrentRoom.VideoCodec.OsdSource.Key))
|
||||||
|
{
|
||||||
|
Debug.Console(1, "AvFunctionsDriver: CurrentSingleSourceChange Showing SelectASourceVisible");
|
||||||
|
TriList.SetBool(UIBoolJoin.SelectASourceVisible, true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TriList.SetBool(UIBoolJoin.SelectASourceVisible, false);
|
||||||
|
Debug.Console(1, "AvFunctionsDriver: CurrentSingleSourceChange Hiding SelectASourceVisible");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Console(1, "AvFunctionsDriver: CurrentSingleSourceChange Hiding SelectASourceVisible");
|
||||||
|
TriList.SetBool(UIBoolJoin.SelectASourceVisible, false);
|
||||||
|
}
|
||||||
|
|
||||||
if (_CurrentRoom.VideoCodec.SharingContentIsOnFeedback.BoolValue && _CurrentRoom.CurrentSourceInfo != null)
|
if (_CurrentRoom.VideoCodec.SharingContentIsOnFeedback.BoolValue && _CurrentRoom.CurrentSourceInfo != null)
|
||||||
TriList.StringInput[UIStringJoin.CallSharedSourceNameText].StringValue = _CurrentRoom.CurrentSourceInfo.PreferredName;
|
TriList.StringInput[UIStringJoin.CallSharedSourceNameText].StringValue = _CurrentRoom.CurrentSourceInfo.PreferredName;
|
||||||
}
|
}
|
||||||
@@ -1094,17 +1339,16 @@ namespace PepperDash.Essentials
|
|||||||
{
|
{
|
||||||
// See if this is helpful or if the callback response in the codec class maybe doesn't come it time?
|
// See if this is helpful or if the callback response in the codec class maybe doesn't come it time?
|
||||||
// Let's build list from event
|
// Let's build list from event
|
||||||
// CurrentRoom.ScheduleSource.GetSchedule();
|
|
||||||
|
|
||||||
TriList.SetString(UIStringJoin.MeetingsOrContactMethodListIcon, "Calendar");
|
TriList.SetString(UIStringJoin.MeetingsOrContactMethodListIcon, "Calendar");
|
||||||
TriList.SetString(UIStringJoin.MeetingsOrContactMethodListTitleText, "Today's Meetings");
|
TriList.SetString(UIStringJoin.MeetingsOrContactMethodListTitleText, "Today's Meetings");
|
||||||
|
|
||||||
ushort i = 0;
|
ushort i = 0;
|
||||||
foreach (var m in CurrentRoom.ScheduleSource.CodecSchedule.Meetings)
|
foreach (var m in CurrentRoom.ScheduleSource.CodecSchedule.Meetings)
|
||||||
{
|
{
|
||||||
i++;
|
i++;
|
||||||
MeetingOrContactMethodModalSrl.StringInputSig(i, 1).StringValue = m.StartTime.ToShortTimeString();
|
MeetingOrContactMethodModalSrl.StringInputSig(i, 1).StringValue = m.StartTime.ToString("t", Global.Culture);
|
||||||
MeetingOrContactMethodModalSrl.StringInputSig(i, 2).StringValue = m.EndTime.ToShortTimeString();
|
MeetingOrContactMethodModalSrl.StringInputSig(i, 2).StringValue = m.EndTime.ToString("t", Global.Culture);
|
||||||
MeetingOrContactMethodModalSrl.StringInputSig(i, 3).StringValue = m.Title;
|
MeetingOrContactMethodModalSrl.StringInputSig(i, 3).StringValue = m.Title;
|
||||||
MeetingOrContactMethodModalSrl.StringInputSig(i, 4).StringValue = string.Format("<br>{0}",m.Organizer);
|
MeetingOrContactMethodModalSrl.StringInputSig(i, 4).StringValue = string.Format("<br>{0}",m.Organizer);
|
||||||
MeetingOrContactMethodModalSrl.StringInputSig(i, 5).StringValue = "Join";
|
MeetingOrContactMethodModalSrl.StringInputSig(i, 5).StringValue = "Join";
|
||||||
@@ -1149,12 +1393,12 @@ namespace PepperDash.Essentials
|
|||||||
var value = _CurrentRoom.OnFeedback.BoolValue;
|
var value = _CurrentRoom.OnFeedback.BoolValue;
|
||||||
TriList.BooleanInput[UIBoolJoin.RoomIsOn].BoolValue = value;
|
TriList.BooleanInput[UIBoolJoin.RoomIsOn].BoolValue = value;
|
||||||
|
|
||||||
TriList.BooleanInput[UIBoolJoin.StartPageVisible].BoolValue = !value;
|
//TriList.BooleanInput[StartPageVisibleJoin].BoolValue = !value;
|
||||||
|
|
||||||
if (value) //ON
|
if (value) //ON
|
||||||
{
|
{
|
||||||
SetupActivityFooterWhenRoomOn();
|
SetupActivityFooterWhenRoomOn();
|
||||||
TriList.BooleanInput[UIBoolJoin.SelectASourceVisible].BoolValue = false;
|
//TriList.BooleanInput[UIBoolJoin.SelectASourceVisible].BoolValue = false;
|
||||||
TriList.BooleanInput[UIBoolJoin.VolumeDualMute1Visible].BoolValue = true;
|
TriList.BooleanInput[UIBoolJoin.VolumeDualMute1Visible].BoolValue = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1165,9 +1409,8 @@ namespace PepperDash.Essentials
|
|||||||
VCDriver.Hide();
|
VCDriver.Hide();
|
||||||
SetupActivityFooterWhenRoomOff();
|
SetupActivityFooterWhenRoomOff();
|
||||||
ShowLogo();
|
ShowLogo();
|
||||||
SetActivityFooterFeedbacks();
|
//TriList.BooleanInput[UIBoolJoin.VolumeDualMute1Visible].BoolValue = false;
|
||||||
TriList.BooleanInput[UIBoolJoin.VolumeDualMute1Visible].BoolValue = false;
|
//TriList.BooleanInput[UIBoolJoin.SourceStagingBarVisible].BoolValue = false;
|
||||||
TriList.BooleanInput[UIBoolJoin.SourceStagingBarVisible].BoolValue = false;
|
|
||||||
// Clear this so that the pesky meeting warning can resurface every minute when off
|
// Clear this so that the pesky meeting warning can resurface every minute when off
|
||||||
LastMeetingDismissedId = null;
|
LastMeetingDismissedId = null;
|
||||||
}
|
}
|
||||||
@@ -1240,8 +1483,8 @@ namespace PepperDash.Essentials
|
|||||||
(previousDev as IDvr).UnlinkButtons(TriList);
|
(previousDev as IDvr).UnlinkButtons(TriList);
|
||||||
if (previousDev is INumericKeypad)
|
if (previousDev is INumericKeypad)
|
||||||
(previousDev as INumericKeypad).UnlinkButtons(TriList);
|
(previousDev as INumericKeypad).UnlinkButtons(TriList);
|
||||||
if (previousDev is IPower)
|
if (previousDev is IHasPowerControl)
|
||||||
(previousDev as IPower).UnlinkButtons(TriList);
|
(previousDev as IHasPowerControl).UnlinkButtons(TriList);
|
||||||
if (previousDev is ITransport)
|
if (previousDev is ITransport)
|
||||||
(previousDev as ITransport).UnlinkButtons(TriList);
|
(previousDev as ITransport).UnlinkButtons(TriList);
|
||||||
}
|
}
|
||||||
@@ -1298,8 +1541,8 @@ namespace PepperDash.Essentials
|
|||||||
(dev as IDvr).LinkButtons(TriList);
|
(dev as IDvr).LinkButtons(TriList);
|
||||||
if (dev is INumericKeypad)
|
if (dev is INumericKeypad)
|
||||||
(dev as INumericKeypad).LinkButtons(TriList);
|
(dev as INumericKeypad).LinkButtons(TriList);
|
||||||
if (dev is IPower)
|
if (dev is IHasPowerControl)
|
||||||
(dev as IPower).LinkButtons(TriList);
|
(dev as IHasPowerControl).LinkButtons(TriList);
|
||||||
if (dev is ITransport)
|
if (dev is ITransport)
|
||||||
(dev as ITransport).LinkButtons(TriList);
|
(dev as ITransport).LinkButtons(TriList);
|
||||||
}
|
}
|
||||||
@@ -1377,10 +1620,12 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IAVDriver
|
public interface IAVDriver
|
||||||
{
|
{
|
||||||
|
PanelDriverBase Parent { get; }
|
||||||
JoinedSigInterlock PopupInterlock { get; }
|
JoinedSigInterlock PopupInterlock { get; }
|
||||||
void ShowNotificationRibbon(string message, int timeout);
|
void ShowNotificationRibbon(string message, int timeout);
|
||||||
void HideNotificationRibbon();
|
void HideNotificationRibbon();
|
||||||
void ShowTech();
|
void ShowTech();
|
||||||
|
uint StartPageVisibleJoin { get; }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -1388,7 +1633,7 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IAVWithVCDriver : IAVDriver
|
public interface IAVWithVCDriver : IAVDriver
|
||||||
{
|
{
|
||||||
EssentialsHuddleVtc1Room CurrentRoom { get; }
|
IEssentialsHuddleVtc1Room CurrentRoom { get; }
|
||||||
|
|
||||||
PepperDash.Essentials.Core.Touchpanels.Keyboards.HabaneroKeyboardController Keyboard { get; }
|
PepperDash.Essentials.Core.Touchpanels.Keyboards.HabaneroKeyboardController Keyboard { get; }
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -1400,6 +1645,8 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
void PrepareForCodecIncomingCall();
|
void PrepareForCodecIncomingCall();
|
||||||
|
|
||||||
|
uint CallListOrMeetingInfoPopoverVisibilityJoin { get; }
|
||||||
|
|
||||||
SubpageReferenceList MeetingOrContactMethodModalSrl { get; }
|
SubpageReferenceList MeetingOrContactMethodModalSrl { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
137
PepperDashEssentials/UIDrivers/ScreenSaverController.cs
Normal file
137
PepperDashEssentials/UIDrivers/ScreenSaverController.cs
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using Crestron.SimplSharp;
|
||||||
|
|
||||||
|
using PepperDash.Core;
|
||||||
|
using PepperDash.Essentials.Core;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Driver responsible for controlling the screenshaver showing the client logo, MC connection information and QR Code. Moves the elements around to prevent screen burn in
|
||||||
|
/// </summary>
|
||||||
|
public class ScreenSaverController : PanelDriverBase
|
||||||
|
{
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The parent driver for this
|
||||||
|
/// </summary>
|
||||||
|
private readonly EssentialsPanelMainInterfaceDriver _parent;
|
||||||
|
|
||||||
|
|
||||||
|
private JoinedSigInterlock PositionInterlock;
|
||||||
|
|
||||||
|
CTimer PositionTimer;
|
||||||
|
|
||||||
|
uint PositionTimeoutMs;
|
||||||
|
|
||||||
|
List<uint> PositionJoins;
|
||||||
|
|
||||||
|
int CurrentPositionIndex = 0;
|
||||||
|
|
||||||
|
public ScreenSaverController(EssentialsPanelMainInterfaceDriver parent, CrestronTouchpanelPropertiesConfig config)
|
||||||
|
: base(parent.TriList)
|
||||||
|
{
|
||||||
|
_parent = parent;
|
||||||
|
|
||||||
|
PositionTimeoutMs = config.ScreenSaverMovePositionIntervalMs;
|
||||||
|
|
||||||
|
PositionJoins = new List<uint>() { UIBoolJoin.MCScreenSaverPosition1Visible, UIBoolJoin.MCScreenSaverPosition2Visible, UIBoolJoin.MCScreenSaverPosition3Visible, UIBoolJoin.MCScreenSaverPosition4Visible };
|
||||||
|
|
||||||
|
PositionInterlock = new JoinedSigInterlock(parent.TriList);
|
||||||
|
|
||||||
|
var cmdName = String.Format("shwscrsvr-{0}", parent.TriList.ID);
|
||||||
|
|
||||||
|
CrestronConsole.AddNewConsoleCommand((o) => Show(), cmdName, "Shows Panel Screensaver", ConsoleAccessLevelEnum.AccessOperator);
|
||||||
|
|
||||||
|
TriList.SetSigFalseAction(UIBoolJoin.MCScreenSaverClosePress, Hide);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Show()
|
||||||
|
{
|
||||||
|
if (_parent.AvDriver != null)
|
||||||
|
{
|
||||||
|
_parent.AvDriver.PopupInterlock.ShowInterlocked(UIBoolJoin.MCScreenSaverVisible);
|
||||||
|
}
|
||||||
|
|
||||||
|
CurrentPositionIndex = 0;
|
||||||
|
ShowCurrentPosition();
|
||||||
|
StartPositionTimer();
|
||||||
|
|
||||||
|
base.Show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Hide()
|
||||||
|
{
|
||||||
|
Debug.Console(1, "Hiding ScreenSaverController");
|
||||||
|
|
||||||
|
if (PositionTimer != null)
|
||||||
|
{
|
||||||
|
PositionTimer.Stop();
|
||||||
|
PositionTimer.Dispose();
|
||||||
|
PositionTimer = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
ClearAllPositions();
|
||||||
|
|
||||||
|
if (_parent.AvDriver != null)
|
||||||
|
{
|
||||||
|
_parent.AvDriver.PopupInterlock.HideAndClear();
|
||||||
|
}
|
||||||
|
|
||||||
|
base.Hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
void StartPositionTimer()
|
||||||
|
{
|
||||||
|
if (PositionTimer == null)
|
||||||
|
{
|
||||||
|
PositionTimer = new CTimer((o) => PositionTimerExpired(), PositionTimeoutMs);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PositionTimer.Reset(PositionTimeoutMs);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void PositionTimerExpired()
|
||||||
|
{
|
||||||
|
IncrementPositionIndex();
|
||||||
|
|
||||||
|
ShowCurrentPosition();
|
||||||
|
|
||||||
|
StartPositionTimer();
|
||||||
|
}
|
||||||
|
|
||||||
|
void IncrementPositionIndex()
|
||||||
|
{
|
||||||
|
if (CurrentPositionIndex < PositionJoins.Count - 1)
|
||||||
|
{
|
||||||
|
CurrentPositionIndex++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CurrentPositionIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.Console(1, "ScreenSaver Position Timer Expired: Setting new position: {0}", CurrentPositionIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
void ShowCurrentPosition()
|
||||||
|
{
|
||||||
|
// Set based on current index
|
||||||
|
PositionInterlock.ShowInterlocked(PositionJoins[CurrentPositionIndex]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClearAllPositions()
|
||||||
|
{
|
||||||
|
Debug.Console(1, "Hiding all screensaver positions");
|
||||||
|
PositionInterlock.HideAndClear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -38,7 +38,7 @@ namespace PepperDash.Essentials
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets feedback for the given room
|
/// Sets feedback for the given room
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void SetFeedbackForRoom(EssentialsHuddleSpaceRoom room)
|
public void SetFeedbackForRoom(IEssentialsHuddleSpaceRoom room)
|
||||||
{
|
{
|
||||||
var itemToSet = Items.FirstOrDefault(i => i.Room == room);
|
var itemToSet = Items.FirstOrDefault(i => i.Room == room);
|
||||||
if (itemToSet != null)
|
if (itemToSet != null)
|
||||||
@@ -48,11 +48,11 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
public class SmartObjectRoomsListItem
|
public class SmartObjectRoomsListItem
|
||||||
{
|
{
|
||||||
public EssentialsHuddleSpaceRoom Room { get; private set; }
|
public IEssentialsHuddleSpaceRoom Room { get; private set; }
|
||||||
SmartObjectRoomsList Parent;
|
SmartObjectRoomsList Parent;
|
||||||
public uint Index { get; private set; }
|
public uint Index { get; private set; }
|
||||||
|
|
||||||
public SmartObjectRoomsListItem(EssentialsHuddleSpaceRoom room, uint index, SmartObjectRoomsList parent,
|
public SmartObjectRoomsListItem(IEssentialsHuddleSpaceRoom room, uint index, SmartObjectRoomsList parent,
|
||||||
Action<bool> buttonAction)
|
Action<bool> buttonAction)
|
||||||
{
|
{
|
||||||
Room = room;
|
Room = room;
|
||||||
|
|||||||
@@ -12,5 +12,5 @@ namespace PepperDash.Essentials
|
|||||||
///// <summary>
|
///// <summary>
|
||||||
///// The handler type for a Room's SourceInfoChange
|
///// The handler type for a Room's SourceInfoChange
|
||||||
///// </summary>
|
///// </summary>
|
||||||
//public delegate void SourceInfoChangeHandler(EssentialsRoomBase room, SourceListItem info, ChangeType type);
|
//public delegate void SourceInfoChangeHandler(IEssentialsRoom room, SourceListItem info, ChangeType type);
|
||||||
}
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
31
README.md
31
README.md
@@ -1,26 +1,39 @@
|
|||||||
|
|
||||||
# PepperDash Essentials Framework (c) 2020
|
# PepperDash Essentials Framework (c) 2020
|
||||||
|
|
||||||
## [Latest Release](https://github.com/PepperDash/Essentials/releases/latest)
|
## [Latest Release](https://github.com/PepperDash/Essentials/releases/latest)
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
Provided under MIT license
|
Provided under MIT license
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
PepperDash Essentials is an open source Crestron framework that can be configured as a standalone program capable of running a wide variety of system designs and can also be utilized as a plug-in architecture to augment other Simpl# Pro and Simpl Windows programs.
|
PepperDash Essentials is an open source Crestron framework that can be configured as a standalone program capable of running a wide variety of system designs and can also be utilized as a plug-in architecture to augment other Simpl# Pro and Simpl Windows programs.
|
||||||
|
|
||||||
Essentials Framework is a collection of C# / Simpl# Pro libraries that can be utilized in several different manners. It is currently operating as a 100% configuration-driven system, and can be extended to add different workflows and behaviors, either through the addition of further device "types" or via the plug-in mechanism. The framework is a collection of "things" that are all related and interconnected, but in general do not have dependencies on each other.
|
Essentials Framework is a collection of C# / Simpl# Pro libraries that can be utilized in several different manners. It is currently operating as a 100% configuration-driven system, and can be extended to add different workflows and behaviors, either through the addition of further device "types" or via the plug-in mechanism. The framework is a collection of "things" that are all related and interconnected, but in general do not have dependencies on each other.
|
||||||
|
|
||||||
## Minimum Requirements
|
## Minimum Requirements
|
||||||
|
|
||||||
- Essentials Framework runs on any Crestron 3-series processor, **4-series** processor or Crestron's VC-4 platform.
|
- Essentials Framework runs on any Crestron 3-series processor, **4-series** processor or Crestron's VC-4 platform.
|
||||||
- To edit and compile the source, Microsoft Visual Studio 2008 Professional with SP1 is required.
|
- To edit and compile the source, Microsoft Visual Studio 2008 Professional with SP1 is required.
|
||||||
- Crestron's Simpl# Plugin is also required (must be obtained from Crestron).
|
- Crestron's Simpl# Plugin is also required (must be obtained from Crestron).
|
||||||
|
|
||||||
## Dependencies
|
## Dependencies
|
||||||
|
|
||||||
The [PepperDash.Core](https://github.com/PepperDash/PepperDashCore) SIMPL# library is required. It is referenced as a submodule and will be automatically checked out when cloning this repo if set to recurse submodules. This allows different builds of the PepperDash.Core library to be referenced by checking out the desired submodule commit.
|
The [PepperDash.Core](https://github.com/PepperDash/PepperDashCore) SIMPL# library is required. It is referenced via nuget. You must have nuget.exe installed and in the `PATH` environment variable to use the following command. Nuget.exe is available at [nuget.org](https://dist.nuget.org/win-x86-commandline/latest/nuget.exe).
|
||||||
|
|
||||||
|
### Installing Dependencies
|
||||||
|
|
||||||
|
To install dependencies once nuget.exe is installed, run the following command:
|
||||||
|
`nuget install .\packages.config -OutputDirectory .\packages -excludeVersion`.
|
||||||
|
To verify that the packages installed correctly, open Essentials and make sure that all references are found, then try and build it.
|
||||||
|
|
||||||
|
### Installing Different versions of PepperDash Core
|
||||||
|
|
||||||
|
If you need a different version of PepperDash Core, use the command `nuget install .\packages.config -OutputDirectory .\packages -excludeVersion -Version {versionToGet}`. Omitting the `-Version` option will pull the version indicated in the packages.config file.
|
||||||
|
|
||||||
## Utilization
|
## Utilization
|
||||||
|
|
||||||
Essentials was originally conceptualized as a standalone application for running control system logic entirely in Simpl# Pro. It is primarily designed around accomplishing this goal, but during development, it became obvious that it could easily be leveraged to also serve as a partner application to one or more SIMPL Windows programs.
|
Essentials was originally conceptualized as a standalone application for running control system logic entirely in Simpl# Pro. It is primarily designed around accomplishing this goal, but during development, it became obvious that it could easily be leveraged to also serve as a partner application to one or more SIMPL Windows programs.
|
||||||
|
|
||||||
Utilization of Essentials Framework falls into the following categories:
|
Utilization of Essentials Framework falls into the following categories:
|
||||||
@@ -34,13 +47,17 @@ Utilization of Essentials Framework falls into the following categories:
|
|||||||
- Advanced logic. Some logic operations that cannot be affectively accomplished in SIMPL Windows (ex. JSON/XML serialization/deserialization, database operations, etc.) can be done in the Simpl# Pro environment and the necessary input and output bridged to a SIMPL Windows program via EISC.
|
- Advanced logic. Some logic operations that cannot be affectively accomplished in SIMPL Windows (ex. JSON/XML serialization/deserialization, database operations, etc.) can be done in the Simpl# Pro environment and the necessary input and output bridged to a SIMPL Windows program via EISC.
|
||||||
|
|
||||||
3. Hybrid Application that may contain elements of both standalone control and SIMPL partner application integration.
|
3. Hybrid Application that may contain elements of both standalone control and SIMPL partner application integration.
|
||||||
- There may be a use case where a device can only be defined in a single application, but that device may need to be interacted with from multiple applications. The device can be defined in an Essentials application, interacted with in that application and also bridged to one or more SIMPL Windows applications.
|
|
||||||
|
|
||||||
## Documentation
|
- There may be a use case where a device can only be defined in a single application, but that device may need to be interacted with from multiple applications. The device can be defined in an Essentials application, interacted with in that application and also bridged to one or more SIMPL Windows applications.
|
||||||
For detailed documentation, see the [Wiki](https://github.com/PepperDash/EssentialsFramework/wiki).
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
For detailed documentation, see the [Wiki](https://github.com/PepperDash/EssentialsFramework/wiki).
|
||||||
|
|
||||||
|
## Support
|
||||||
|
|
||||||
|
* Check out our [Discord Server](https://discord.gg/rWyeRH3K)
|
||||||
|
|
||||||
## How-To (Getting Started)
|
## How-To (Getting Started)
|
||||||
|
|
||||||
See [Getting Started](https://github.com/PepperDash/Essentials/wiki/Get-started#how-to-get-started)
|
See [Getting Started](https://github.com/PepperDash/Essentials/wiki/Get-started#how-to-get-started)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using Crestron.SimplSharp;
|
||||||
using Crestron.SimplSharp.Reflection;
|
using Crestron.SimplSharp.Reflection;
|
||||||
using Crestron.SimplSharpPro;
|
using Crestron.SimplSharpPro;
|
||||||
|
using Crestron.SimplSharpPro.DeviceSupport;
|
||||||
using Crestron.SimplSharpPro.EthernetCommunication;
|
using Crestron.SimplSharpPro.EthernetCommunication;
|
||||||
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
@@ -76,15 +78,15 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Bridge API using EISC
|
/// Bridge API using EISC
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class EiscApiAdvanced : BridgeApi
|
public class EiscApiAdvanced : BridgeApi, ICommunicationMonitor
|
||||||
{
|
{
|
||||||
public EiscApiPropertiesConfig PropertiesConfig { get; private set; }
|
public EiscApiPropertiesConfig PropertiesConfig { get; private set; }
|
||||||
|
|
||||||
protected Dictionary<string, JoinMapBaseAdvanced> JoinMaps { get; private set; }
|
protected Dictionary<string, JoinMapBaseAdvanced> JoinMaps { get; private set; }
|
||||||
|
|
||||||
public ThreeSeriesTcpIpEthernetIntersystemCommunications Eisc { get; private set; }
|
public BasicTriList Eisc { get; private set; }
|
||||||
|
|
||||||
public EiscApiAdvanced(DeviceConfig dc) :
|
public EiscApiAdvanced(DeviceConfig dc, BasicTriList eisc) :
|
||||||
base(dc.Key)
|
base(dc.Key)
|
||||||
{
|
{
|
||||||
JoinMaps = new Dictionary<string, JoinMapBaseAdvanced>();
|
JoinMaps = new Dictionary<string, JoinMapBaseAdvanced>();
|
||||||
@@ -92,44 +94,107 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
PropertiesConfig = dc.Properties.ToObject<EiscApiPropertiesConfig>();
|
PropertiesConfig = dc.Properties.ToObject<EiscApiPropertiesConfig>();
|
||||||
//PropertiesConfig = JsonConvert.DeserializeObject<EiscApiPropertiesConfig>(dc.Properties.ToString());
|
//PropertiesConfig = JsonConvert.DeserializeObject<EiscApiPropertiesConfig>(dc.Properties.ToString());
|
||||||
|
|
||||||
Eisc = new ThreeSeriesTcpIpEthernetIntersystemCommunications(PropertiesConfig.Control.IpIdInt, PropertiesConfig.Control.TcpSshProperties.Address, Global.ControlSystem);
|
Eisc = eisc;
|
||||||
|
|
||||||
Eisc.SigChange += Eisc_SigChange;
|
Eisc.SigChange += Eisc_SigChange;
|
||||||
|
|
||||||
AddPostActivationAction( () =>
|
CommunicationMonitor = new CrestronGenericBaseCommunicationMonitor(this, Eisc, 120000, 300000);
|
||||||
|
|
||||||
|
AddPostActivationAction(LinkDevices);
|
||||||
|
AddPostActivationAction(LinkRooms);
|
||||||
|
AddPostActivationAction(RegisterEisc);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool CustomActivate()
|
||||||
|
{
|
||||||
|
CommunicationMonitor.Start();
|
||||||
|
return base.CustomActivate();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool Deactivate()
|
||||||
|
{
|
||||||
|
CommunicationMonitor.Stop();
|
||||||
|
return base.Deactivate();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LinkDevices()
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Linking Devices...");
|
||||||
|
|
||||||
|
if (PropertiesConfig.Devices == null)
|
||||||
{
|
{
|
||||||
Debug.Console(1, this, "Linking Devices...");
|
Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "No devices linked to this bridge");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
foreach (var d in PropertiesConfig.Devices)
|
foreach (var d in PropertiesConfig.Devices)
|
||||||
|
{
|
||||||
|
var device = DeviceManager.GetDeviceForKey(d.DeviceKey);
|
||||||
|
|
||||||
|
if (device == null)
|
||||||
{
|
{
|
||||||
var device = DeviceManager.GetDeviceForKey(d.DeviceKey);
|
continue;
|
||||||
|
|
||||||
if (device == null) continue;
|
|
||||||
|
|
||||||
Debug.Console(1, this, "Linking Device: '{0}'", device.Key);
|
|
||||||
|
|
||||||
if (!typeof (IBridgeAdvanced).IsAssignableFrom(device.GetType().GetCType()))
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, Debug.ErrorLogLevel.Notice,
|
|
||||||
"{0} is not compatible with this bridge type. Please use 'eiscapi' instead, or updae the device.",
|
|
||||||
device.Key);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
var bridge = device as IBridgeAdvanced;
|
|
||||||
if (bridge != null) bridge.LinkToApi(Eisc, d.JoinStart, d.JoinMapKey, this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var registerResult = Eisc.Register();
|
Debug.Console(1, this, "Linking Device: '{0}'", device.Key);
|
||||||
|
|
||||||
if (registerResult != eDeviceRegistrationUnRegistrationResponse.Success)
|
if (!typeof (IBridgeAdvanced).IsAssignableFrom(device.GetType().GetCType()))
|
||||||
{
|
{
|
||||||
Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Registration result: {0}", registerResult);
|
Debug.Console(0, this, Debug.ErrorLogLevel.Notice,
|
||||||
return;
|
"{0} is not compatible with this bridge type. Please use 'eiscapi' instead, or updae the device.",
|
||||||
|
device.Key);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "EISC registration successful");
|
var bridge = device as IBridgeAdvanced;
|
||||||
});
|
if (bridge != null)
|
||||||
|
{
|
||||||
|
bridge.LinkToApi(Eisc, d.JoinStart, d.JoinMapKey, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RegisterEisc()
|
||||||
|
{
|
||||||
|
if (Eisc.Registered)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var registerResult = Eisc.Register();
|
||||||
|
|
||||||
|
if (registerResult != eDeviceRegistrationUnRegistrationResponse.Success)
|
||||||
|
{
|
||||||
|
Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Registration result: {0}", registerResult);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "EISC registration successful");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LinkRooms()
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Linking Rooms...");
|
||||||
|
|
||||||
|
if (PropertiesConfig.Rooms == null)
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "No rooms linked to this bridge.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var room in PropertiesConfig.Rooms)
|
||||||
|
{
|
||||||
|
var rm = DeviceManager.GetDeviceForKey(room.RoomKey) as IBridgeAdvanced;
|
||||||
|
|
||||||
|
if (rm == null)
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, Debug.ErrorLogLevel.Notice,
|
||||||
|
"Room {0} does not implement IBridgeAdvanced. Skipping...", room.RoomKey);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
rm.LinkToApi(Eisc, room.JoinStart, room.JoinMapKey, this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -152,7 +217,7 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Prints all the join maps on this bridge
|
/// Prints all the join maps on this bridge
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void PrintJoinMaps()
|
public virtual void PrintJoinMaps()
|
||||||
{
|
{
|
||||||
Debug.Console(0, this, "Join Maps for EISC IPID: {0}", Eisc.ID.ToString("X"));
|
Debug.Console(0, this, "Join Maps for EISC IPID: {0}", Eisc.ID.ToString("X"));
|
||||||
|
|
||||||
@@ -247,7 +312,7 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="currentDevice"></param>
|
/// <param name="currentDevice"></param>
|
||||||
/// <param name="args"></param>
|
/// <param name="args"></param>
|
||||||
void Eisc_SigChange(object currentDevice, SigEventArgs args)
|
protected void Eisc_SigChange(object currentDevice, SigEventArgs args)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -270,6 +335,12 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
Debug.Console(2, this, "Error in Eisc_SigChange handler: {0}", e);
|
Debug.Console(2, this, "Error in Eisc_SigChange handler: {0}", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#region Implementation of ICommunicationMonitor
|
||||||
|
|
||||||
|
public StatusMonitorBase CommunicationMonitor { get; private set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
public class EiscApiPropertiesConfig
|
public class EiscApiPropertiesConfig
|
||||||
@@ -280,6 +351,9 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
[JsonProperty("devices")]
|
[JsonProperty("devices")]
|
||||||
public List<ApiDevicePropertiesConfig> Devices { get; set; }
|
public List<ApiDevicePropertiesConfig> Devices { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("rooms")]
|
||||||
|
public List<ApiRoomPropertiesConfig> Rooms { get; set; }
|
||||||
|
|
||||||
|
|
||||||
public class ApiDevicePropertiesConfig
|
public class ApiDevicePropertiesConfig
|
||||||
{
|
{
|
||||||
@@ -293,21 +367,62 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
public string JoinMapKey { get; set; }
|
public string JoinMapKey { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class ApiRoomPropertiesConfig
|
||||||
|
{
|
||||||
|
[JsonProperty("roomKey")]
|
||||||
|
public string RoomKey { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("joinStart")]
|
||||||
|
public uint JoinStart { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("joinMapKey")]
|
||||||
|
public string JoinMapKey { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class EiscApiAdvancedFactory : EssentialsDeviceFactory<EiscApiAdvanced>
|
public class EiscApiAdvancedFactory : EssentialsDeviceFactory<EiscApiAdvanced>
|
||||||
{
|
{
|
||||||
public EiscApiAdvancedFactory()
|
public EiscApiAdvancedFactory()
|
||||||
{
|
{
|
||||||
TypeNames = new List<string> { "eiscapiadv", "eiscapiadvanced" };
|
TypeNames = new List<string> { "eiscapiadv", "eiscapiadvanced", "eiscapiadvancedserver", "eiscapiadvancedclient", "vceiscapiadv", "vceiscapiadvanced" };
|
||||||
}
|
}
|
||||||
|
|
||||||
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
||||||
{
|
{
|
||||||
Debug.Console(1, "Factory Attempting to create new EiscApiAdvanced Device");
|
Debug.Console(1, "Factory Attempting to create new EiscApiAdvanced Device");
|
||||||
|
|
||||||
return new EiscApiAdvanced(dc);
|
var controlProperties = CommFactory.GetControlPropertiesConfig(dc);
|
||||||
|
|
||||||
|
switch (dc.Type.ToLower())
|
||||||
|
{
|
||||||
|
case "eiscapiadv":
|
||||||
|
case "eiscapiadvanced":
|
||||||
|
{
|
||||||
|
var eisc = new ThreeSeriesTcpIpEthernetIntersystemCommunications(controlProperties.IpIdInt,
|
||||||
|
controlProperties.TcpSshProperties.Address, Global.ControlSystem);
|
||||||
|
return new EiscApiAdvanced(dc, eisc);
|
||||||
|
}
|
||||||
|
case "eiscapiadvancedserver":
|
||||||
|
{
|
||||||
|
var eisc = new EISCServer(controlProperties.IpIdInt, Global.ControlSystem);
|
||||||
|
return new EiscApiAdvanced(dc, eisc);
|
||||||
|
}
|
||||||
|
case "eiscapiadvancedclient":
|
||||||
|
{
|
||||||
|
var eisc = new EISCClient(controlProperties.IpIdInt, controlProperties.TcpSshProperties.Address, Global.ControlSystem);
|
||||||
|
return new EiscApiAdvanced(dc, eisc);
|
||||||
|
}
|
||||||
|
case "vceiscapiadv":
|
||||||
|
case "vceiscapiadvanced":
|
||||||
|
{
|
||||||
|
var eisc = new VirtualControlEISCClient(controlProperties.IpIdInt, InitialParametersClass.RoomId,
|
||||||
|
Global.ControlSystem);
|
||||||
|
return new EiscApiAdvanced(dc, eisc);
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
/// <param name="joinStart">Join this join map will start at</param>
|
/// <param name="joinStart">Join this join map will start at</param>
|
||||||
/// <param name="type">Type of the child join map</param>
|
/// <param name="type">Type of the child join map</param>
|
||||||
public AppleTvJoinMap(uint joinStart, Type type) : base(joinStart, type)
|
public AppleTvJoinMap(uint joinStart, Type type) : base(joinStart, type)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -76,6 +76,14 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
public JoinDataComplete HdcpSupportCapability = new JoinDataComplete(new JoinData { JoinNumber = 1201, JoinSpan = 32 },
|
public JoinDataComplete HdcpSupportCapability = new JoinDataComplete(new JoinData { JoinNumber = 1201, JoinSpan = 32 },
|
||||||
new JoinMetadata { Description = "DM Chassis Input HDCP Support Capability", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Analog });
|
new JoinMetadata { Description = "DM Chassis Input HDCP Support Capability", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Analog });
|
||||||
|
|
||||||
|
[JoinName("InputStreamCardState")]
|
||||||
|
public JoinDataComplete InputStreamCardState = new JoinDataComplete(new JoinData { JoinNumber = 1501, JoinSpan = 32 },
|
||||||
|
new JoinMetadata { Description = "DM Chassis Stream Input Start (1), Stop (2), Pause (3) with Feedback", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Analog });
|
||||||
|
|
||||||
|
[JoinName("OutputStreamCardState")]
|
||||||
|
public JoinDataComplete OutputStreamCardState = new JoinDataComplete(new JoinData { JoinNumber = 1601, JoinSpan = 32 },
|
||||||
|
new JoinMetadata { Description = "DM Chassis Stream Output Start (1), Stop (2), Pause (3) with Feedback", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Analog });
|
||||||
|
|
||||||
[JoinName("InputNames")]
|
[JoinName("InputNames")]
|
||||||
public JoinDataComplete InputNames = new JoinDataComplete(new JoinData { JoinNumber = 101, JoinSpan = 32 },
|
public JoinDataComplete InputNames = new JoinDataComplete(new JoinData { JoinNumber = 101, JoinSpan = 32 },
|
||||||
new JoinMetadata { Description = "DM Chassis Input Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
|
new JoinMetadata { Description = "DM Chassis Input Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
|
|
||||||
[JoinName("PirSensitivityInVacantState")]
|
[JoinName("PirSensitivityInVacantState")]
|
||||||
public JoinDataComplete PirSensitivityInVacantState = new JoinDataComplete(new JoinData { JoinNumber = 8, JoinSpan = 1 },
|
public JoinDataComplete PirSensitivityInVacantState = new JoinDataComplete(new JoinData { JoinNumber = 8, JoinSpan = 1 },
|
||||||
new JoinMetadata { Description = "Occ Sensor Ultrasonic Sensitivity in Vacant State", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
|
new JoinMetadata { Description = "Occ Sensor PIR Sensitivity in Vacant State", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
|
||||||
|
|
||||||
[JoinName("Name")]
|
[JoinName("Name")]
|
||||||
public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
||||||
|
|||||||
@@ -1,131 +1,274 @@
|
|||||||
using System;
|
using System;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
|
|
||||||
namespace PepperDash_Essentials_Core.Bridges.JoinMaps
|
namespace PepperDash.Essentials.Core.Bridges.JoinMaps
|
||||||
{
|
{
|
||||||
public class GlsPartitionSensorJoinMap : JoinMapBaseAdvanced
|
public class GlsPartitionSensorJoinMap : JoinMapBaseAdvanced
|
||||||
{
|
{
|
||||||
[JoinName("IsOnline")]
|
[JoinName("IsOnline")]
|
||||||
public JoinDataComplete IsOnline = new JoinDataComplete(
|
public JoinDataComplete IsOnline = new JoinDataComplete(
|
||||||
new JoinData
|
new JoinData
|
||||||
{
|
{
|
||||||
JoinNumber = 1,
|
JoinNumber = 1,
|
||||||
JoinSpan = 1
|
JoinSpan = 1
|
||||||
},
|
},
|
||||||
new JoinMetadata
|
new JoinMetadata
|
||||||
{
|
{
|
||||||
Description = "Sensor Is Online",
|
Description = "Sensor Is Online",
|
||||||
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||||
JoinType = eJoinType.Digital
|
JoinType = eJoinType.Digital
|
||||||
});
|
});
|
||||||
|
|
||||||
[JoinName("Name")]
|
[JoinName("Name")]
|
||||||
public JoinDataComplete Name = new JoinDataComplete(
|
public JoinDataComplete Name = new JoinDataComplete(
|
||||||
new JoinData
|
new JoinData
|
||||||
{
|
{
|
||||||
JoinNumber = 1,
|
JoinNumber = 1,
|
||||||
JoinSpan = 1
|
JoinSpan = 1
|
||||||
},
|
},
|
||||||
new JoinMetadata
|
new JoinMetadata
|
||||||
{
|
{
|
||||||
Description = "Sensor Name",
|
Description = "Sensor Name",
|
||||||
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||||
JoinType = eJoinType.Serial
|
JoinType = eJoinType.Serial
|
||||||
});
|
});
|
||||||
|
|
||||||
[JoinName("Enable")]
|
[JoinName("Enable")]
|
||||||
public JoinDataComplete Enable = new JoinDataComplete(
|
public JoinDataComplete Enable = new JoinDataComplete(
|
||||||
new JoinData
|
new JoinData
|
||||||
{
|
{
|
||||||
JoinNumber = 2,
|
JoinNumber = 2,
|
||||||
JoinSpan = 1
|
JoinSpan = 1
|
||||||
},
|
},
|
||||||
new JoinMetadata
|
new JoinMetadata
|
||||||
{
|
{
|
||||||
Description = "Sensor Enable",
|
Description = "Sensor Enable",
|
||||||
JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
|
JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
|
||||||
JoinType = eJoinType.Digital
|
JoinType = eJoinType.Digital
|
||||||
});
|
});
|
||||||
|
|
||||||
[JoinName("PartitionSensed")]
|
[JoinName("PartitionSensed")]
|
||||||
public JoinDataComplete PartitionSensed = new JoinDataComplete(
|
public JoinDataComplete PartitionSensed = new JoinDataComplete(
|
||||||
new JoinData
|
new JoinData
|
||||||
{
|
{
|
||||||
JoinNumber = 3,
|
JoinNumber = 3,
|
||||||
JoinSpan = 1
|
JoinSpan = 1
|
||||||
},
|
},
|
||||||
new JoinMetadata
|
new JoinMetadata
|
||||||
{
|
{
|
||||||
Description = "Sensor Partition Sensed",
|
Description = "Sensor Partition Sensed",
|
||||||
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||||
JoinType = eJoinType.Digital
|
JoinType = eJoinType.Digital
|
||||||
});
|
});
|
||||||
|
|
||||||
[JoinName("PartitionNotSensed")]
|
[JoinName("PartitionNotSensed")]
|
||||||
public JoinDataComplete PartitionNotSensed = new JoinDataComplete(
|
public JoinDataComplete PartitionNotSensed = new JoinDataComplete(
|
||||||
new JoinData
|
new JoinData
|
||||||
{
|
{
|
||||||
JoinNumber = 4,
|
JoinNumber = 4,
|
||||||
JoinSpan = 1
|
JoinSpan = 1
|
||||||
},
|
},
|
||||||
new JoinMetadata
|
new JoinMetadata
|
||||||
{
|
{
|
||||||
Description = "Sensor Partition Not Sensed",
|
Description = "Sensor Partition Not Sensed",
|
||||||
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||||
JoinType = eJoinType.Digital
|
JoinType = eJoinType.Digital
|
||||||
});
|
});
|
||||||
|
|
||||||
[JoinName("IncreaseSensitivity")]
|
[JoinName("IncreaseSensitivity")]
|
||||||
public JoinDataComplete IncreaseSensitivity = new JoinDataComplete(
|
public JoinDataComplete IncreaseSensitivity = new JoinDataComplete(
|
||||||
new JoinData
|
new JoinData
|
||||||
{
|
{
|
||||||
JoinNumber = 6,
|
JoinNumber = 6,
|
||||||
JoinSpan = 1
|
JoinSpan = 1
|
||||||
},
|
},
|
||||||
new JoinMetadata
|
new JoinMetadata
|
||||||
{
|
{
|
||||||
Description = "Sensor Increase Sensitivity",
|
Description = "Sensor Increase Sensitivity",
|
||||||
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
JoinType = eJoinType.Digital
|
JoinType = eJoinType.Digital
|
||||||
});
|
});
|
||||||
|
|
||||||
[JoinName("DecreaseSensitivity")]
|
[JoinName("DecreaseSensitivity")]
|
||||||
public JoinDataComplete DecreaseSensitivity = new JoinDataComplete(
|
public JoinDataComplete DecreaseSensitivity = new JoinDataComplete(
|
||||||
new JoinData
|
new JoinData
|
||||||
{
|
{
|
||||||
JoinNumber = 7,
|
JoinNumber = 7,
|
||||||
JoinSpan = 1
|
JoinSpan = 1
|
||||||
},
|
},
|
||||||
new JoinMetadata
|
new JoinMetadata
|
||||||
{
|
{
|
||||||
Description = "Sensor Decrease Sensitivity",
|
Description = "Sensor Decrease Sensitivity",
|
||||||
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
JoinType = eJoinType.Digital
|
JoinType = eJoinType.Digital
|
||||||
});
|
});
|
||||||
|
|
||||||
[JoinName("Sensitivity")]
|
[JoinName("Sensitivity")]
|
||||||
public JoinDataComplete Sensitivity = new JoinDataComplete(
|
public JoinDataComplete Sensitivity = new JoinDataComplete(
|
||||||
new JoinData
|
new JoinData
|
||||||
{
|
{
|
||||||
JoinNumber = 2,
|
JoinNumber = 2,
|
||||||
JoinSpan = 1
|
JoinSpan = 1
|
||||||
},
|
},
|
||||||
new JoinMetadata
|
new JoinMetadata
|
||||||
{
|
{
|
||||||
Description = "Sensor Sensitivity",
|
Description = "Sensor Sensitivity",
|
||||||
JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
|
JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
|
||||||
JoinType = eJoinType.Analog
|
JoinType = eJoinType.Analog
|
||||||
});
|
});
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Constructor to use when instantiating this Join Map without inheriting from it
|
/// Constructor to use when instantiating this Join Map without inheriting from it
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="joinStart">Join this join map will start at</param>
|
/// <param name="joinStart">Join this join map will start at</param>
|
||||||
public GlsPartitionSensorJoinMap(uint joinStart)
|
public GlsPartitionSensorJoinMap(uint joinStart)
|
||||||
: this(joinStart, typeof (GlsPartitionSensorJoinMap))
|
: this(joinStart, typeof(GlsPartitionSensorJoinMap))
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor to use when extending this Join map
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="joinStart">Join this join map will start at</param>
|
||||||
|
/// <param name="type">Type of the child join map</param>
|
||||||
|
protected GlsPartitionSensorJoinMap(uint joinStart, Type type)
|
||||||
|
: base(joinStart, type)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace PepperDash_Essentials_Core.Bridges.JoinMaps
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
[Obsolete("use PepperDash.Essentials.Core.Bridges.JoinMaps version")]
|
||||||
|
public class GlsPartitionSensorJoinMap:JoinMapBaseAdvanced
|
||||||
|
{
|
||||||
|
[JoinName("IsOnline")]
|
||||||
|
public JoinDataComplete IsOnline = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 1,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "Sensor Is Online",
|
||||||
|
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("Name")]
|
||||||
|
public JoinDataComplete Name = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 1,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "Sensor Name",
|
||||||
|
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||||
|
JoinType = eJoinType.Serial
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("Enable")]
|
||||||
|
public JoinDataComplete Enable = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 2,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "Sensor Enable",
|
||||||
|
JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("PartitionSensed")]
|
||||||
|
public JoinDataComplete PartitionSensed = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 3,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "Sensor Partition Sensed",
|
||||||
|
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("PartitionNotSensed")]
|
||||||
|
public JoinDataComplete PartitionNotSensed = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 4,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "Sensor Partition Not Sensed",
|
||||||
|
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("IncreaseSensitivity")]
|
||||||
|
public JoinDataComplete IncreaseSensitivity = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 6,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "Sensor Increase Sensitivity",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("DecreaseSensitivity")]
|
||||||
|
public JoinDataComplete DecreaseSensitivity = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 7,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "Sensor Decrease Sensitivity",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("Sensitivity")]
|
||||||
|
public JoinDataComplete Sensitivity = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 2,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "Sensor Sensitivity",
|
||||||
|
JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
|
||||||
|
JoinType = eJoinType.Analog
|
||||||
|
});
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor to use when instantiating this Join Map without inheriting from it
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="joinStart">Join this join map will start at</param>
|
||||||
|
public GlsPartitionSensorJoinMap(uint joinStart)
|
||||||
|
: this(joinStart, typeof(GlsPartitionSensorJoinMap))
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Constructor to use when extending this Join map
|
/// Constructor to use when extending this Join map
|
||||||
|
|||||||
@@ -0,0 +1,222 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using Crestron.SimplSharp;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core.Bridges
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Join map for IRBlurayBase devices
|
||||||
|
/// </summary>
|
||||||
|
public class IRBlurayBaseJoinMap : JoinMapBaseAdvanced
|
||||||
|
{
|
||||||
|
[JoinName("PowerOn")]
|
||||||
|
public JoinDataComplete PowerOn = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Power On", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("PowerOff")]
|
||||||
|
public JoinDataComplete PowerOff = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Power Off", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("PowerToggle")]
|
||||||
|
public JoinDataComplete PowerToggle = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Power Toggle", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("Up")]
|
||||||
|
public JoinDataComplete Up = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Nav Up", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("Down")]
|
||||||
|
public JoinDataComplete Down = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Nav Down", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("Left")]
|
||||||
|
public JoinDataComplete Left = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Nav Left", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("Right")]
|
||||||
|
public JoinDataComplete Right = new JoinDataComplete(new JoinData { JoinNumber = 7, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Nav Right", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("Select")]
|
||||||
|
public JoinDataComplete Select = new JoinDataComplete(new JoinData { JoinNumber = 8, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Select", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("Menu")]
|
||||||
|
public JoinDataComplete Menu = new JoinDataComplete(new JoinData { JoinNumber = 9, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Menu", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("Exit")]
|
||||||
|
public JoinDataComplete Exit = new JoinDataComplete(new JoinData { JoinNumber = 10, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Exit", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("Digit0")]
|
||||||
|
public JoinDataComplete Digit0 = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Digit 0", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("Digit1")]
|
||||||
|
public JoinDataComplete Digit1 = new JoinDataComplete(new JoinData { JoinNumber = 12, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Digit 1", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("Digit2")]
|
||||||
|
public JoinDataComplete Digit2 = new JoinDataComplete(new JoinData { JoinNumber = 13, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Digit 2", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("Digit3")]
|
||||||
|
public JoinDataComplete Digit3 = new JoinDataComplete(new JoinData { JoinNumber = 14, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Digit 3", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("Digit4")]
|
||||||
|
public JoinDataComplete Digit4 = new JoinDataComplete(new JoinData { JoinNumber = 15, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Digit 4", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("Digit5")]
|
||||||
|
public JoinDataComplete Digit5 = new JoinDataComplete(new JoinData { JoinNumber = 16, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Digit 5", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("Digit6")]
|
||||||
|
public JoinDataComplete Digit6 = new JoinDataComplete(new JoinData { JoinNumber = 17, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Digit 6", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("Digit7")]
|
||||||
|
public JoinDataComplete Digit7 = new JoinDataComplete(new JoinData { JoinNumber = 18, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Digit 7", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("Digit8")]
|
||||||
|
public JoinDataComplete Digit8 = new JoinDataComplete(new JoinData { JoinNumber = 19, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Digit 8", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("Digit9")]
|
||||||
|
public JoinDataComplete Digit9 = new JoinDataComplete(new JoinData { JoinNumber = 20, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Digit 9", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("KeypadClear")]
|
||||||
|
public JoinDataComplete KeypadClear = new JoinDataComplete(new JoinData { JoinNumber = 21, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Keypad Clear", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("KeypadEnter")]
|
||||||
|
public JoinDataComplete KeypadEnter = new JoinDataComplete(new JoinData { JoinNumber = 22, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Keypad Enter", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("ChannelUp")]
|
||||||
|
public JoinDataComplete ChannelUp = new JoinDataComplete(new JoinData { JoinNumber = 23, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "STB Channel Up", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("ChannelDown")]
|
||||||
|
public JoinDataComplete ChannelDown = new JoinDataComplete(new JoinData { JoinNumber = 24, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "STB Channel Down", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("LastChannel")]
|
||||||
|
public JoinDataComplete LastChannel = new JoinDataComplete(new JoinData { JoinNumber = 25, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Last Channel", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("Guide")]
|
||||||
|
public JoinDataComplete Guide = new JoinDataComplete(new JoinData { JoinNumber = 26, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Guide", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("Info")]
|
||||||
|
public JoinDataComplete Info = new JoinDataComplete(new JoinData { JoinNumber = 27, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Info", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("Red")]
|
||||||
|
public JoinDataComplete Red = new JoinDataComplete(new JoinData { JoinNumber = 28, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Red", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("Green")]
|
||||||
|
public JoinDataComplete Green = new JoinDataComplete(new JoinData { JoinNumber = 29, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Green", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("Yellow")]
|
||||||
|
public JoinDataComplete Yellow = new JoinDataComplete(new JoinData { JoinNumber = 30, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Yellow", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("Blue")]
|
||||||
|
public JoinDataComplete Blue = new JoinDataComplete(new JoinData { JoinNumber = 31, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Blue", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
|
||||||
|
[JoinName("Play")]
|
||||||
|
public JoinDataComplete Play = new JoinDataComplete(new JoinData { JoinNumber = 33, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Play", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("Pause")]
|
||||||
|
public JoinDataComplete Pause = new JoinDataComplete(new JoinData { JoinNumber = 34, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Pause", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("Stop")]
|
||||||
|
public JoinDataComplete Stop = new JoinDataComplete(new JoinData { JoinNumber = 35, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Stop", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("FFwd")]
|
||||||
|
public JoinDataComplete FFwd = new JoinDataComplete(new JoinData { JoinNumber = 36, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "FFwd", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("Rewind")]
|
||||||
|
public JoinDataComplete Rewind = new JoinDataComplete(new JoinData { JoinNumber = 37, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Rewind", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("ChapPlus")]
|
||||||
|
public JoinDataComplete ChapPlus = new JoinDataComplete(new JoinData { JoinNumber = 38, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Chapter Plus", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("ChapMinus")]
|
||||||
|
public JoinDataComplete ChapMinus = new JoinDataComplete(new JoinData { JoinNumber = 39, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Chapter Minus", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("Replay")]
|
||||||
|
public JoinDataComplete Replay = new JoinDataComplete(new JoinData { JoinNumber = 40, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Replay", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("Record")]
|
||||||
|
public JoinDataComplete Record = new JoinDataComplete(new JoinData { JoinNumber = 41, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Record", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("HasKeypadAccessoryButton1")]
|
||||||
|
public JoinDataComplete HasKeypadAccessoryButton1 = new JoinDataComplete(new JoinData { JoinNumber = 42, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Has Keypad Accessory Button 1", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("HasKeypadAccessoryButton2")]
|
||||||
|
public JoinDataComplete HasKeypadAccessoryButton2 = new JoinDataComplete(new JoinData { JoinNumber = 43, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Has Keypad Accessory Button 2", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("KeypadAccessoryButton1Press")]
|
||||||
|
public JoinDataComplete KeypadAccessoryButton1Press = new JoinDataComplete(new JoinData { JoinNumber = 42, JoinSpan = 2 },
|
||||||
|
new JoinMetadata { Description = "Keypad Accessory Button 1 Press", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("KeypadAccessoryButton2Press")]
|
||||||
|
public JoinDataComplete KeypadAccessoryButton2Press = new JoinDataComplete(new JoinData { JoinNumber = 43, JoinSpan = 2 },
|
||||||
|
new JoinMetadata { Description = "Keypad Accessory Button 2 Press", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("Name")]
|
||||||
|
public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("KeypadAccessoryButton1Label")]
|
||||||
|
public JoinDataComplete KeypadAccessoryButton1Label = new JoinDataComplete(new JoinData { JoinNumber = 42, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Keypad Accessory Button 1 Label", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
|
||||||
|
|
||||||
|
[JoinName("KeypadAccessoryButton2Label")]
|
||||||
|
public JoinDataComplete KeypadAccessoryButton2Label = new JoinDataComplete(new JoinData { JoinNumber = 43, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "Keypad Accessory Button 1 Label", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor to use when instantiating this Join Map without inheriting from it
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="joinStart">Join this join map will start at</param>
|
||||||
|
public IRBlurayBaseJoinMap(uint joinStart)
|
||||||
|
: this(joinStart, typeof(IRBlurayBaseJoinMap))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor to use when extending this Join map
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="joinStart">Join this join map will start at</param>
|
||||||
|
/// <param name="type">Type of the child join map</param>
|
||||||
|
protected IRBlurayBaseJoinMap(uint joinStart, Type type)
|
||||||
|
: base(joinStart, type)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
using System;
|
using System;
|
||||||
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Bridges
|
namespace PepperDash.Essentials.Core.Bridges
|
||||||
{
|
{
|
||||||
public class SetTopBoxControllerJoinMap : JoinMapBaseAdvanced
|
public class SetTopBoxControllerJoinMap : JoinMapBaseAdvanced
|
||||||
{
|
{
|
||||||
[JoinName("PowerOn")]
|
[JoinName("PowerOn")]
|
||||||
public JoinDataComplete PowerOn = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
public JoinDataComplete PowerOn = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
||||||
new JoinMetadata { Description = "STB Power On", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
new JoinMetadata { Description = "STB Power On", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
@@ -236,5 +236,5 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
: base(joinStart, type)
|
: base(joinStart, type)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -11,8 +11,10 @@ using PepperDash.Core;
|
|||||||
|
|
||||||
namespace PepperDash.Essentials.Core
|
namespace PepperDash.Essentials.Core
|
||||||
{
|
{
|
||||||
public class CecPortController : Device, IBasicCommunication
|
public class CecPortController : Device, IBasicCommunicationWithStreamDebugging
|
||||||
{
|
{
|
||||||
|
public CommunicationStreamDebugging StreamDebugging { get; private set; }
|
||||||
|
|
||||||
public event EventHandler<GenericCommMethodReceiveBytesArgs> BytesReceived;
|
public event EventHandler<GenericCommMethodReceiveBytesArgs> BytesReceived;
|
||||||
public event EventHandler<GenericCommMethodReceiveTextArgs> TextReceived;
|
public event EventHandler<GenericCommMethodReceiveTextArgs> TextReceived;
|
||||||
|
|
||||||
@@ -23,6 +25,8 @@ namespace PepperDash.Essentials.Core
|
|||||||
public CecPortController(string key, Func<EssentialsControlPropertiesConfig, ICec> postActivationFunc,
|
public CecPortController(string key, Func<EssentialsControlPropertiesConfig, ICec> postActivationFunc,
|
||||||
EssentialsControlPropertiesConfig config):base(key)
|
EssentialsControlPropertiesConfig config):base(key)
|
||||||
{
|
{
|
||||||
|
StreamDebugging = new CommunicationStreamDebugging(key);
|
||||||
|
|
||||||
AddPostActivationAction(() =>
|
AddPostActivationAction(() =>
|
||||||
{
|
{
|
||||||
Port = postActivationFunc(config);
|
Port = postActivationFunc(config);
|
||||||
@@ -50,15 +54,21 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
void OnDataReceived(string s)
|
void OnDataReceived(string s)
|
||||||
{
|
{
|
||||||
var bytesHandler = BytesReceived;
|
var bytesHandler = BytesReceived;
|
||||||
if (bytesHandler != null)
|
if (bytesHandler != null)
|
||||||
{
|
{
|
||||||
var bytes = Encoding.GetEncoding(28591).GetBytes(s);
|
var bytes = Encoding.GetEncoding(28591).GetBytes(s);
|
||||||
|
if (StreamDebugging.RxStreamDebuggingIsEnabled)
|
||||||
|
Debug.Console(0, this, "Received: '{0}'", ComTextHelper.GetEscapedText(bytes));
|
||||||
bytesHandler(this, new GenericCommMethodReceiveBytesArgs(bytes));
|
bytesHandler(this, new GenericCommMethodReceiveBytesArgs(bytes));
|
||||||
}
|
}
|
||||||
var textHandler = TextReceived;
|
var textHandler = TextReceived;
|
||||||
if (textHandler != null)
|
if (textHandler != null)
|
||||||
textHandler(this, new GenericCommMethodReceiveTextArgs(s));
|
{
|
||||||
|
if (StreamDebugging.RxStreamDebuggingIsEnabled)
|
||||||
|
Debug.Console(0, this, "Received: '{0}'", s);
|
||||||
|
textHandler(this, new GenericCommMethodReceiveTextArgs(s));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#region IBasicCommunication Members
|
#region IBasicCommunication Members
|
||||||
@@ -67,6 +77,8 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
if (Port == null)
|
if (Port == null)
|
||||||
return;
|
return;
|
||||||
|
if (StreamDebugging.TxStreamDebuggingIsEnabled)
|
||||||
|
Debug.Console(0, this, "Sending {0} characters of text: '{1}'", text.Length, text);
|
||||||
Port.StreamCec.Send.StringValue = text;
|
Port.StreamCec.Send.StringValue = text;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,6 +87,8 @@ namespace PepperDash.Essentials.Core
|
|||||||
if (Port == null)
|
if (Port == null)
|
||||||
return;
|
return;
|
||||||
var text = Encoding.GetEncoding(28591).GetString(bytes, 0, bytes.Length);
|
var text = Encoding.GetEncoding(28591).GetString(bytes, 0, bytes.Length);
|
||||||
|
if (StreamDebugging.TxStreamDebuggingIsEnabled)
|
||||||
|
Debug.Console(0, this, "Sending {0} bytes: '{1}'", bytes.Length, ComTextHelper.GetEscapedText(bytes));
|
||||||
Port.StreamCec.Send.StringValue = text;
|
Port.StreamCec.Send.StringValue = text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -56,6 +56,11 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
private void RegisterAndConfigureComPort()
|
private void RegisterAndConfigureComPort()
|
||||||
{
|
{
|
||||||
|
if (Port == null)
|
||||||
|
{
|
||||||
|
Debug.Console(0,this,Debug.ErrorLogLevel.Error, "Configured com Port for this device does not exist.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (Port.Parent is CrestronControlSystem)
|
if (Port.Parent is CrestronControlSystem)
|
||||||
{
|
{
|
||||||
var result = Port.Register();
|
var result = Port.Register();
|
||||||
@@ -87,18 +92,20 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
void OnDataReceived(string s)
|
void OnDataReceived(string s)
|
||||||
{
|
{
|
||||||
|
|
||||||
var bytesHandler = BytesReceived;
|
var bytesHandler = BytesReceived;
|
||||||
if (bytesHandler != null)
|
if (bytesHandler != null)
|
||||||
{
|
{
|
||||||
var bytes = Encoding.GetEncoding(28591).GetBytes(s);
|
var bytes = Encoding.GetEncoding(28591).GetBytes(s);
|
||||||
|
if (StreamDebugging.RxStreamDebuggingIsEnabled)
|
||||||
|
Debug.Console(0, this, "Received: '{0}'", ComTextHelper.GetEscapedText(bytes));
|
||||||
bytesHandler(this, new GenericCommMethodReceiveBytesArgs(bytes));
|
bytesHandler(this, new GenericCommMethodReceiveBytesArgs(bytes));
|
||||||
}
|
}
|
||||||
var textHandler = TextReceived;
|
var textHandler = TextReceived;
|
||||||
if (textHandler != null)
|
if (textHandler != null)
|
||||||
{
|
{
|
||||||
if (StreamDebugging.RxStreamDebuggingIsEnabled)
|
if (StreamDebugging.RxStreamDebuggingIsEnabled)
|
||||||
Debug.Console(0, this, "Recevied: '{0}'", s);
|
Debug.Console(0, this, "Received: '{0}'", s);
|
||||||
|
|
||||||
textHandler(this, new GenericCommMethodReceiveTextArgs(s));
|
textHandler(this, new GenericCommMethodReceiveTextArgs(s));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,193 +1,210 @@
|
|||||||
using System;
|
using System;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
using Crestron.SimplSharpPro;
|
using Crestron.SimplSharpPro;
|
||||||
using Crestron.SimplSharpPro.DM;
|
using Crestron.SimplSharpPro.DM;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core
|
namespace PepperDash.Essentials.Core
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class CommFactory
|
public class CommFactory
|
||||||
{
|
{
|
||||||
public static EssentialsControlPropertiesConfig GetControlPropertiesConfig(DeviceConfig deviceConfig)
|
public static EssentialsControlPropertiesConfig GetControlPropertiesConfig(DeviceConfig deviceConfig)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
return JsonConvert.DeserializeObject<EssentialsControlPropertiesConfig>
|
return JsonConvert.DeserializeObject<EssentialsControlPropertiesConfig>
|
||||||
(deviceConfig.Properties["control"].ToString());
|
(deviceConfig.Properties["control"].ToString());
|
||||||
//Debug.Console(2, "Control TEST: {0}", JsonConvert.SerializeObject(controlConfig));
|
//Debug.Console(2, "Control TEST: {0}", JsonConvert.SerializeObject(controlConfig));
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
|
||||||
Debug.Console(0, "ERROR: [{0}] Control properties deserialize failed:\r{1}", deviceConfig.Key, e);
|
Debug.Console(0, "ERROR: [{0}] Control properties deserialize failed:\r{1}", deviceConfig.Key, e);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns a comm method of either com port, TCP, SSH, and puts this into the DeviceManager
|
/// Returns a comm method of either com port, TCP, SSH, and puts this into the DeviceManager
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="deviceConfig">The Device config object</param>
|
/// <param name="deviceConfig">The Device config object</param>
|
||||||
public static IBasicCommunication CreateCommForDevice(DeviceConfig deviceConfig)
|
public static IBasicCommunication CreateCommForDevice(DeviceConfig deviceConfig)
|
||||||
{
|
{
|
||||||
EssentialsControlPropertiesConfig controlConfig = GetControlPropertiesConfig(deviceConfig);
|
EssentialsControlPropertiesConfig controlConfig = GetControlPropertiesConfig(deviceConfig);
|
||||||
if (controlConfig == null)
|
if (controlConfig == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
IBasicCommunication comm = null;
|
IBasicCommunication comm = null;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var c = controlConfig.TcpSshProperties;
|
var c = controlConfig.TcpSshProperties;
|
||||||
switch (controlConfig.Method)
|
switch (controlConfig.Method)
|
||||||
{
|
{
|
||||||
case eControlMethod.Com:
|
case eControlMethod.Com:
|
||||||
comm = new ComPortController(deviceConfig.Key + "-com", GetComPort, controlConfig.ComParams, controlConfig);
|
comm = new ComPortController(deviceConfig.Key + "-com", GetComPort, controlConfig.ComParams, controlConfig);
|
||||||
break;
|
break;
|
||||||
case eControlMethod.Cec:
|
case eControlMethod.Cec:
|
||||||
comm = new CecPortController(deviceConfig.Key + "-cec", GetCecPort, controlConfig);
|
comm = new CecPortController(deviceConfig.Key + "-cec", GetCecPort, controlConfig);
|
||||||
break;
|
break;
|
||||||
case eControlMethod.IR:
|
case eControlMethod.IR:
|
||||||
break;
|
break;
|
||||||
case eControlMethod.Ssh:
|
case eControlMethod.Ssh:
|
||||||
{
|
{
|
||||||
var ssh = new GenericSshClient(deviceConfig.Key + "-ssh", c.Address, c.Port, c.Username, c.Password);
|
var ssh = new GenericSshClient(deviceConfig.Key + "-ssh", c.Address, c.Port, c.Username, c.Password);
|
||||||
ssh.AutoReconnect = c.AutoReconnect;
|
ssh.AutoReconnect = c.AutoReconnect;
|
||||||
if(ssh.AutoReconnect)
|
if(ssh.AutoReconnect)
|
||||||
ssh.AutoReconnectIntervalMs = c.AutoReconnectIntervalMs;
|
ssh.AutoReconnectIntervalMs = c.AutoReconnectIntervalMs;
|
||||||
comm = ssh;
|
comm = ssh;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case eControlMethod.Tcpip:
|
case eControlMethod.Tcpip:
|
||||||
{
|
{
|
||||||
var tcp = new GenericTcpIpClient(deviceConfig.Key + "-tcp", c.Address, c.Port, c.BufferSize);
|
var tcp = new GenericTcpIpClient(deviceConfig.Key + "-tcp", c.Address, c.Port, c.BufferSize);
|
||||||
tcp.AutoReconnect = c.AutoReconnect;
|
tcp.AutoReconnect = c.AutoReconnect;
|
||||||
if (tcp.AutoReconnect)
|
if (tcp.AutoReconnect)
|
||||||
tcp.AutoReconnectIntervalMs = c.AutoReconnectIntervalMs;
|
tcp.AutoReconnectIntervalMs = c.AutoReconnectIntervalMs;
|
||||||
comm = tcp;
|
comm = tcp;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case eControlMethod.Udp:
|
case eControlMethod.Udp:
|
||||||
{
|
{
|
||||||
var udp = new GenericUdpServer(deviceConfig.Key + "-udp", c.Address, c.Port, c.BufferSize);
|
var udp = new GenericUdpServer(deviceConfig.Key + "-udp", c.Address, c.Port, c.BufferSize);
|
||||||
comm = udp;
|
comm = udp;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case eControlMethod.Telnet:
|
case eControlMethod.Telnet:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
Debug.Console(0, "Cannot create communication from JSON:\r{0}\r\rException:\r{1}",
|
Debug.Console(0, "Cannot create communication from JSON:\r{0}\r\rException:\r{1}",
|
||||||
deviceConfig.Properties.ToString(), e);
|
deviceConfig.Properties.ToString(), e);
|
||||||
}
|
}
|
||||||
|
|
||||||
// put it in the device manager if it's the right flavor
|
// put it in the device manager if it's the right flavor
|
||||||
var comDev = comm as Device;
|
var comDev = comm as Device;
|
||||||
if (comDev != null)
|
if (comDev != null)
|
||||||
DeviceManager.AddDevice(comDev);
|
DeviceManager.AddDevice(comDev);
|
||||||
return comm;
|
return comm;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ComPort GetComPort(EssentialsControlPropertiesConfig config)
|
public static ComPort GetComPort(EssentialsControlPropertiesConfig config)
|
||||||
{
|
{
|
||||||
var comPar = config.ComParams;
|
var comPar = config.ComParams;
|
||||||
var dev = GetIComPortsDeviceFromManagedDevice(config.ControlPortDevKey);
|
var dev = GetIComPortsDeviceFromManagedDevice(config.ControlPortDevKey);
|
||||||
if (dev != null && config.ControlPortNumber <= dev.NumberOfComPorts)
|
if (dev != null && config.ControlPortNumber <= dev.NumberOfComPorts)
|
||||||
return dev.ComPorts[config.ControlPortNumber];
|
return dev.ComPorts[config.ControlPortNumber];
|
||||||
Debug.Console(0, "GetComPort: Device '{0}' does not have com port {1}", config.ControlPortDevKey, config.ControlPortNumber);
|
Debug.Console(0,Debug.ErrorLogLevel.Notice, "GetComPort: Device '{0}' does not have com port {1}", config.ControlPortDevKey, config.ControlPortNumber);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets an ICec port from a RoutingInput or RoutingOutput on a device
|
/// Gets an ICec port from a RoutingInput or RoutingOutput on a device
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="config"></param>
|
/// <param name="config"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static ICec GetCecPort(ControlPropertiesConfig config)
|
public static ICec GetCecPort(ControlPropertiesConfig config)
|
||||||
{
|
{
|
||||||
var dev = DeviceManager.GetDeviceForKey(config.ControlPortDevKey);
|
var dev = DeviceManager.GetDeviceForKey(config.ControlPortDevKey);
|
||||||
|
|
||||||
if (dev != null)
|
if (dev != null)
|
||||||
{
|
{
|
||||||
var inputPort = (dev as IRoutingInputsOutputs).InputPorts[config.ControlPortName];
|
if (!String.IsNullOrEmpty(config.ControlPortName))
|
||||||
|
{
|
||||||
if (inputPort != null)
|
|
||||||
if (inputPort.Port is ICec)
|
var inputPort = (dev as IRoutingInputsOutputs).InputPorts[config.ControlPortName];
|
||||||
return inputPort.Port as ICec;
|
|
||||||
|
if (inputPort != null)
|
||||||
var outputPort = (dev as IRoutingInputsOutputs).OutputPorts[config.ControlPortName];
|
{
|
||||||
|
if (inputPort.Port is ICec)
|
||||||
if (outputPort != null)
|
return inputPort.Port as ICec;
|
||||||
if (outputPort.Port is ICec)
|
}
|
||||||
return outputPort.Port as ICec;
|
|
||||||
}
|
var outputPort = (dev as IRoutingInputsOutputs).OutputPorts[config.ControlPortName];
|
||||||
Debug.Console(0, "GetCecPort: Device '{0}' does not have a CEC port called: '{1}'", config.ControlPortDevKey, config.ControlPortName);
|
|
||||||
return null;
|
if (outputPort != null)
|
||||||
}
|
{
|
||||||
|
if (outputPort.Port is ICec)
|
||||||
/// <summary>
|
return outputPort.Port as ICec;
|
||||||
/// Helper to grab the IComPorts device for this PortDeviceKey. Key "controlSystem" will
|
}
|
||||||
/// return the ControlSystem object from the Global class.
|
|
||||||
/// </summary>
|
else
|
||||||
/// <returns>IComPorts device or null if the device is not found or does not implement IComPorts</returns>
|
Debug.Console(0, "GetCecPort: Device '{0}' does not have a CEC port called: '{1}'",
|
||||||
public static IComPorts GetIComPortsDeviceFromManagedDevice(string ComPortDevKey)
|
config.ControlPortDevKey, config.ControlPortName);
|
||||||
{
|
}
|
||||||
if ((ComPortDevKey.Equals("controlSystem", System.StringComparison.OrdinalIgnoreCase)
|
else
|
||||||
|| ComPortDevKey.Equals("processor", System.StringComparison.OrdinalIgnoreCase))
|
{
|
||||||
&& Global.ControlSystem is IComPorts)
|
Debug.Console(0, "GetCecPort: '{0}' - Configuration missing 'ControlPortName'", config.ControlPortDevKey);
|
||||||
return Global.ControlSystem;
|
}
|
||||||
else
|
}
|
||||||
{
|
Debug.Console(0, "GetCecPort: Device '{0}' is not a valid device.", config.ControlPortDevKey);
|
||||||
var dev = DeviceManager.GetDeviceForKey(ComPortDevKey) as IComPorts;
|
|
||||||
if (dev == null)
|
return null;
|
||||||
Debug.Console(0, "ComPortConfig: Cannot find com port device '{0}'", ComPortDevKey);
|
|
||||||
return dev;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public class EssentialsControlPropertiesConfig :
|
|
||||||
PepperDash.Core.ControlPropertiesConfig
|
|
||||||
{
|
|
||||||
|
|
||||||
[JsonConverter(typeof(ComSpecJsonConverter))]
|
|
||||||
public ComPort.ComPortSpec ComParams { get; set; }
|
|
||||||
|
|
||||||
public string CresnetId { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Attempts to provide uint conversion of string CresnetId
|
|
||||||
/// </summary>
|
|
||||||
public uint CresnetIdInt
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
return Convert.ToUInt32(CresnetId, 16);
|
|
||||||
}
|
|
||||||
catch (Exception)
|
|
||||||
{
|
|
||||||
throw new FormatException(string.Format("ERROR:Unable to convert Cresnet ID: {0} to hex. Error:\n{1}", CresnetId));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public string InfinetId { get; set; }
|
/// <summary>
|
||||||
|
/// Helper to grab the IComPorts device for this PortDeviceKey. Key "controlSystem" will
|
||||||
|
/// return the ControlSystem object from the Global class.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>IComPorts device or null if the device is not found or does not implement IComPorts</returns>
|
||||||
|
public static IComPorts GetIComPortsDeviceFromManagedDevice(string ComPortDevKey)
|
||||||
|
{
|
||||||
|
if ((ComPortDevKey.Equals("controlSystem", System.StringComparison.OrdinalIgnoreCase)
|
||||||
|
|| ComPortDevKey.Equals("processor", System.StringComparison.OrdinalIgnoreCase))
|
||||||
|
&& Global.ControlSystem is IComPorts)
|
||||||
|
return Global.ControlSystem;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var dev = DeviceManager.GetDeviceForKey(ComPortDevKey) as IComPorts;
|
||||||
|
if (dev == null)
|
||||||
|
Debug.Console(0, "ComPortConfig: Cannot find com port device '{0}'", ComPortDevKey);
|
||||||
|
return dev;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
public class EssentialsControlPropertiesConfig :
|
||||||
|
PepperDash.Core.ControlPropertiesConfig
|
||||||
|
{
|
||||||
|
|
||||||
|
[JsonConverter(typeof(ComSpecJsonConverter))]
|
||||||
|
public ComPort.ComPortSpec ComParams { get; set; }
|
||||||
|
|
||||||
|
public string CresnetId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Attempts to provide uint conversion of string CresnetId
|
||||||
|
/// </summary>
|
||||||
|
public uint CresnetIdInt
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return Convert.ToUInt32(CresnetId, 16);
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
throw new FormatException(string.Format("ERROR:Unable to convert Cresnet ID: {0} to hex. Error:\n{1}", CresnetId));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string InfinetId { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Attepmts to provide uiont conversion of string InifinetId
|
/// Attepmts to provide uiont conversion of string InifinetId
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -204,13 +221,13 @@ namespace PepperDash.Essentials.Core
|
|||||||
throw new FormatException(string.Format("ERROR:Unable to conver Infinet ID: {0} to hex. Error:\n{1}", InfinetId));
|
throw new FormatException(string.Format("ERROR:Unable to conver Infinet ID: {0} to hex. Error:\n{1}", InfinetId));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class IrControlSpec
|
public class IrControlSpec
|
||||||
{
|
{
|
||||||
public string PortDeviceKey { get; set; }
|
public string PortDeviceKey { get; set; }
|
||||||
public uint PortNumber { get; set; }
|
public uint PortNumber { get; set; }
|
||||||
public string File { get; set; }
|
public string File { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -31,7 +31,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
Communication = comm;
|
Communication = comm;
|
||||||
PortGather = new CommunicationGather(Communication, '\x0d');
|
PortGather = new CommunicationGather(Communication, '\x0d');
|
||||||
PortGather.LineReceived += this.Port_LineReceived;
|
//PortGather.LineReceived += this.Port_LineReceived;
|
||||||
CommunicationMonitor = new GenericCommunicationMonitor(this, Communication, props.CommunicationMonitorProperties);
|
CommunicationMonitor = new GenericCommunicationMonitor(this, Communication, props.CommunicationMonitorProperties);
|
||||||
LineEnding = props.LineEnding;
|
LineEnding = props.LineEnding;
|
||||||
}
|
}
|
||||||
@@ -47,13 +47,6 @@ namespace PepperDash.Essentials.Core
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Port_LineReceived(object dev, GenericCommMethodReceiveTextArgs args)
|
|
||||||
{
|
|
||||||
if (Debug.Level == 2)
|
|
||||||
Debug.Console(2, this, "RX: '{0}'",
|
|
||||||
ShowHexResponse ? ComTextHelper.GetEscapedText(args.Text) : args.Text);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SendLine(string s)
|
void SendLine(string s)
|
||||||
{
|
{
|
||||||
//if (Debug.Level == 2)
|
//if (Debug.Level == 2)
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
public GenericComm(DeviceConfig config)
|
public GenericComm(DeviceConfig config)
|
||||||
: base(config)
|
: base(config)
|
||||||
{
|
{
|
||||||
|
|
||||||
PropertiesConfig = CommFactory.GetControlPropertiesConfig(config);
|
PropertiesConfig = CommFactory.GetControlPropertiesConfig(config);
|
||||||
|
|
||||||
var commPort = CommFactory.CreateCommForDevice(config);
|
var commPort = CommFactory.CreateCommForDevice(config);
|
||||||
@@ -96,7 +97,6 @@ namespace PepperDash.Essentials.Core
|
|||||||
// this is a permanent event handler. This cannot be -= from event
|
// this is a permanent event handler. This cannot be -= from event
|
||||||
CommPort.TextReceived += (s, a) =>
|
CommPort.TextReceived += (s, a) =>
|
||||||
{
|
{
|
||||||
Debug.Console(2, this, "RX: {0}", a.Text);
|
|
||||||
trilist.SetString(joinMap.TextReceived.JoinNumber, a.Text);
|
trilist.SetString(joinMap.TextReceived.JoinNumber, a.Text);
|
||||||
};
|
};
|
||||||
trilist.SetStringSigAction(joinMap.SendText.JoinNumber, s => CommPort.SendText(s));
|
trilist.SetStringSigAction(joinMap.SendText.JoinNumber, s => CommPort.SendText(s));
|
||||||
|
|||||||
@@ -33,7 +33,6 @@ namespace PepperDash.Essentials.Core
|
|||||||
string url = string.Format("http://{0}/{1}", Client.HostName, path);
|
string url = string.Format("http://{0}/{1}", Client.HostName, path);
|
||||||
request.Url = new UrlParser(url);
|
request.Url = new UrlParser(url);
|
||||||
HttpClient.DISPATCHASYNC_ERROR error = Client.DispatchAsyncEx(request, Response, request);
|
HttpClient.DISPATCHASYNC_ERROR error = Client.DispatchAsyncEx(request, Response, request);
|
||||||
Debug.Console(2, this, "GenericHttpClient SentRequest TX:'{0}'", url);
|
|
||||||
}
|
}
|
||||||
public void SendText(string format, params object[] items)
|
public void SendText(string format, params object[] items)
|
||||||
{
|
{
|
||||||
@@ -41,7 +40,6 @@ namespace PepperDash.Essentials.Core
|
|||||||
string url = string.Format("http://{0}/{1}", Client.HostName, string.Format(format, items));
|
string url = string.Format("http://{0}/{1}", Client.HostName, string.Format(format, items));
|
||||||
request.Url = new UrlParser(url);
|
request.Url = new UrlParser(url);
|
||||||
HttpClient.DISPATCHASYNC_ERROR error = Client.DispatchAsyncEx(request, Response, request);
|
HttpClient.DISPATCHASYNC_ERROR error = Client.DispatchAsyncEx(request, Response, request);
|
||||||
Debug.Console(2, this, "GenericHttpClient SentRequest TX:'{0}'", url);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendTextNoResponse(string format, params object[] items)
|
public void SendTextNoResponse(string format, params object[] items)
|
||||||
@@ -50,7 +48,6 @@ namespace PepperDash.Essentials.Core
|
|||||||
string url = string.Format("http://{0}/{1}", Client.HostName, string.Format(format, items));
|
string url = string.Format("http://{0}/{1}", Client.HostName, string.Format(format, items));
|
||||||
request.Url = new UrlParser(url);
|
request.Url = new UrlParser(url);
|
||||||
Client.Dispatch(request);
|
Client.Dispatch(request);
|
||||||
Debug.Console(2, this, "GenericHttpClient SentRequest TX:'{0}'", url);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Response(HttpClientResponse response, HTTP_CALLBACK_ERROR error, object request)
|
private void Response(HttpClientResponse response, HTTP_CALLBACK_ERROR error, object request)
|
||||||
@@ -63,10 +60,6 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
if (ResponseRecived != null)
|
if (ResponseRecived != null)
|
||||||
ResponseRecived(this, new GenericHttpClientEventArgs(responseReceived.ContentString, (request as HttpClientRequest).Url.ToString(), error));
|
ResponseRecived(this, new GenericHttpClientEventArgs(responseReceived.ContentString, (request as HttpClientRequest).Url.ToString(), error));
|
||||||
|
|
||||||
Debug.Console(2, this, "GenericHttpClient ResponseReceived");
|
|
||||||
Debug.Console(2, this, "RX:{0}", responseReceived.ContentString);
|
|
||||||
Debug.Console(2, this, "TX:{0}", (request as HttpClientRequest).Url.ToString());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,83 +1,83 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
using Crestron.SimplSharp.CrestronIO;
|
using Crestron.SimplSharp.CrestronIO;
|
||||||
using Crestron.SimplSharpPro;
|
using Crestron.SimplSharpPro;
|
||||||
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core
|
namespace PepperDash.Essentials.Core
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static class IRPortHelper
|
public static class IRPortHelper
|
||||||
{
|
{
|
||||||
public static string IrDriverPathPrefix
|
public static string IrDriverPathPrefix
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return Global.FilePathPrefix + "IR" + Global.DirectorySeparator;
|
return Global.FilePathPrefix + "IR" + Global.DirectorySeparator;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Finds either the ControlSystem or a device controller that contains IR ports and
|
/// Finds either the ControlSystem or a device controller that contains IR ports and
|
||||||
/// returns a port from the hardware device
|
/// returns a port from the hardware device
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="propsToken"></param>
|
/// <param name="propsToken"></param>
|
||||||
/// <returns>IrPortConfig object. The port and or filename will be empty/null
|
/// <returns>IrPortConfig object. The port and or filename will be empty/null
|
||||||
/// if valid values don't exist on config</returns>
|
/// if valid values don't exist on config</returns>
|
||||||
public static IrOutPortConfig GetIrPort(JToken propsToken)
|
public static IrOutPortConfig GetIrPort(JToken propsToken)
|
||||||
{
|
{
|
||||||
var control = propsToken["control"];
|
var control = propsToken["control"];
|
||||||
if (control == null)
|
if (control == null)
|
||||||
return null;
|
return null;
|
||||||
if (control["method"].Value<string>() != "ir")
|
if (control["method"].Value<string>() != "ir")
|
||||||
{
|
{
|
||||||
Debug.Console(0, "IRPortHelper called with non-IR properties");
|
Debug.Console(0, "IRPortHelper called with non-IR properties");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
var port = new IrOutPortConfig();
|
var port = new IrOutPortConfig();
|
||||||
|
|
||||||
var portDevKey = control.Value<string>("controlPortDevKey");
|
var portDevKey = control.Value<string>("controlPortDevKey");
|
||||||
var portNum = control.Value<uint>("controlPortNumber");
|
var portNum = control.Value<uint>("controlPortNumber");
|
||||||
if (portDevKey == null || portNum == 0)
|
if (portDevKey == null || portNum == 0)
|
||||||
{
|
{
|
||||||
Debug.Console(1, "WARNING: Properties is missing port device or port number");
|
Debug.Console(1, "WARNING: Properties is missing port device or port number");
|
||||||
return port;
|
return port;
|
||||||
}
|
}
|
||||||
|
|
||||||
IIROutputPorts irDev = null;
|
IIROutputPorts irDev = null;
|
||||||
if (portDevKey.Equals("controlSystem", StringComparison.OrdinalIgnoreCase)
|
if (portDevKey.Equals("controlSystem", StringComparison.OrdinalIgnoreCase)
|
||||||
|| portDevKey.Equals("processor", StringComparison.OrdinalIgnoreCase))
|
|| portDevKey.Equals("processor", StringComparison.OrdinalIgnoreCase))
|
||||||
irDev = Global.ControlSystem;
|
irDev = Global.ControlSystem;
|
||||||
else
|
else
|
||||||
irDev = DeviceManager.GetDeviceForKey(portDevKey) as IIROutputPorts;
|
irDev = DeviceManager.GetDeviceForKey(portDevKey) as IIROutputPorts;
|
||||||
|
|
||||||
if (irDev == null)
|
if (irDev == null)
|
||||||
{
|
{
|
||||||
Debug.Console(1, "[Config] Error, device with IR ports '{0}' not found", portDevKey);
|
Debug.Console(1, "[Config] Error, device with IR ports '{0}' not found", portDevKey);
|
||||||
return port;
|
return port;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (portNum <= irDev.NumberOfIROutputPorts) // success!
|
if (portNum <= irDev.NumberOfIROutputPorts) // success!
|
||||||
{
|
{
|
||||||
var file = IrDriverPathPrefix + control["irFile"].Value<string>();
|
var file = IrDriverPathPrefix + control["irFile"].Value<string>();
|
||||||
port.Port = irDev.IROutputPorts[portNum];
|
port.Port = irDev.IROutputPorts[portNum];
|
||||||
port.FileName = file;
|
port.FileName = file;
|
||||||
return port; // new IrOutPortConfig { Port = irDev.IROutputPorts[portNum], FileName = file };
|
return port; // new IrOutPortConfig { Port = irDev.IROutputPorts[portNum], FileName = file };
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Debug.Console(1, "[Config] Error, device '{0}' IR port {1} out of range",
|
Debug.Console(1, "[Config] Error, device '{0}' IR port {1} out of range",
|
||||||
portDevKey, portNum);
|
portDevKey, portNum);
|
||||||
return port;
|
return port;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IROutputPort GetIrOutputPort(DeviceConfig dc)
|
public static IROutputPort GetIrOutputPort(DeviceConfig dc)
|
||||||
@@ -124,7 +124,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
Debug.Console(0, "WARNING: device with IR ports '{0}' not found", portDevKey);
|
Debug.Console(0, "WARNING: device with IR ports '{0}' not found", portDevKey);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (portNum >= irDev.NumberOfIROutputPorts)
|
if (portNum > irDev.NumberOfIROutputPorts)
|
||||||
{
|
{
|
||||||
Debug.Console(0, "WARNING: device '{0}' IR port {1} out of range",
|
Debug.Console(0, "WARNING: device '{0}' IR port {1} out of range",
|
||||||
portDevKey, portNum);
|
portDevKey, portNum);
|
||||||
@@ -134,10 +134,9 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
var port = irDev.IROutputPorts[portNum];
|
var port = irDev.IROutputPorts[portNum];
|
||||||
|
|
||||||
port.LoadIRDriver(Global.FilePathPrefix + "IR" + Global.DirectorySeparator + control["irFile"].Value<string>());
|
|
||||||
|
|
||||||
return port;
|
return port;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IrOutputPortController GetIrOutputPortController(DeviceConfig config)
|
public static IrOutputPortController GetIrOutputPortController(DeviceConfig config)
|
||||||
@@ -149,87 +148,88 @@ namespace PepperDash.Essentials.Core
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
var irDevice = new IrOutputPortController(config.Key, GetIrOutputPort, config);
|
var postActivationFunc = new Func<DeviceConfig,IROutputPort> (GetIrOutputPort);
|
||||||
|
var irDevice = new IrOutputPortController(config.Key + "-ir", postActivationFunc, config);
|
||||||
|
|
||||||
return irDevice;
|
return irDevice;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns a ready-to-go IrOutputPortController from a DeviceConfig object.
|
/// Returns a ready-to-go IrOutputPortController from a DeviceConfig object.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static IrOutputPortController GetIrOutputPortController(DeviceConfig devConf)
|
public static IrOutputPortController GetIrOutputPortController(DeviceConfig devConf)
|
||||||
{
|
{
|
||||||
var irControllerKey = devConf.Key + "-ir";
|
var irControllerKey = devConf.Key + "-ir";
|
||||||
if (devConf.Properties == null)
|
if (devConf.Properties == null)
|
||||||
{
|
{
|
||||||
Debug.Console(0, "[{0}] WARNING: Device config does not include properties. IR will not function.", devConf.Key);
|
Debug.Console(0, "[{0}] WARNING: Device config does not include properties. IR will not function.", devConf.Key);
|
||||||
return new IrOutputPortController(irControllerKey, null, "");
|
return new IrOutputPortController(irControllerKey, null, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
var control = devConf.Properties["control"];
|
var control = devConf.Properties["control"];
|
||||||
if (control == null)
|
if (control == null)
|
||||||
{
|
{
|
||||||
var c = new IrOutputPortController(irControllerKey, null, "");
|
var c = new IrOutputPortController(irControllerKey, null, "");
|
||||||
Debug.Console(0, c, "WARNING: Device config does not include control properties. IR will not function");
|
Debug.Console(0, c, "WARNING: Device config does not include control properties. IR will not function");
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
var portDevKey = control.Value<string>("controlPortDevKey");
|
var portDevKey = control.Value<string>("controlPortDevKey");
|
||||||
var portNum = control.Value<uint>("controlPortNumber");
|
var portNum = control.Value<uint>("controlPortNumber");
|
||||||
IIROutputPorts irDev = null;
|
IIROutputPorts irDev = null;
|
||||||
|
|
||||||
if (portDevKey == null)
|
if (portDevKey == null)
|
||||||
{
|
{
|
||||||
var c = new IrOutputPortController(irControllerKey, null, "");
|
var c = new IrOutputPortController(irControllerKey, null, "");
|
||||||
Debug.Console(0, c, "WARNING: control properties is missing ir device");
|
Debug.Console(0, c, "WARNING: control properties is missing ir device");
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (portNum == 0)
|
if (portNum == 0)
|
||||||
{
|
{
|
||||||
var c = new IrOutputPortController(irControllerKey, null, "");
|
var c = new IrOutputPortController(irControllerKey, null, "");
|
||||||
Debug.Console(0, c, "WARNING: control properties is missing ir port number");
|
Debug.Console(0, c, "WARNING: control properties is missing ir port number");
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (portDevKey.Equals("controlSystem", StringComparison.OrdinalIgnoreCase)
|
if (portDevKey.Equals("controlSystem", StringComparison.OrdinalIgnoreCase)
|
||||||
|| portDevKey.Equals("processor", StringComparison.OrdinalIgnoreCase))
|
|| portDevKey.Equals("processor", StringComparison.OrdinalIgnoreCase))
|
||||||
irDev = Global.ControlSystem;
|
irDev = Global.ControlSystem;
|
||||||
else
|
else
|
||||||
irDev = DeviceManager.GetDeviceForKey(portDevKey) as IIROutputPorts;
|
irDev = DeviceManager.GetDeviceForKey(portDevKey) as IIROutputPorts;
|
||||||
|
|
||||||
if (irDev == null)
|
if (irDev == null)
|
||||||
{
|
{
|
||||||
var c = new IrOutputPortController(irControllerKey, null, "");
|
var c = new IrOutputPortController(irControllerKey, null, "");
|
||||||
Debug.Console(0, c, "WARNING: device with IR ports '{0}' not found", portDevKey);
|
Debug.Console(0, c, "WARNING: device with IR ports '{0}' not found", portDevKey);
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (portNum <= irDev.NumberOfIROutputPorts) // success!
|
if (portNum <= irDev.NumberOfIROutputPorts) // success!
|
||||||
return new IrOutputPortController(irControllerKey, irDev.IROutputPorts[portNum],
|
return new IrOutputPortController(irControllerKey, irDev.IROutputPorts[portNum],
|
||||||
IrDriverPathPrefix + control["irFile"].Value<string>());
|
IrDriverPathPrefix + control["irFile"].Value<string>());
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var c = new IrOutputPortController(irControllerKey, null, "");
|
var c = new IrOutputPortController(irControllerKey, null, "");
|
||||||
Debug.Console(0, c, "WARNING: device '{0}' IR port {1} out of range",
|
Debug.Console(0, c, "WARNING: device '{0}' IR port {1} out of range",
|
||||||
portDevKey, portNum);
|
portDevKey, portNum);
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
}*/
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Wrapper to help in IR port creation
|
/// Wrapper to help in IR port creation
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class IrOutPortConfig
|
public class IrOutPortConfig
|
||||||
{
|
{
|
||||||
public IROutputPort Port { get; set; }
|
public IROutputPort Port { get; set; }
|
||||||
public string FileName { get; set; }
|
public string FileName { get; set; }
|
||||||
|
|
||||||
public IrOutPortConfig()
|
public IrOutPortConfig()
|
||||||
{
|
{
|
||||||
FileName = "";
|
FileName = "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,11 +1,8 @@
|
|||||||
using System;
|
using System.Collections.Generic;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core;
|
using Newtonsoft.Json.Linq;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Config
|
namespace PepperDash.Essentials.Core.Config
|
||||||
{
|
{
|
||||||
@@ -23,11 +20,24 @@ namespace PepperDash.Essentials.Core.Config
|
|||||||
[JsonProperty("sourceLists")]
|
[JsonProperty("sourceLists")]
|
||||||
public Dictionary<string, Dictionary<string, SourceListItem>> SourceLists { get; set; }
|
public Dictionary<string, Dictionary<string, SourceListItem>> SourceLists { get; set; }
|
||||||
|
|
||||||
[JsonProperty("tieLines")]
|
[JsonProperty("destinationLists")]
|
||||||
|
public Dictionary<string, Dictionary<string,DestinationListItem>> DestinationLists { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("tieLines")]
|
||||||
public List<TieLineConfig> TieLines { get; set; }
|
public List<TieLineConfig> TieLines { get; set; }
|
||||||
|
|
||||||
[JsonProperty("joinMaps")]
|
[JsonProperty("joinMaps")]
|
||||||
public Dictionary<string, string> JoinMaps { get; set; }
|
public Dictionary<string, JObject> JoinMaps { get; set; }
|
||||||
|
|
||||||
|
public BasicConfig()
|
||||||
|
{
|
||||||
|
Info = new InfoConfig();
|
||||||
|
Devices = new List<DeviceConfig>();
|
||||||
|
SourceLists = new Dictionary<string, Dictionary<string, SourceListItem>>();
|
||||||
|
DestinationLists = new Dictionary<string, Dictionary<string, DestinationListItem>>();
|
||||||
|
TieLines = new List<TieLineConfig>();
|
||||||
|
JoinMaps = new Dictionary<string, JObject>();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Checks SourceLists for a given list and returns it if found. Otherwise, returns null
|
/// Checks SourceLists for a given list and returns it if found. Otherwise, returns null
|
||||||
@@ -40,6 +50,21 @@ namespace PepperDash.Essentials.Core.Config
|
|||||||
return SourceLists[key];
|
return SourceLists[key];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Retrieves a DestinationListItem based on the key
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">key of the item to retrieve</param>
|
||||||
|
/// <returns>DestinationListItem if the key exists, null otherwise</returns>
|
||||||
|
public Dictionary<string, DestinationListItem> GetDestinationListForKey(string key)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(key) || !DestinationLists.ContainsKey(key))
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return DestinationLists[key];
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Checks Devices for an item with a Key that matches and returns it if found. Otherwise, retunes null
|
/// Checks Devices for an item with a Key that matches and returns it if found. Otherwise, retunes null
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -30,7 +30,19 @@ namespace PepperDash.Essentials.Core.Config
|
|||||||
|
|
||||||
[JsonProperty("properties")]
|
[JsonProperty("properties")]
|
||||||
[JsonConverter(typeof(DevicePropertiesConverter))]
|
[JsonConverter(typeof(DevicePropertiesConverter))]
|
||||||
public JToken Properties { get; set; }
|
public JToken Properties { get; set; }
|
||||||
|
|
||||||
|
public DeviceConfig(DeviceConfig dc)
|
||||||
|
{
|
||||||
|
Key = dc.Key;
|
||||||
|
Uid = dc.Uid;
|
||||||
|
Name = dc.Name;
|
||||||
|
Group = dc.Group;
|
||||||
|
Type = dc.Type;
|
||||||
|
Properties = JToken.FromObject(dc.Properties);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DeviceConfig() {}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -1,183 +1,254 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Crestron.SimplSharp;
|
using System.Text;
|
||||||
using Crestron.SimplSharp.CrestronIO;
|
using Crestron.SimplSharp;
|
||||||
using Newtonsoft.Json;
|
using Crestron.SimplSharp.CrestronIO;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json;
|
||||||
using PepperDash.Core;
|
using Newtonsoft.Json.Linq;
|
||||||
using PepperDash.Core.Config;
|
using PepperDash.Core;
|
||||||
|
using PepperDash.Core.Config;
|
||||||
namespace PepperDash.Essentials.Core.Config
|
|
||||||
{
|
namespace PepperDash.Essentials.Core.Config
|
||||||
/// <summary>
|
{
|
||||||
/// Loads the ConfigObject from the file
|
/// <summary>
|
||||||
/// </summary>
|
/// Loads the ConfigObject from the file
|
||||||
public class ConfigReader
|
/// </summary>
|
||||||
{
|
public class ConfigReader
|
||||||
public static EssentialsConfig ConfigObject { get; private set; }
|
{
|
||||||
|
public const string LocalConfigPresent =
|
||||||
public static bool LoadConfig2()
|
@"
|
||||||
{
|
***************************************************
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Loading unmerged system/template portal configuration file.");
|
************* Using Local config file *************
|
||||||
try
|
***************************************************";
|
||||||
{
|
|
||||||
// Check for local config file first
|
public static EssentialsConfig ConfigObject { get; private set; }
|
||||||
var filePath = Global.FilePathPrefix + ConfigWriter.LocalConfigFolder + Global.DirectorySeparator + Global.ConfigFileName;
|
|
||||||
|
public static bool LoadConfig2()
|
||||||
bool localConfigFound = false;
|
{
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Loading unmerged system/template portal configuration file.");
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Attempting to load Local config file: '{0}'", filePath);
|
try
|
||||||
|
{
|
||||||
// Check for local config directory first
|
// Check for local config file first
|
||||||
|
var filePath = Global.FilePathPrefix + ConfigWriter.LocalConfigFolder + Global.DirectorySeparator + Global.ConfigFileName;
|
||||||
var configFiles = GetConfigFiles(filePath);
|
|
||||||
|
bool localConfigFound = false;
|
||||||
if (configFiles != null)
|
|
||||||
{
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Attempting to load Local config file: '{0}'", filePath);
|
||||||
if (configFiles.Length > 1)
|
|
||||||
{
|
// Check for local config directory first
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Error,
|
|
||||||
"****Error: Multiple Local Configuration files present. Please ensure only a single file exists and reset program.****");
|
var configFiles = GetConfigFiles(filePath);
|
||||||
return false;
|
|
||||||
}
|
if (configFiles != null)
|
||||||
else if(configFiles.Length == 1)
|
{
|
||||||
{
|
if (configFiles.Length > 1)
|
||||||
localConfigFound = true;
|
{
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Found Local config file: '{0}'", filePath);
|
Debug.Console(0, Debug.ErrorLogLevel.Error,
|
||||||
}
|
"****Error: Multiple Local Configuration files present. Please ensure only a single file exists and reset program.****");
|
||||||
}
|
return false;
|
||||||
else
|
}
|
||||||
{
|
if(configFiles.Length == 1)
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice,
|
{
|
||||||
"Local Configuration file not present.", filePath);
|
localConfigFound = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// Check for Portal Config
|
else
|
||||||
if(!localConfigFound)
|
{
|
||||||
{
|
Debug.Console(0, Debug.ErrorLogLevel.Notice,
|
||||||
filePath = Global.FilePathPrefix + Global.ConfigFileName;
|
"Local Configuration file not present.", filePath);
|
||||||
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Attempting to load Portal config file: '{0}'", filePath);
|
}
|
||||||
|
|
||||||
configFiles = GetConfigFiles(filePath);
|
// Check for Portal Config
|
||||||
|
if(!localConfigFound)
|
||||||
if (configFiles != null)
|
{
|
||||||
{
|
filePath = Global.FilePathPrefix + Global.ConfigFileName;
|
||||||
Debug.Console(2, "{0} config files found matching pattern", configFiles.Length);
|
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Attempting to load Portal config file: '{0}'", filePath);
|
||||||
if (configFiles.Length > 1)
|
|
||||||
{
|
configFiles = GetConfigFiles(filePath);
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Error,
|
|
||||||
"****Error: Multiple Portal Configuration files present. Please ensure only a single file exists and reset program.****");
|
if (configFiles != null)
|
||||||
return false;
|
{
|
||||||
}
|
Debug.Console(2, "{0} config files found matching pattern", configFiles.Length);
|
||||||
else if (configFiles.Length == 1)
|
|
||||||
{
|
if (configFiles.Length > 1)
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Found Portal config file: '{0}'", filePath);
|
{
|
||||||
}
|
Debug.Console(0, Debug.ErrorLogLevel.Error,
|
||||||
else
|
"****Error: Multiple Portal Configuration files present. Please ensure only a single file exists and reset program.****");
|
||||||
{
|
return false;
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "No config file found.");
|
}
|
||||||
return false;
|
else if (configFiles.Length == 1)
|
||||||
}
|
{
|
||||||
}
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Found Portal config file: '{0}'", filePath);
|
||||||
else
|
}
|
||||||
{
|
else
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Error,
|
{
|
||||||
"ERROR: Portal Configuration file not present. Please load file and reset program.");
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "No config file found.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
// Get the actual file path
|
{
|
||||||
filePath = configFiles[0].FullName;
|
Debug.Console(0, Debug.ErrorLogLevel.Error,
|
||||||
|
"ERROR: Portal Configuration file not present. Please load file and reset program.");
|
||||||
// Read the file
|
return false;
|
||||||
using (StreamReader fs = new StreamReader(filePath))
|
}
|
||||||
{
|
}
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Loading config file: '{0}'", filePath);
|
|
||||||
|
// Get the actual file path
|
||||||
if (localConfigFound)
|
filePath = configFiles[0].FullName;
|
||||||
{
|
|
||||||
ConfigObject = JObject.Parse(fs.ReadToEnd()).ToObject<EssentialsConfig>();
|
// Generate debug statement if using a local file.
|
||||||
|
if (localConfigFound)
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Successfully Loaded Local Config");
|
{
|
||||||
|
GetLocalFileMessage(filePath);
|
||||||
return true;
|
}
|
||||||
}
|
|
||||||
else
|
// Read the file
|
||||||
{
|
using (StreamReader fs = new StreamReader(filePath))
|
||||||
var doubleObj = JObject.Parse(fs.ReadToEnd());
|
{
|
||||||
ConfigObject = PortalConfigReader.MergeConfigs(doubleObj).ToObject<EssentialsConfig>();
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Loading config file: '{0}'", filePath);
|
||||||
|
|
||||||
// Extract SystemUrl and TemplateUrl into final config output
|
if (localConfigFound)
|
||||||
|
{
|
||||||
if (doubleObj["system_url"] != null)
|
ConfigObject = JObject.Parse(fs.ReadToEnd()).ToObject<EssentialsConfig>();
|
||||||
{
|
|
||||||
ConfigObject.SystemUrl = doubleObj["system_url"].Value<string>();
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Successfully Loaded Local Config");
|
||||||
}
|
|
||||||
|
return true;
|
||||||
if (doubleObj["template_url"] != null)
|
}
|
||||||
{
|
else
|
||||||
ConfigObject.TemplateUrl = doubleObj["template_url"].Value<string>();
|
{
|
||||||
}
|
var doubleObj = JObject.Parse(fs.ReadToEnd());
|
||||||
}
|
ConfigObject = PortalConfigReader.MergeConfigs(doubleObj).ToObject<EssentialsConfig>();
|
||||||
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Successfully Loaded Merged Config");
|
// Extract SystemUrl and TemplateUrl into final config output
|
||||||
|
|
||||||
return true;
|
if (doubleObj["system_url"] != null)
|
||||||
}
|
{
|
||||||
}
|
ConfigObject.SystemUrl = doubleObj["system_url"].Value<string>();
|
||||||
catch (Exception e)
|
}
|
||||||
{
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Error, "ERROR: Config load failed: \r{0}", e);
|
if (doubleObj["template_url"] != null)
|
||||||
return false;
|
{
|
||||||
}
|
ConfigObject.TemplateUrl = doubleObj["template_url"].Value<string>();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
/// <summary>
|
|
||||||
/// Returns all the files from the directory specified.
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Successfully Loaded Merged Config");
|
||||||
/// </summary>
|
|
||||||
/// <param name="filePath"></param>
|
return true;
|
||||||
/// <returns></returns>
|
}
|
||||||
public static FileInfo[] GetConfigFiles(string filePath)
|
}
|
||||||
{
|
catch (Exception e)
|
||||||
// Get the directory
|
{
|
||||||
var dir = Path.GetDirectoryName(filePath);
|
Debug.Console(0, Debug.ErrorLogLevel.Error, "ERROR: Config load failed: \r{0}", e);
|
||||||
|
return false;
|
||||||
if (Directory.Exists(dir))
|
}
|
||||||
{
|
}
|
||||||
Debug.Console(1, "Searching in Directory '{0}'", dir);
|
|
||||||
// Get the directory info
|
/// <summary>
|
||||||
var dirInfo = new DirectoryInfo(dir);
|
/// Returns all the files from the directory specified.
|
||||||
|
/// </summary>
|
||||||
// Get the file name
|
/// <param name="filePath"></param>
|
||||||
var fileName = Path.GetFileName(filePath);
|
/// <returns></returns>
|
||||||
Debug.Console(1, "For Config Files matching: '{0}'", fileName);
|
public static FileInfo[] GetConfigFiles(string filePath)
|
||||||
|
{
|
||||||
// Get the files that match from the directory
|
// Get the directory
|
||||||
return dirInfo.GetFiles(fileName);
|
var dir = Path.GetDirectoryName(filePath);
|
||||||
}
|
|
||||||
else
|
if (Directory.Exists(dir))
|
||||||
{
|
{
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice,
|
Debug.Console(1, "Searching in Directory '{0}'", dir);
|
||||||
"Directory not found: ", dir);
|
// Get the directory info
|
||||||
|
var dirInfo = new DirectoryInfo(dir);
|
||||||
return null;
|
|
||||||
}
|
// Get the file name
|
||||||
}
|
var fileName = Path.GetFileName(filePath);
|
||||||
|
Debug.Console(1, "For Config Files matching: '{0}'", fileName);
|
||||||
/// <summary>
|
|
||||||
/// Returns the group for a given device key in config
|
// Get the files that match from the directory
|
||||||
/// </summary>
|
return dirInfo.GetFiles(fileName);
|
||||||
/// <param name="key"></param>
|
}
|
||||||
/// <returns></returns>
|
else
|
||||||
public static string GetGroupForDeviceKey(string key)
|
{
|
||||||
{
|
Debug.Console(0, Debug.ErrorLogLevel.Notice,
|
||||||
var dev = ConfigObject.Devices.FirstOrDefault(d => d.Key.Equals(key, StringComparison.OrdinalIgnoreCase));
|
"Directory not found: ", dir);
|
||||||
return dev == null ? null : dev.Group;
|
|
||||||
}
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the group for a given device key in config
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static string GetGroupForDeviceKey(string key)
|
||||||
|
{
|
||||||
|
var dev = ConfigObject.Devices.FirstOrDefault(d => d.Key.Equals(key, StringComparison.OrdinalIgnoreCase));
|
||||||
|
return dev == null ? null : dev.Group;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void GetLocalFileMessage(string filePath)
|
||||||
|
{
|
||||||
|
var filePathLength = filePath.Length + 2;
|
||||||
|
var debugStringWidth = filePathLength + 12;
|
||||||
|
|
||||||
|
if (debugStringWidth < 51)
|
||||||
|
{
|
||||||
|
debugStringWidth = 51;
|
||||||
|
}
|
||||||
|
var qualifier = (filePathLength % 2 != 0)
|
||||||
|
? " Using Local Config File "
|
||||||
|
: " Using Local Config File ";
|
||||||
|
var bookend1 = (debugStringWidth - qualifier.Length) / 2;
|
||||||
|
var bookend2 = (debugStringWidth - filePathLength) / 2;
|
||||||
|
|
||||||
|
|
||||||
|
var newDebugString = new StringBuilder()
|
||||||
|
.Append(CrestronEnvironment.NewLine)
|
||||||
|
// Line 1
|
||||||
|
.Append(new string('*', debugStringWidth))
|
||||||
|
.Append(CrestronEnvironment.NewLine)
|
||||||
|
// Line 2
|
||||||
|
.Append(new string('*', debugStringWidth))
|
||||||
|
.Append(CrestronEnvironment.NewLine)
|
||||||
|
// Line 3
|
||||||
|
.Append(new string('*', 2))
|
||||||
|
.Append(new string(' ', debugStringWidth - 4))
|
||||||
|
.Append(new string('*', 2))
|
||||||
|
.Append(CrestronEnvironment.NewLine)
|
||||||
|
// Line 4
|
||||||
|
.Append(new string('*', 2))
|
||||||
|
.Append(new string(' ', bookend1 - 2))
|
||||||
|
.Append(qualifier)
|
||||||
|
.Append(new string(' ', bookend1 - 2))
|
||||||
|
.Append(new string('*', 2))
|
||||||
|
.Append(CrestronEnvironment.NewLine)
|
||||||
|
// Line 5
|
||||||
|
.Append(new string('*', 2))
|
||||||
|
.Append(new string(' ', bookend2 - 2))
|
||||||
|
.Append(" " + filePath + " ")
|
||||||
|
.Append(new string(' ', bookend2 - 2))
|
||||||
|
.Append(new string('*', 2))
|
||||||
|
.Append(CrestronEnvironment.NewLine)
|
||||||
|
// Line 6
|
||||||
|
.Append(new string('*', 2))
|
||||||
|
.Append(new string(' ', debugStringWidth - 4))
|
||||||
|
.Append(new string('*', 2))
|
||||||
|
.Append(CrestronEnvironment.NewLine)
|
||||||
|
// Line 7
|
||||||
|
.Append(new string('*', debugStringWidth))
|
||||||
|
.Append(CrestronEnvironment.NewLine)
|
||||||
|
// Line 8
|
||||||
|
.Append(new string('*', debugStringWidth));
|
||||||
|
|
||||||
|
Debug.Console(2, Debug.ErrorLogLevel.Notice, "Found Local config file: '{0}'", filePath);
|
||||||
|
Debug.Console(0, newDebugString.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,162 +1,162 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
using Crestron.SimplSharp.CrestronIO;
|
using Crestron.SimplSharp.CrestronIO;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Config
|
namespace PepperDash.Essentials.Core.Config
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Responsible for updating config at runtime, and writing the updates out to a local file
|
/// Responsible for updating config at runtime, and writing the updates out to a local file
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class ConfigWriter
|
public class ConfigWriter
|
||||||
{
|
{
|
||||||
public const string LocalConfigFolder = "LocalConfig";
|
public const string LocalConfigFolder = "LocalConfig";
|
||||||
|
|
||||||
public const long WriteTimeout = 30000;
|
public const long WriteTimeout = 30000;
|
||||||
|
|
||||||
public static CTimer WriteTimer;
|
public static CTimer WriteTimer;
|
||||||
static CCriticalSection fileLock = new CCriticalSection();
|
static CCriticalSection fileLock = new CCriticalSection();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Updates the config properties of a device
|
/// Updates the config properties of a device
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="deviceKey"></param>
|
/// <param name="deviceKey"></param>
|
||||||
/// <param name="properties"></param>
|
/// <param name="properties"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static bool UpdateDeviceProperties(string deviceKey, JToken properties)
|
public static bool UpdateDeviceProperties(string deviceKey, JToken properties)
|
||||||
{
|
{
|
||||||
bool success = false;
|
bool success = false;
|
||||||
|
|
||||||
// Get the current device config
|
// Get the current device config
|
||||||
var deviceConfig = ConfigReader.ConfigObject.Devices.FirstOrDefault(d => d.Key.Equals(deviceKey));
|
var deviceConfig = ConfigReader.ConfigObject.Devices.FirstOrDefault(d => d.Key.Equals(deviceKey));
|
||||||
|
|
||||||
if (deviceConfig != null)
|
if (deviceConfig != null)
|
||||||
{
|
{
|
||||||
// Replace the current properties JToken with the new one passed into this method
|
// Replace the current properties JToken with the new one passed into this method
|
||||||
deviceConfig.Properties = properties;
|
deviceConfig.Properties = properties;
|
||||||
|
|
||||||
Debug.Console(1, "Updated properties of device: '{0}'", deviceKey);
|
Debug.Console(1, "Updated properties of device: '{0}'", deviceKey);
|
||||||
|
|
||||||
success = true;
|
success = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
ResetTimer();
|
ResetTimer();
|
||||||
|
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool UpdateDeviceConfig(DeviceConfig config)
|
public static bool UpdateDeviceConfig(DeviceConfig config)
|
||||||
{
|
{
|
||||||
bool success = false;
|
bool success = false;
|
||||||
|
|
||||||
var deviceConfig = ConfigReader.ConfigObject.Devices.FirstOrDefault(d => d.Key.Equals(config.Key));
|
var deviceConfigIndex = ConfigReader.ConfigObject.Devices.FindIndex(d => d.Key.Equals(config.Key));
|
||||||
|
|
||||||
if (deviceConfig != null)
|
if (deviceConfigIndex >= 0)
|
||||||
{
|
{
|
||||||
deviceConfig = config;
|
ConfigReader.ConfigObject.Devices[deviceConfigIndex] = config;
|
||||||
|
|
||||||
Debug.Console(1, "Updated config of device: '{0}'", config.Key);
|
Debug.Console(1, "Updated config of device: '{0}'", config.Key);
|
||||||
|
|
||||||
success = true;
|
success = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
ResetTimer();
|
ResetTimer();
|
||||||
|
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool UpdateRoomConfig(DeviceConfig config)
|
public static bool UpdateRoomConfig(DeviceConfig config)
|
||||||
{
|
{
|
||||||
bool success = false;
|
bool success = false;
|
||||||
|
|
||||||
var deviceConfig = ConfigReader.ConfigObject.Rooms.FirstOrDefault(d => d.Key.Equals(config.Key));
|
var roomConfigIndex = ConfigReader.ConfigObject.Rooms.FindIndex(d => d.Key.Equals(config.Key));
|
||||||
|
|
||||||
if (deviceConfig != null)
|
if (roomConfigIndex >= 0)
|
||||||
{
|
{
|
||||||
deviceConfig = config;
|
ConfigReader.ConfigObject.Rooms[roomConfigIndex] = config;
|
||||||
|
|
||||||
Debug.Console(1, "Updated config of device: '{0}'", config.Key);
|
Debug.Console(1, "Updated room of device: '{0}'", config.Key);
|
||||||
|
|
||||||
success = true;
|
success = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
ResetTimer();
|
ResetTimer();
|
||||||
|
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Resets (or starts) the write timer
|
/// Resets (or starts) the write timer
|
||||||
/// </summary>
|
/// </summary>
|
||||||
static void ResetTimer()
|
static void ResetTimer()
|
||||||
{
|
{
|
||||||
if (WriteTimer == null)
|
if (WriteTimer == null)
|
||||||
WriteTimer = new CTimer(WriteConfigFile, WriteTimeout);
|
WriteTimer = new CTimer(WriteConfigFile, WriteTimeout);
|
||||||
|
|
||||||
WriteTimer.Reset(WriteTimeout);
|
WriteTimer.Reset(WriteTimeout);
|
||||||
|
|
||||||
Debug.Console(1, "Config File write timer has been reset.");
|
Debug.Console(1, "Config File write timer has been reset.");
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Writes the current config to a file in the LocalConfig subfolder
|
/// Writes the current config to a file in the LocalConfig subfolder
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
private static void WriteConfigFile(object o)
|
private static void WriteConfigFile(object o)
|
||||||
{
|
{
|
||||||
var filePath = Global.FilePathPrefix + LocalConfigFolder + Global.DirectorySeparator + "configurationFile.json";
|
var filePath = Global.FilePathPrefix + LocalConfigFolder + Global.DirectorySeparator + "configurationFile.json";
|
||||||
|
|
||||||
var configData = JsonConvert.SerializeObject(ConfigReader.ConfigObject);
|
var configData = JsonConvert.SerializeObject(ConfigReader.ConfigObject);
|
||||||
|
|
||||||
WriteFile(filePath, configData);
|
WriteFile(filePath, configData);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Writes
|
/// Writes
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="filepath"></param>
|
/// <param name="filepath"></param>
|
||||||
/// <param name="o"></param>
|
/// <param name="o"></param>
|
||||||
public static void WriteFile(string filePath, string configData)
|
public static void WriteFile(string filePath, string configData)
|
||||||
{
|
{
|
||||||
if (WriteTimer != null)
|
if (WriteTimer != null)
|
||||||
WriteTimer.Stop();
|
WriteTimer.Stop();
|
||||||
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Writing Configuration to file");
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Writing Configuration to file");
|
||||||
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Attempting to write config file: '{0}'", filePath);
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Attempting to write config file: '{0}'", filePath);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (fileLock.TryEnter())
|
if (fileLock.TryEnter())
|
||||||
{
|
{
|
||||||
using (StreamWriter sw = new StreamWriter(filePath))
|
using (StreamWriter sw = new StreamWriter(filePath))
|
||||||
{
|
{
|
||||||
sw.Write(configData);
|
sw.Write(configData);
|
||||||
sw.Flush();
|
sw.Flush();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Error, "Unable to enter FileLock");
|
Debug.Console(0, Debug.ErrorLogLevel.Error, "Unable to enter FileLock");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: Config write failed: \r{0}", e);
|
Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: Config write failed: \r{0}", e);
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
if (fileLock != null && !fileLock.Disposed)
|
if (fileLock != null && !fileLock.Disposed)
|
||||||
fileLock.Leave();
|
fileLock.Leave();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -51,6 +51,13 @@ namespace PepperDash.Essentials.Core.Config
|
|||||||
|
|
||||||
[JsonProperty("rooms")]
|
[JsonProperty("rooms")]
|
||||||
public List<DeviceConfig> Rooms { get; set; }
|
public List<DeviceConfig> Rooms { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
public EssentialsConfig()
|
||||||
|
: base()
|
||||||
|
{
|
||||||
|
Rooms = new List<DeviceConfig>();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
using Crestron.SimplSharp.Reflection;
|
using Crestron.SimplSharp.Reflection;
|
||||||
|
|
||||||
@@ -81,7 +81,7 @@ namespace PepperDash.Essentials.Core.Config
|
|||||||
// }
|
// }
|
||||||
//}
|
//}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>,
|
||||||
/// The OS Version of the processor (Firmware Version)
|
/// The OS Version of the processor (Firmware Version)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[JsonProperty("osVersion")]
|
[JsonProperty("osVersion")]
|
||||||
@@ -92,5 +92,18 @@ namespace PepperDash.Essentials.Core.Config
|
|||||||
// return Crestron.SimplSharp.CrestronEnvironment.OSVersion.Firmware;
|
// return Crestron.SimplSharp.CrestronEnvironment.OSVersion.Firmware;
|
||||||
// }
|
// }
|
||||||
//}
|
//}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The information gathered by the processor at runtime about it's NICs and their IP addresses.
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("ipInfo")]
|
||||||
|
public Dictionary<short, EthernetAdapterInfo> IpInfo
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Global.EthernetAdapterInfoCollection;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,106 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Crestron.SimplSharpPro;
|
||||||
|
using Crestron.SimplSharpPro.DeviceSupport;
|
||||||
|
using Crestron.SimplSharpPro.GeneralIO;
|
||||||
|
using PepperDash.Core;
|
||||||
|
using PepperDash.Essentials.Core.Bridges;
|
||||||
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core.CrestronIO
|
||||||
|
{
|
||||||
|
public class C2NIoController:CrestronGenericBaseDevice, IComPorts, IIROutputPorts, IRelayPorts
|
||||||
|
{
|
||||||
|
private C2nIo _device;
|
||||||
|
|
||||||
|
public C2NIoController(string key, Func<DeviceConfig, C2nIo> preActivationFunc, DeviceConfig config):base(key, config.Name)
|
||||||
|
{
|
||||||
|
AddPreActivationAction(() =>
|
||||||
|
{
|
||||||
|
_device = preActivationFunc(config);
|
||||||
|
|
||||||
|
RegisterCrestronGenericBase(_device);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Implementation of IComPorts
|
||||||
|
|
||||||
|
public CrestronCollection<ComPort> ComPorts
|
||||||
|
{
|
||||||
|
get { return _device.ComPorts; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public int NumberOfComPorts
|
||||||
|
{
|
||||||
|
get { return _device.NumberOfComPorts; }
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Implementation of IIROutputPorts
|
||||||
|
|
||||||
|
public CrestronCollection<IROutputPort> IROutputPorts
|
||||||
|
{
|
||||||
|
get { return _device.IROutputPorts; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public int NumberOfIROutputPorts
|
||||||
|
{
|
||||||
|
get { return _device.NumberOfIROutputPorts; }
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Implementation of IRelayPorts
|
||||||
|
|
||||||
|
public CrestronCollection<Relay> RelayPorts
|
||||||
|
{
|
||||||
|
get { return _device.RelayPorts; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public int NumberOfRelayPorts
|
||||||
|
{
|
||||||
|
get { return _device.NumberOfRelayPorts; }
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
|
||||||
|
public class C2NIoControllerFactory : EssentialsDeviceFactory<C2nRthsController>
|
||||||
|
{
|
||||||
|
public C2NIoControllerFactory()
|
||||||
|
{
|
||||||
|
TypeNames = new List<string>() { "c2nio" };
|
||||||
|
}
|
||||||
|
|
||||||
|
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
||||||
|
{
|
||||||
|
Debug.Console(1, "Factory Attempting to create new C2N-IO Device");
|
||||||
|
|
||||||
|
return new C2NIoController(dc.Key, GetC2NIoDevice, dc);
|
||||||
|
}
|
||||||
|
|
||||||
|
static C2nIo GetC2NIoDevice(DeviceConfig dc)
|
||||||
|
{
|
||||||
|
var control = CommFactory.GetControlPropertiesConfig(dc);
|
||||||
|
var cresnetId = control.CresnetIdInt;
|
||||||
|
var branchId = control.ControlPortNumber;
|
||||||
|
var parentKey = string.IsNullOrEmpty(control.ControlPortDevKey) ? "processor" : control.ControlPortDevKey;
|
||||||
|
|
||||||
|
if (parentKey.Equals("processor", StringComparison.CurrentCultureIgnoreCase))
|
||||||
|
{
|
||||||
|
Debug.Console(0, "Device {0} is a valid cresnet master - creating new C2nIo", parentKey);
|
||||||
|
return new C2nIo(cresnetId, Global.ControlSystem);
|
||||||
|
}
|
||||||
|
var cresnetBridge = DeviceManager.GetDeviceForKey(parentKey) as IHasCresnetBranches;
|
||||||
|
|
||||||
|
if (cresnetBridge != null)
|
||||||
|
{
|
||||||
|
Debug.Console(0, "Device {0} is a valid cresnet master - creating new C2nIo", parentKey);
|
||||||
|
return new C2nIo(cresnetId, cresnetBridge.CresnetBranches[branchId]);
|
||||||
|
}
|
||||||
|
Debug.Console(0, "Device {0} is not a valid cresnet master", parentKey);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -73,21 +73,21 @@ namespace PepperDash.Essentials.Core.CrestronIO.Cards
|
|||||||
string cardType;
|
string cardType;
|
||||||
if (!_config.Cards.TryGetValue(i, out cardType))
|
if (!_config.Cards.TryGetValue(i, out cardType))
|
||||||
{
|
{
|
||||||
Debug.Console(1, this, "No card found for slot {0}", i);
|
Debug.Console(0, this, "No card found for slot {0}", i);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (String.IsNullOrEmpty(cardType))
|
if (String.IsNullOrEmpty(cardType))
|
||||||
{
|
{
|
||||||
Debug.Console(0, this, "No card specified for slot {0}", i);
|
Debug.Console(0, this, "No card specified for slot {0}", i);
|
||||||
return;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
Func<uint, C3CardControllerBase> cardBuilder;
|
Func<uint, C3CardControllerBase> cardBuilder;
|
||||||
if (!_cardDict.TryGetValue(cardType.ToLower(), out cardBuilder))
|
if (!_cardDict.TryGetValue(cardType.ToLower(), out cardBuilder))
|
||||||
{
|
{
|
||||||
Debug.Console(0, "Unable to find factory for 3-Series card type {0}.", cardType);
|
Debug.Console(0, "Unable to find factory for 3-Series card type {0}.", cardType);
|
||||||
return;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
|
|||||||
@@ -1,38 +1,39 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
using Crestron.SimplSharpPro;
|
using Crestron.SimplSharpPro;
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
using Crestron.SimplSharpPro.DeviceSupport;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
using PepperDash.Essentials.Core.Bridges;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.CrestronIO
|
namespace PepperDash.Essentials.Core.CrestronIO
|
||||||
{
|
{
|
||||||
[Description("Wrapper class for Digital Input")]
|
[Description("Wrapper class for Digital Input")]
|
||||||
public class GenericDigitalInputDevice : EssentialsBridgeableDevice, IDigitalInput
|
public class GenericDigitalInputDevice : EssentialsBridgeableDevice, IDigitalInput
|
||||||
{
|
{
|
||||||
public DigitalInput InputPort { get; private set; }
|
public DigitalInput InputPort { get; private set; }
|
||||||
|
|
||||||
public BoolFeedback InputStateFeedback { get; private set; }
|
public BoolFeedback InputStateFeedback { get; private set; }
|
||||||
|
|
||||||
Func<bool> InputStateFeedbackFunc
|
Func<bool> InputStateFeedbackFunc
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return () => InputPort.State;
|
return () => InputPort.State;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public GenericDigitalInputDevice(string key, string name, Func<IOPortConfig, DigitalInput> postActivationFunc,
|
public GenericDigitalInputDevice(string key, string name, Func<IOPortConfig, DigitalInput> postActivationFunc,
|
||||||
IOPortConfig config)
|
IOPortConfig config)
|
||||||
: base(key, name)
|
: base(key, name)
|
||||||
{
|
{
|
||||||
|
InputStateFeedback = new BoolFeedback(InputStateFeedbackFunc);
|
||||||
|
|
||||||
AddPostActivationAction(() =>
|
AddPostActivationAction(() =>
|
||||||
{
|
{
|
||||||
@@ -40,15 +41,15 @@ namespace PepperDash.Essentials.Core.CrestronIO
|
|||||||
|
|
||||||
InputPort.Register();
|
InputPort.Register();
|
||||||
|
|
||||||
InputPort.StateChange += InputPort_StateChange;
|
InputPort.StateChange += InputPort_StateChange;
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Events
|
#region Events
|
||||||
|
|
||||||
void InputPort_StateChange(DigitalInput digitalInput, DigitalInputEventArgs args)
|
void InputPort_StateChange(DigitalInput digitalInput, DigitalInputEventArgs args)
|
||||||
{
|
{
|
||||||
InputStateFeedback.FireUpdate();
|
InputStateFeedback.FireUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,7 +82,7 @@ namespace PepperDash.Essentials.Core.CrestronIO
|
|||||||
}
|
}
|
||||||
if (ioPortDevice == null)
|
if (ioPortDevice == null)
|
||||||
{
|
{
|
||||||
Debug.Console(0, "GetDigitalInput: Device '0' is not a valid IRelayPorts Device", dc.PortDeviceKey);
|
Debug.Console(0, "GetDigitalInput: Device '0' is not a valid IDigitalInputPorts Device", dc.PortDeviceKey);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -99,13 +100,13 @@ namespace PepperDash.Essentials.Core.CrestronIO
|
|||||||
|
|
||||||
#region Bridge Linking
|
#region Bridge Linking
|
||||||
|
|
||||||
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
||||||
{
|
{
|
||||||
var joinMap = new IDigitalInputJoinMap(joinStart);
|
var joinMap = new IDigitalInputJoinMap(joinStart);
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(joinMapSerialized))
|
if (!string.IsNullOrEmpty(joinMapSerialized))
|
||||||
joinMap = JsonConvert.DeserializeObject<IDigitalInputJoinMap>(joinMapSerialized);
|
joinMap = JsonConvert.DeserializeObject<IDigitalInputJoinMap>(joinMapSerialized);
|
||||||
|
|
||||||
if (bridge != null)
|
if (bridge != null)
|
||||||
@@ -115,19 +116,19 @@ namespace PepperDash.Essentials.Core.CrestronIO
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
Debug.Console(0, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device.");
|
Debug.Console(0, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device.");
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Debug.Console(1, this, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
|
Debug.Console(1, this, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
|
||||||
|
|
||||||
// Link feedback for input state
|
// Link feedback for input state
|
||||||
InputStateFeedback.LinkInputSig(trilist.BooleanInput[joinMap.InputState.JoinNumber]);
|
InputStateFeedback.LinkInputSig(trilist.BooleanInput[joinMap.InputState.JoinNumber]);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
Debug.Console(1, this, "Unable to link device '{0}'. Input is null", Key);
|
Debug.Console(1, this, "Unable to link device '{0}'. Input is null", Key);
|
||||||
Debug.Console(1, this, "Error: {0}", e);
|
Debug.Console(1, this, "Error: {0}", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,7 +145,7 @@ namespace PepperDash.Essentials.Core.CrestronIO
|
|||||||
|
|
||||||
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
||||||
{
|
{
|
||||||
Debug.Console(1, "Factory Attempting to create new Generic Relay Device");
|
Debug.Console(1, "Factory Attempting to create new Generic Digital Input Device");
|
||||||
|
|
||||||
var props = JsonConvert.DeserializeObject<IOPortConfig>(dc.Properties.ToString());
|
var props = JsonConvert.DeserializeObject<IOPortConfig>(dc.Properties.ToString());
|
||||||
|
|
||||||
@@ -158,7 +159,7 @@ namespace PepperDash.Essentials.Core.CrestronIO
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -4,15 +4,21 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
using Crestron.SimplSharpPro;
|
using Crestron.SimplSharpPro;
|
||||||
|
using Crestron.SimplSharpPro.DeviceSupport;
|
||||||
|
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
using PepperDash.Essentials.Core.Bridges;
|
||||||
|
|
||||||
|
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.CrestronIO
|
namespace PepperDash.Essentials.Core.CrestronIO
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents a generic digital input deviced tied to a versiport
|
/// Represents a generic digital input deviced tied to a versiport
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class GenericVersiportDigitalInputDevice : EssentialsDevice, IDigitalInput
|
public class GenericVersiportDigitalInputDevice : EssentialsBridgeableDevice, IDigitalInput
|
||||||
{
|
{
|
||||||
public Versiport InputPort { get; private set; }
|
public Versiport InputPort { get; private set; }
|
||||||
|
|
||||||
@@ -26,17 +32,29 @@ namespace PepperDash.Essentials.Core.CrestronIO
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public GenericVersiportDigitalInputDevice(string key, Versiport inputPort, IOPortConfig props):
|
public GenericVersiportDigitalInputDevice(string key, string name, Func<IOPortConfig, Versiport> postActivationFunc, IOPortConfig config) :
|
||||||
base(key)
|
base(key, name)
|
||||||
{
|
{
|
||||||
InputStateFeedback = new BoolFeedback(InputStateFeedbackFunc);
|
InputStateFeedback = new BoolFeedback(InputStateFeedbackFunc);
|
||||||
InputPort = inputPort;
|
|
||||||
InputPort.SetVersiportConfiguration(eVersiportConfiguration.DigitalInput);
|
|
||||||
if (props.DisablePullUpResistor)
|
|
||||||
InputPort.DisablePullUpResistor = true;
|
|
||||||
InputPort.VersiportChange += new VersiportEventHandler(InputPort_VersiportChange);
|
|
||||||
|
|
||||||
Debug.Console(1, this, "Created GenericVersiportDigitalInputDevice on port '{0}'. DisablePullUpResistor: '{1}'", props.PortNumber, InputPort.DisablePullUpResistor);
|
AddPostActivationAction(() =>
|
||||||
|
{
|
||||||
|
InputPort = postActivationFunc(config);
|
||||||
|
|
||||||
|
InputPort.Register();
|
||||||
|
|
||||||
|
InputPort.SetVersiportConfiguration(eVersiportConfiguration.DigitalInput);
|
||||||
|
if (config.DisablePullUpResistor)
|
||||||
|
InputPort.DisablePullUpResistor = true;
|
||||||
|
|
||||||
|
InputPort.VersiportChange += InputPort_VersiportChange;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Debug.Console(1, this, "Created GenericVersiportDigitalInputDevice on port '{0}'. DisablePullUpResistor: '{1}'", config.PortNumber, InputPort.DisablePullUpResistor);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void InputPort_VersiportChange(Versiport port, VersiportEventArgs args)
|
void InputPort_VersiportChange(Versiport port, VersiportEventArgs args)
|
||||||
@@ -46,5 +64,105 @@ namespace PepperDash.Essentials.Core.CrestronIO
|
|||||||
if(args.Event == eVersiportEvent.DigitalInChange)
|
if(args.Event == eVersiportEvent.DigitalInChange)
|
||||||
InputStateFeedback.FireUpdate();
|
InputStateFeedback.FireUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#region Bridge Linking
|
||||||
|
|
||||||
|
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
||||||
|
{
|
||||||
|
var joinMap = new IDigitalInputJoinMap(joinStart);
|
||||||
|
|
||||||
|
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(joinMapSerialized))
|
||||||
|
joinMap = JsonConvert.DeserializeObject<IDigitalInputJoinMap>(joinMapSerialized);
|
||||||
|
|
||||||
|
if (bridge != null)
|
||||||
|
{
|
||||||
|
bridge.AddJoinMap(Key, joinMap);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Console(0, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device.");
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
|
||||||
|
|
||||||
|
// Link feedback for input state
|
||||||
|
InputStateFeedback.LinkInputSig(trilist.BooleanInput[joinMap.InputState.JoinNumber]);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Unable to link device '{0}'. Input is null", Key);
|
||||||
|
Debug.Console(1, this, "Error: {0}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
public static Versiport GetVersiportDigitalInput(IOPortConfig dc)
|
||||||
|
{
|
||||||
|
|
||||||
|
IIOPorts ioPortDevice;
|
||||||
|
|
||||||
|
if (dc.PortDeviceKey.Equals("processor"))
|
||||||
|
{
|
||||||
|
if (!Global.ControlSystem.SupportsVersiport)
|
||||||
|
{
|
||||||
|
Debug.Console(0, "GetVersiportDigitalInput: Processor does not support Versiports");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
ioPortDevice = Global.ControlSystem;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var ioPortDev = DeviceManager.GetDeviceForKey(dc.PortDeviceKey) as IIOPorts;
|
||||||
|
if (ioPortDev == null)
|
||||||
|
{
|
||||||
|
Debug.Console(0, "GetVersiportDigitalInput: Device {0} is not a valid device", dc.PortDeviceKey);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
ioPortDevice = ioPortDev;
|
||||||
|
}
|
||||||
|
if (ioPortDevice == null)
|
||||||
|
{
|
||||||
|
Debug.Console(0, "GetVersiportDigitalInput: Device '0' is not a valid IIOPorts Device", dc.PortDeviceKey);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dc.PortNumber > ioPortDevice.NumberOfVersiPorts)
|
||||||
|
{
|
||||||
|
Debug.Console(0, "GetVersiportDigitalInput: Device {0} does not contain a port {1}", dc.PortDeviceKey, dc.PortNumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ioPortDevice.VersiPorts[dc.PortNumber];
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public class GenericVersiportDigitalInputDeviceFactory : EssentialsDeviceFactory<GenericVersiportDigitalInputDevice>
|
||||||
|
{
|
||||||
|
public GenericVersiportDigitalInputDeviceFactory()
|
||||||
|
{
|
||||||
|
TypeNames = new List<string>() { "versiportinput" };
|
||||||
|
}
|
||||||
|
|
||||||
|
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
||||||
|
{
|
||||||
|
Debug.Console(1, "Factory Attempting to create new Generic Versiport Device");
|
||||||
|
|
||||||
|
var props = JsonConvert.DeserializeObject<IOPortConfig>(dc.Properties.ToString());
|
||||||
|
|
||||||
|
if (props == null) return null;
|
||||||
|
|
||||||
|
var portDevice = new GenericVersiportDigitalInputDevice(dc.Key, dc.Name, GenericVersiportDigitalInputDevice.GetVersiportDigitalInput, props);
|
||||||
|
|
||||||
|
return portDevice;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,25 +1,25 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
using Crestron.SimplSharpPro;
|
using Crestron.SimplSharpPro;
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
using Crestron.SimplSharpPro.DeviceSupport;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
using PepperDash.Essentials.Core.Bridges;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.CrestronIO
|
namespace PepperDash.Essentials.Core.CrestronIO
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents a generic device controlled by relays
|
/// Represents a generic device controlled by relays
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Description("Wrapper class for a Relay")]
|
[Description("Wrapper class for a Relay")]
|
||||||
public class GenericRelayDevice : EssentialsBridgeableDevice, ISwitchedOutput
|
public class GenericRelayDevice : EssentialsBridgeableDevice, ISwitchedOutput
|
||||||
{
|
{
|
||||||
public Relay RelayOutput { get; private set; }
|
public Relay RelayOutput { get; private set; }
|
||||||
|
|
||||||
public BoolFeedback OutputIsOnFeedback { get; private set; }
|
public BoolFeedback OutputIsOnFeedback { get; private set; }
|
||||||
|
|
||||||
//Maintained for compatibility with PepperDash.Essentials.Core.Devices.CrestronProcessor
|
//Maintained for compatibility with PepperDash.Essentials.Core.Devices.CrestronProcessor
|
||||||
@@ -94,11 +94,11 @@ namespace PepperDash.Essentials.Core.CrestronIO
|
|||||||
|
|
||||||
#region Events
|
#region Events
|
||||||
|
|
||||||
void RelayOutput_StateChange(Relay relay, RelayEventArgs args)
|
void RelayOutput_StateChange(Relay relay, RelayEventArgs args)
|
||||||
{
|
{
|
||||||
OutputIsOnFeedback.FireUpdate();
|
OutputIsOnFeedback.FireUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Methods
|
#region Methods
|
||||||
@@ -119,33 +119,33 @@ namespace PepperDash.Essentials.Core.CrestronIO
|
|||||||
OpenRelay();
|
OpenRelay();
|
||||||
else
|
else
|
||||||
CloseRelay();
|
CloseRelay();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region ISwitchedOutput Members
|
#region ISwitchedOutput Members
|
||||||
|
|
||||||
void ISwitchedOutput.On()
|
void ISwitchedOutput.On()
|
||||||
{
|
{
|
||||||
CloseRelay();
|
CloseRelay();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ISwitchedOutput.Off()
|
void ISwitchedOutput.Off()
|
||||||
{
|
{
|
||||||
OpenRelay();
|
OpenRelay();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Bridge Linking
|
#region Bridge Linking
|
||||||
|
|
||||||
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
||||||
{
|
{
|
||||||
var joinMap = new GenericRelayControllerJoinMap(joinStart);
|
var joinMap = new GenericRelayControllerJoinMap(joinStart);
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(joinMapSerialized))
|
if (!string.IsNullOrEmpty(joinMapSerialized))
|
||||||
joinMap = JsonConvert.DeserializeObject<GenericRelayControllerJoinMap>(joinMapSerialized);
|
joinMap = JsonConvert.DeserializeObject<GenericRelayControllerJoinMap>(joinMapSerialized);
|
||||||
|
|
||||||
if (bridge != null)
|
if (bridge != null)
|
||||||
@@ -155,26 +155,26 @@ namespace PepperDash.Essentials.Core.CrestronIO
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
Debug.Console(0, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device.");
|
Debug.Console(0, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (RelayOutput == null)
|
if (RelayOutput == null)
|
||||||
{
|
{
|
||||||
Debug.Console(1, this, "Unable to link device '{0}'. Relay is null", Key);
|
Debug.Console(1, this, "Unable to link device '{0}'. Relay is null", Key);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Debug.Console(1, this, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
|
Debug.Console(1, this, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
|
||||||
|
|
||||||
trilist.SetBoolSigAction(joinMap.Relay.JoinNumber, b =>
|
trilist.SetBoolSigAction(joinMap.Relay.JoinNumber, b =>
|
||||||
{
|
{
|
||||||
if (b)
|
if (b)
|
||||||
CloseRelay();
|
CloseRelay();
|
||||||
else
|
else
|
||||||
OpenRelay();
|
OpenRelay();
|
||||||
});
|
});
|
||||||
|
|
||||||
// feedback for relay state
|
// feedback for relay state
|
||||||
|
|
||||||
OutputIsOnFeedback.LinkInputSig(trilist.BooleanInput[joinMap.Relay.JoinNumber]);
|
OutputIsOnFeedback.LinkInputSig(trilist.BooleanInput[joinMap.Relay.JoinNumber]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -202,54 +202,54 @@ namespace PepperDash.Essentials.Core.CrestronIO
|
|||||||
return portDevice;
|
return portDevice;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
if (props.PortDeviceKey == "processor")
|
if (props.PortDeviceKey == "processor")
|
||||||
portDevice = Global.ControlSystem as IRelayPorts;
|
portDevice = Global.ControlSystem as IRelayPorts;
|
||||||
else
|
else
|
||||||
portDevice = DeviceManager.GetDeviceForKey(props.PortDeviceKey) as IRelayPorts;
|
portDevice = DeviceManager.GetDeviceForKey(props.PortDeviceKey) as IRelayPorts;
|
||||||
|
|
||||||
if (portDevice == null)
|
if (portDevice == null)
|
||||||
Debug.Console(0, "Unable to add relay device with key '{0}'. Port Device does not support relays", key);
|
Debug.Console(0, "Unable to add relay device with key '{0}'. Port Device does not support relays", key);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var cs = (portDevice as CrestronControlSystem);
|
var cs = (portDevice as CrestronControlSystem);
|
||||||
|
|
||||||
if (cs != null)
|
if (cs != null)
|
||||||
{
|
{
|
||||||
// The relay is on a control system processor
|
// The relay is on a control system processor
|
||||||
if (!cs.SupportsRelay || props.PortNumber > cs.NumberOfRelayPorts)
|
if (!cs.SupportsRelay || props.PortNumber > cs.NumberOfRelayPorts)
|
||||||
{
|
{
|
||||||
Debug.Console(0, "Port Device: {0} does not support relays or does not have enough relays");
|
Debug.Console(0, "Port Device: {0} does not support relays or does not have enough relays");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// The relay is on another device type
|
// The relay is on another device type
|
||||||
|
|
||||||
if (props.PortNumber > portDevice.NumberOfRelayPorts)
|
if (props.PortNumber > portDevice.NumberOfRelayPorts)
|
||||||
{
|
{
|
||||||
Debug.Console(0, "Port Device: {0} does not have enough relays");
|
Debug.Console(0, "Port Device: {0} does not have enough relays");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Relay relay = portDevice.RelayPorts[props.PortNumber];
|
Relay relay = portDevice.RelayPorts[props.PortNumber];
|
||||||
|
|
||||||
if (!relay.Registered)
|
if (!relay.Registered)
|
||||||
{
|
{
|
||||||
if (relay.Register() == eDeviceRegistrationUnRegistrationResponse.Success)
|
if (relay.Register() == eDeviceRegistrationUnRegistrationResponse.Success)
|
||||||
return new GenericRelayDevice(key, relay);
|
return new GenericRelayDevice(key, relay);
|
||||||
else
|
else
|
||||||
Debug.Console(0, "Attempt to register relay {0} on device with key '{1}' failed.", props.PortNumber, props.PortDeviceKey);
|
Debug.Console(0, "Attempt to register relay {0} on device with key '{1}' failed.", props.PortNumber, props.PortDeviceKey);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return new GenericRelayDevice(key, relay);
|
return new GenericRelayDevice(key, relay);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Future: Check if portDevice is 3-series card or other non control system that supports versiports
|
// Future: Check if portDevice is 3-series card or other non control system that supports versiports
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -258,7 +258,7 @@ namespace PepperDash.Essentials.Core.CrestronIO
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -130,6 +130,12 @@ namespace PepperDash.Essentials.Core
|
|||||||
void Hardware_OnlineStatusChange(GenericBase currentDevice, OnlineOfflineEventArgs args)
|
void Hardware_OnlineStatusChange(GenericBase currentDevice, OnlineOfflineEventArgs args)
|
||||||
{
|
{
|
||||||
Debug.Console(2, this, "OnlineStatusChange Event. Online = {0}", args.DeviceOnLine);
|
Debug.Console(2, this, "OnlineStatusChange Event. Online = {0}", args.DeviceOnLine);
|
||||||
|
|
||||||
|
if (!Hardware.Registered)
|
||||||
|
{
|
||||||
|
return; // protects in cases where device has been unregistered and feedbacks would attempt to access null sigs.
|
||||||
|
}
|
||||||
|
|
||||||
foreach (var feedback in Feedbacks)
|
foreach (var feedback in Feedbacks)
|
||||||
{
|
{
|
||||||
if (feedback != null)
|
if (feedback != null)
|
||||||
@@ -179,7 +185,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
public static eDeviceRegistrationUnRegistrationResponse RegisterWithLogging(this GenericBase device, string key)
|
public static eDeviceRegistrationUnRegistrationResponse RegisterWithLogging(this GenericBase device, string key)
|
||||||
{
|
{
|
||||||
var result = device.Register();
|
var result = device.Register();
|
||||||
var level = result == eDeviceRegistrationUnRegistrationResponse.Success ?
|
var level = result == eDeviceRegistrationUnRegistrationResponse.Success ?
|
||||||
Debug.ErrorLogLevel.Notice : Debug.ErrorLogLevel.Error;
|
Debug.ErrorLogLevel.Notice : Debug.ErrorLogLevel.Error;
|
||||||
Debug.Console(0, level, "Register device result: '{0}', type '{1}', result {2}", key, device, result);
|
Debug.Console(0, level, "Register device result: '{0}', type '{1}', result {2}", key, device, result);
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
namespace PepperDash.Essentials.Core.DeviceInfo
|
||||||
|
{
|
||||||
|
public class DeviceInfo
|
||||||
|
{
|
||||||
|
public string HostName { get; set; }
|
||||||
|
public string IpAddress { get; set; }
|
||||||
|
public string MacAddress { get; set; }
|
||||||
|
public string SerialNumber { get; set; }
|
||||||
|
public string FirmwareVersion { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core.DeviceInfo
|
||||||
|
{
|
||||||
|
public class DeviceInfoEventArgs:EventArgs
|
||||||
|
{
|
||||||
|
public DeviceInfo DeviceInfo { get; set; }
|
||||||
|
|
||||||
|
public DeviceInfoEventArgs()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public DeviceInfoEventArgs(DeviceInfo devInfo)
|
||||||
|
{
|
||||||
|
DeviceInfo = devInfo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
using System;
|
||||||
|
using PepperDash.Core;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core.DeviceInfo
|
||||||
|
{
|
||||||
|
public interface IDeviceInfoProvider:IKeyed
|
||||||
|
{
|
||||||
|
DeviceInfo DeviceInfo { get; }
|
||||||
|
|
||||||
|
event DeviceInfoChangeHandler DeviceInfoChanged;
|
||||||
|
|
||||||
|
void UpdateDeviceInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
public delegate void DeviceInfoChangeHandler(IKeyed device, DeviceInfoEventArgs args);
|
||||||
|
}
|
||||||
@@ -6,7 +6,7 @@ using PepperDash.Essentials.Core.SmartObjects;
|
|||||||
namespace PepperDash.Essentials.Core
|
namespace PepperDash.Essentials.Core
|
||||||
{
|
{
|
||||||
|
|
||||||
public interface IDiscPlayerControls : IColor, IDPad, INumericKeypad, IPower, ITransport, IUiDisplayInfo
|
public interface IDiscPlayerControls : IColor, IDPad, INumericKeypad, IHasPowerControl, ITransport, IUiDisplayInfo
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core.DeviceTypeInterfaces
|
||||||
|
{
|
||||||
|
public interface IHasBranding
|
||||||
|
{
|
||||||
|
bool BrandingEnabled { get; }
|
||||||
|
void InitializeBranding(string roomKey);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace PepperDash_Essentials_Core.DeviceTypeInterfaces
|
||||||
|
{
|
||||||
|
[Obsolete("Use PepperDash.Essentials.Core.DeviceTypeInterfaces")]
|
||||||
|
public interface IHasBranding
|
||||||
|
{
|
||||||
|
bool BrandingEnabled { get; }
|
||||||
|
void InitializeBranding(string roomKey);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
namespace PepperDash.Essentials.Core.DeviceTypeInterfaces
|
||||||
|
{
|
||||||
|
public interface IHasFarEndContentStatus
|
||||||
|
{
|
||||||
|
BoolFeedback ReceivingContent { get; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
using System;
|
||||||
|
using PepperDash.Essentials.Core;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core.DeviceTypeInterfaces
|
||||||
|
{
|
||||||
|
public interface IHasPhoneDialing
|
||||||
|
{
|
||||||
|
BoolFeedback PhoneOffHookFeedback { get; }
|
||||||
|
StringFeedback CallerIdNameFeedback { get; }
|
||||||
|
StringFeedback CallerIdNumberFeedback { get; }
|
||||||
|
void DialPhoneCall(string number);
|
||||||
|
void EndPhoneCall();
|
||||||
|
void SendDtmfToPhone(string digit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace PepperDash_Essentials_Core.DeviceTypeInterfaces
|
||||||
|
{
|
||||||
|
[Obsolete("Use PepperDash.Essentials.Core.DeviceTypeInterfaces")]
|
||||||
|
public interface IHasPhoneDialing
|
||||||
|
{
|
||||||
|
BoolFeedback PhoneOffHookFeedback { get; }
|
||||||
|
StringFeedback CallerIdNameFeedback { get; }
|
||||||
|
StringFeedback CallerIdNumberFeedback { get; }
|
||||||
|
void DialPhoneCall(string number);
|
||||||
|
void EndPhoneCall();
|
||||||
|
void SendDtmfToPhone(string digit);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core.DeviceTypeInterfaces
|
||||||
|
{
|
||||||
|
public interface ILanguageDefinition
|
||||||
|
{
|
||||||
|
string LocaleName { get; set; }
|
||||||
|
string FriendlyName { get; set; }
|
||||||
|
bool Enable { get; set; }
|
||||||
|
List<LanguageLabel> UiLabels { get; set; }
|
||||||
|
List<LanguageLabel> Sources { get; set; }
|
||||||
|
List<LanguageLabel> Destinations { get; set; }
|
||||||
|
List<LanguageLabel> SourceGroupNames { get; set; }
|
||||||
|
List<LanguageLabel> DestinationGroupNames { get; set; }
|
||||||
|
List<LanguageLabel> RoomNames { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace PepperDash_Essentials_Core.DeviceTypeInterfaces
|
||||||
|
{
|
||||||
|
[Obsolete("Use PepperDash.Essentials.Core.DeviceTypeInterfaces")]
|
||||||
|
public interface ILanguageDefinition
|
||||||
|
{
|
||||||
|
string LocaleName { get; set; }
|
||||||
|
string FriendlyName { get; set; }
|
||||||
|
bool Enable { get; set; }
|
||||||
|
List<LanguageLabel> UiLabels { get; set; }
|
||||||
|
List<LanguageLabel> Sources { get; set; }
|
||||||
|
List<LanguageLabel> Destinations { get; set; }
|
||||||
|
List<LanguageLabel> SourceGroupNames { get; set; }
|
||||||
|
List<LanguageLabel> DestinationGroupNames { get; set; }
|
||||||
|
List<LanguageLabel> RoomNames { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core.DeviceTypeInterfaces
|
||||||
|
{
|
||||||
|
|
||||||
|
public interface ILanguageProvider
|
||||||
|
{
|
||||||
|
ILanguageDefinition CurrentLanguage { get; set; }
|
||||||
|
|
||||||
|
event EventHandler CurrentLanguageChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace PepperDash_Essentials_Core.DeviceTypeInterfaces
|
||||||
|
{
|
||||||
|
[Obsolete("Use PepperDash.Essentials.Core.DeviceTypeInterfaces")]
|
||||||
|
public interface ILanguageProvider
|
||||||
|
{
|
||||||
|
ILanguageDefinition CurrentLanguage { get; set; }
|
||||||
|
|
||||||
|
event EventHandler CurrentLanguageChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,11 +1,45 @@
|
|||||||
using PepperDash.Core;
|
using System;
|
||||||
|
using PepperDash.Core;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.DeviceTypeInterfaces
|
namespace PepperDash.Essentials.Core.DeviceTypeInterfaces
|
||||||
{
|
{
|
||||||
public interface IMobileControl:IKeyed
|
/// <summary>
|
||||||
|
/// Describes a MobileControlSystemController
|
||||||
|
/// </summary>
|
||||||
|
public interface IMobileControl : IKeyed
|
||||||
{
|
{
|
||||||
void CreateMobileControlRoomBridge(EssentialsRoomBase room);
|
void CreateMobileControlRoomBridge(EssentialsRoomBase room, IMobileControl parent);
|
||||||
|
|
||||||
void LinkSystemMonitorToAppServer();
|
void LinkSystemMonitorToAppServer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Describes a MobileSystemController that accepts IEssentialsRoom
|
||||||
|
/// </summary>
|
||||||
|
public interface IMobileControl3 : IMobileControl
|
||||||
|
{
|
||||||
|
void CreateMobileControlRoomBridge(IEssentialsRoom room, IMobileControl parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Describes a MobileControl Room Bridge
|
||||||
|
/// </summary>
|
||||||
|
public interface IMobileControlRoomBridge : IKeyed
|
||||||
|
{
|
||||||
|
event EventHandler<EventArgs> UserCodeChanged;
|
||||||
|
|
||||||
|
event EventHandler<EventArgs> UserPromptedForCode;
|
||||||
|
|
||||||
|
event EventHandler<EventArgs> ClientJoined;
|
||||||
|
|
||||||
|
string UserCode { get; }
|
||||||
|
|
||||||
|
string QrCodeUrl { get; }
|
||||||
|
|
||||||
|
string QrCodeChecksum { get; }
|
||||||
|
|
||||||
|
string McServerUrl { get; }
|
||||||
|
|
||||||
|
string RoomName { get; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
using Crestron.SimplSharpPro.DeviceSupport;
|
||||||
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using PepperDash.Essentials.Core.SmartObjects;
|
using PepperDash.Essentials.Core.SmartObjects;
|
||||||
|
|
||||||
@@ -8,7 +8,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface INumericKeypad
|
public interface INumericKeypad:IKeyed
|
||||||
{
|
{
|
||||||
void Digit0(bool pressRelease);
|
void Digit0(bool pressRelease);
|
||||||
void Digit1(bool pressRelease);
|
void Digit1(bool pressRelease);
|
||||||
|
|||||||
@@ -0,0 +1,56 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using Crestron.SimplSharp;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Describes the functionality required to prompt a user to enter a password
|
||||||
|
/// </summary>
|
||||||
|
public interface IPasswordPrompt
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Notifies when a password is required or is entered incorrectly
|
||||||
|
/// </summary>
|
||||||
|
event EventHandler<PasswordPromptEventArgs> PasswordRequired;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Submits the password
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="password"></param>
|
||||||
|
void SubmitPassword(string password);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class PasswordPromptEventArgs : EventArgs
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates if the last submitted password was incorrect
|
||||||
|
/// </summary>
|
||||||
|
public bool LastAttemptWasIncorrect { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates that the login attempt has failed
|
||||||
|
/// </summary>
|
||||||
|
public bool LoginAttemptFailed { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates that the process was cancelled and the prompt should be dismissed
|
||||||
|
/// </summary>
|
||||||
|
public bool LoginAttemptCancelled { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A message to be displayed to the user
|
||||||
|
/// </summary>
|
||||||
|
public string Message { get; private set; }
|
||||||
|
|
||||||
|
public PasswordPromptEventArgs(bool lastAttemptIncorrect, bool loginFailed, bool loginCancelled, string message)
|
||||||
|
{
|
||||||
|
LastAttemptWasIncorrect = lastAttemptIncorrect;
|
||||||
|
LoginAttemptFailed = loginFailed;
|
||||||
|
LoginAttemptCancelled = loginCancelled;
|
||||||
|
Message = message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -14,35 +14,64 @@ using PepperDash.Essentials.Core.SmartObjects;
|
|||||||
namespace PepperDash.Essentials.Core
|
namespace PepperDash.Essentials.Core
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
/// Defines the ability to power a device on and off
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[Obsolete("Will be replaced by IHasPowerControlWithFeedback")]
|
||||||
public interface IPower
|
public interface IPower
|
||||||
{
|
{
|
||||||
void PowerOn();
|
void PowerOn();
|
||||||
void PowerOff();
|
void PowerOff();
|
||||||
void PowerToggle();
|
void PowerToggle();
|
||||||
BoolFeedback PowerIsOnFeedback { get; }
|
BoolFeedback PowerIsOnFeedback { get; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Adds feedback for current power state
|
||||||
|
/// </summary>
|
||||||
|
public interface IHasPowerControlWithFeedback : IHasPowerControl
|
||||||
|
{
|
||||||
|
BoolFeedback PowerIsOnFeedback { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Defines the ability to power a device on and off
|
||||||
|
/// </summary>
|
||||||
|
public interface IHasPowerControl
|
||||||
|
{
|
||||||
|
void PowerOn();
|
||||||
|
void PowerOff();
|
||||||
|
void PowerToggle();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static class IPowerExtensions
|
public static class IHasPowerControlExtensions
|
||||||
{
|
{
|
||||||
public static void LinkButtons(this IPower dev, BasicTriList triList)
|
public static void LinkButtons(this IHasPowerControl dev, BasicTriList triList)
|
||||||
{
|
{
|
||||||
triList.SetSigFalseAction(101, dev.PowerOn);
|
triList.SetSigFalseAction(101, dev.PowerOn);
|
||||||
triList.SetSigFalseAction(102, dev.PowerOff);
|
triList.SetSigFalseAction(102, dev.PowerOff);
|
||||||
triList.SetSigFalseAction(103, dev.PowerToggle);
|
triList.SetSigFalseAction(103, dev.PowerToggle);
|
||||||
dev.PowerIsOnFeedback.LinkInputSig(triList.BooleanInput[101]);
|
|
||||||
|
var fbdev = dev as IHasPowerControlWithFeedback;
|
||||||
|
if (fbdev != null)
|
||||||
|
{
|
||||||
|
fbdev.PowerIsOnFeedback.LinkInputSig(triList.BooleanInput[101]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void UnlinkButtons(this IPower dev, BasicTriList triList)
|
public static void UnlinkButtons(this IHasPowerControl dev, BasicTriList triList)
|
||||||
{
|
{
|
||||||
triList.ClearBoolSigAction(101);
|
triList.ClearBoolSigAction(101);
|
||||||
triList.ClearBoolSigAction(102);
|
triList.ClearBoolSigAction(102);
|
||||||
triList.ClearBoolSigAction(103);
|
triList.ClearBoolSigAction(103);
|
||||||
dev.PowerIsOnFeedback.UnlinkInputSig(triList.BooleanInput[101]);
|
|
||||||
|
var fbdev = dev as IHasPowerControlWithFeedback;
|
||||||
|
if (fbdev != null)
|
||||||
|
{
|
||||||
|
fbdev.PowerIsOnFeedback.UnlinkInputSig(triList.BooleanInput[101]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -31,7 +31,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
bool HasDpad { get; }
|
bool HasDpad { get; }
|
||||||
|
|
||||||
PepperDash.Essentials.Core.Presets.DevicePresetsModel PresetsModel { get; }
|
PepperDash.Essentials.Core.Presets.DevicePresetsModel TvPresets { get; }
|
||||||
void LoadPresets(string filePath);
|
void LoadPresets(string filePath);
|
||||||
|
|
||||||
void DvrList(bool pressRelease);
|
void DvrList(bool pressRelease);
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
using PepperDash.Essentials.Core.Presets;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core.DeviceTypeInterfaces
|
||||||
|
{
|
||||||
|
public interface ITvPresetsProvider
|
||||||
|
{
|
||||||
|
DevicePresetsModel TvPresets { get; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
using System;
|
||||||
|
using PepperDash.Core;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core.DeviceTypeInterfaces
|
||||||
|
{
|
||||||
|
public class LanguageLabel
|
||||||
|
{
|
||||||
|
public string Key { get; set; }
|
||||||
|
public string Description { get; set; }
|
||||||
|
public string DisplayText { get; set; }
|
||||||
|
public uint JoinNumber { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace PepperDash_Essentials_Core.DeviceTypeInterfaces
|
||||||
|
{
|
||||||
|
[Obsolete("Use PepperDash.Essentials.Core.DeviceTypeInterfaces")]
|
||||||
|
public class LanguageLabel
|
||||||
|
{
|
||||||
|
public string Key { get; set; }
|
||||||
|
public string Description { get; set; }
|
||||||
|
public string DisplayText { get; set; }
|
||||||
|
public uint JoinNumber { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
using Newtonsoft.Json;
|
||||||
|
using PepperDash.Essentials.Core;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core
|
||||||
|
{
|
||||||
|
public class DestinationListItem
|
||||||
|
{
|
||||||
|
[JsonProperty("sinkKey")]
|
||||||
|
public string SinkKey { get; set; }
|
||||||
|
|
||||||
|
private EssentialsDevice _sinkDevice;
|
||||||
|
|
||||||
|
[JsonIgnore]
|
||||||
|
public EssentialsDevice SinkDevice
|
||||||
|
{
|
||||||
|
get { return _sinkDevice ?? (_sinkDevice = DeviceManager.GetDeviceForKey(SinkKey) as EssentialsDevice); }
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonProperty("preferredName")]
|
||||||
|
public string PreferredName
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(Name))
|
||||||
|
{
|
||||||
|
return Name;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SinkDevice == null ? "---" : SinkDevice.Name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonProperty("name")]
|
||||||
|
public string Name { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("includeInDestinationList")]
|
||||||
|
public bool IncludeInDestinationList { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("order")]
|
||||||
|
public int Order { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("surfaceLocation")]
|
||||||
|
public int SurfaceLocation { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("verticalLocation")]
|
||||||
|
public int VerticalLocation { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("horizontalLocation")]
|
||||||
|
public int HorizontalLocation { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("sinkType")]
|
||||||
|
public eRoutingSignalType SinkType { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -20,8 +20,23 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// <param name="json"></param>
|
/// <param name="json"></param>
|
||||||
public static void DoDeviceActionWithJson(string json)
|
public static void DoDeviceActionWithJson(string json)
|
||||||
{
|
{
|
||||||
var action = JsonConvert.DeserializeObject<DeviceActionWrapper>(json);
|
if (String.IsNullOrEmpty(json))
|
||||||
DoDeviceAction(action);
|
{
|
||||||
|
CrestronConsole.ConsoleCommandResponse(
|
||||||
|
"Please provide a JSON object matching the format {\"deviceKey\":\"myDevice\", \"methodName\":\"someMethod\", \"params\": [\"param1\", true]}.\r\nIf the method has no parameters, the \"params\" object may be omitted.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var action = JsonConvert.DeserializeObject<DeviceActionWrapper>(json);
|
||||||
|
|
||||||
|
DoDeviceAction(action);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
CrestronConsole.ConsoleCommandResponse("Incorrect format for JSON. Please check that the format matches {\"deviceKey\":\"myDevice\", \"methodName\":\"someMethod\", \"params\": [\"param1\", true]}");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -33,31 +48,65 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
var key = action.DeviceKey;
|
var key = action.DeviceKey;
|
||||||
var obj = FindObjectOnPath(key);
|
var obj = FindObjectOnPath(key);
|
||||||
if (obj == null)
|
if (obj == null)
|
||||||
return;
|
{
|
||||||
|
CrestronConsole.ConsoleCommandResponse("Unable to find object at path {0}", key);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
CType t = obj.GetType();
|
if (action.Params == null)
|
||||||
var method = t.GetMethod(action.MethodName);
|
{
|
||||||
if (method == null)
|
//no params, so setting action.Params to empty array
|
||||||
{
|
action.Params = new object[0];
|
||||||
Debug.Console(0, "Method '{0}' not found", action.MethodName);
|
}
|
||||||
return;
|
|
||||||
}
|
CType t = obj.GetType();
|
||||||
var mParams = method.GetParameters();
|
try
|
||||||
// Add empty params if not provided
|
{
|
||||||
if (action.Params == null) action.Params = new object[0];
|
var methods = t.GetMethods().Where(m => m.Name == action.MethodName).ToList();
|
||||||
if (mParams.Length > action.Params.Length)
|
|
||||||
{
|
var method = methods.Count == 1 ? methods[0] : methods.FirstOrDefault(m => m.GetParameters().Length == action.Params.Length);
|
||||||
Debug.Console(0, "Method '{0}' requires {1} params", action.MethodName, mParams.Length);
|
|
||||||
return;
|
if (method == null)
|
||||||
}
|
{
|
||||||
object[] convertedParams = mParams
|
CrestronConsole.ConsoleCommandResponse(
|
||||||
.Select((p, i) => Convert.ChangeType(action.Params[i], p.ParameterType,
|
"Unable to find method with name {0} and that matches parameters {1}", action.MethodName,
|
||||||
System.Globalization.CultureInfo.InvariantCulture))
|
action.Params);
|
||||||
.ToArray();
|
return;
|
||||||
object ret = method.Invoke(obj, convertedParams);
|
}
|
||||||
|
var mParams = method.GetParameters();
|
||||||
|
|
||||||
|
var convertedParams = mParams
|
||||||
|
.Select((p, i) => ConvertType(action.Params[i], p.ParameterType))
|
||||||
|
.ToArray();
|
||||||
|
method.Invoke(obj, convertedParams);
|
||||||
|
|
||||||
|
CrestronConsole.ConsoleCommandResponse("Method {0} successfully called on device {1}", method.Name,
|
||||||
|
action.DeviceKey);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
CrestronConsole.ConsoleCommandResponse("Unable to call method with name {0}. {1}", action.MethodName,
|
||||||
|
ex.Message);}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static object ConvertType(object value, Type conversionType)
|
||||||
|
{
|
||||||
|
if (!conversionType.IsEnum)
|
||||||
|
{
|
||||||
|
return Convert.ChangeType(value, conversionType, System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
}
|
||||||
|
|
||||||
|
var stringValue = Convert.ToString(value);
|
||||||
|
|
||||||
|
if (String.IsNullOrEmpty(stringValue))
|
||||||
|
{
|
||||||
|
throw new InvalidCastException(
|
||||||
|
String.Format("{0} cannot be converted to a string prior to conversion to enum"));
|
||||||
|
}
|
||||||
|
return Enum.Parse(conversionType, stringValue, true);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the properties on a device
|
/// Gets the properties on a device
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -83,13 +132,13 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static object GetPropertyByName(string deviceObjectPath, string propertyName)
|
public static object GetPropertyByName(string deviceObjectPath, string propertyName)
|
||||||
{
|
{
|
||||||
var obj = FindObjectOnPath(deviceObjectPath);
|
var dev = FindObjectOnPath(deviceObjectPath);
|
||||||
if(obj == null)
|
if(dev == null)
|
||||||
return "{ \"error\":\"No Device\"}";
|
return "{ \"error\":\"No Device\"}";
|
||||||
|
|
||||||
|
object prop = dev.GetType().GetCType().GetProperty(propertyName).GetValue(dev, null);
|
||||||
|
|
||||||
CType t = obj.GetType();
|
// var prop = t.GetProperty(propertyName);
|
||||||
|
|
||||||
var prop = t.GetProperty(propertyName);
|
|
||||||
if (prop != null)
|
if (prop != null)
|
||||||
{
|
{
|
||||||
return prop;
|
return prop;
|
||||||
@@ -242,6 +291,8 @@ namespace PepperDash.Essentials.Core
|
|||||||
//var props = t.GetProperties().Select(p => new PropertyNameType(p, obj));
|
//var props = t.GetProperties().Select(p => new PropertyNameType(p, obj));
|
||||||
//return JsonConvert.SerializeObject(props, Formatting.Indented);
|
//return JsonConvert.SerializeObject(props, Formatting.Indented);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class DeviceActionWrapper
|
public class DeviceActionWrapper
|
||||||
|
|||||||
@@ -1,418 +1,469 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
using Crestron.SimplSharpPro;
|
using Crestron.SimplSharpPro;
|
||||||
|
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core
|
namespace PepperDash.Essentials.Core
|
||||||
{
|
{
|
||||||
public static class DeviceManager
|
public static class DeviceManager
|
||||||
{
|
{
|
||||||
private static readonly CCriticalSection DeviceCriticalSection = new CCriticalSection();
|
public static event EventHandler<EventArgs> AllDevicesActivated;
|
||||||
private static readonly CEvent AllowAddDevicesCEvent = new CEvent(false, true);
|
|
||||||
//public static List<Device> Devices { get { return _Devices; } }
|
private static readonly CCriticalSection DeviceCriticalSection = new CCriticalSection();
|
||||||
//static List<Device> _Devices = new List<Device>();
|
private static readonly CEvent AllowAddDevicesCEvent = new CEvent(false, true);
|
||||||
|
//public static List<Device> Devices { get { return _Devices; } }
|
||||||
static readonly Dictionary<string, IKeyed> Devices = new Dictionary<string, IKeyed>(StringComparer.OrdinalIgnoreCase);
|
//static List<Device> _Devices = new List<Device>();
|
||||||
|
|
||||||
/// <summary>
|
static readonly Dictionary<string, IKeyed> Devices = new Dictionary<string, IKeyed>(StringComparer.OrdinalIgnoreCase);
|
||||||
/// Returns a copy of all the devices in a list
|
|
||||||
/// </summary>
|
/// <summary>
|
||||||
public static List<IKeyed> AllDevices { get { return new List<IKeyed>(Devices.Values); } }
|
/// Returns a copy of all the devices in a list
|
||||||
|
/// </summary>
|
||||||
public static bool AddDeviceEnabled;
|
public static List<IKeyed> AllDevices { get { return new List<IKeyed>(Devices.Values); } }
|
||||||
|
|
||||||
public static void Initialize(CrestronControlSystem cs)
|
public static bool AddDeviceEnabled;
|
||||||
{
|
|
||||||
AddDeviceEnabled = true;
|
public static void Initialize(CrestronControlSystem cs)
|
||||||
CrestronConsole.AddNewConsoleCommand(ListDeviceCommStatuses, "devcommstatus", "Lists the communication status of all devices",
|
{
|
||||||
ConsoleAccessLevelEnum.AccessOperator);
|
AddDeviceEnabled = true;
|
||||||
CrestronConsole.AddNewConsoleCommand(ListDeviceFeedbacks, "devfb", "Lists current feedbacks",
|
CrestronConsole.AddNewConsoleCommand(ListDeviceCommStatuses, "devcommstatus", "Lists the communication status of all devices",
|
||||||
ConsoleAccessLevelEnum.AccessOperator);
|
ConsoleAccessLevelEnum.AccessOperator);
|
||||||
CrestronConsole.AddNewConsoleCommand(ListDevices, "devlist", "Lists current managed devices",
|
CrestronConsole.AddNewConsoleCommand(ListDeviceFeedbacks, "devfb", "Lists current feedbacks",
|
||||||
ConsoleAccessLevelEnum.AccessOperator);
|
ConsoleAccessLevelEnum.AccessOperator);
|
||||||
CrestronConsole.AddNewConsoleCommand(DeviceJsonApi.DoDeviceActionWithJson, "devjson", "",
|
CrestronConsole.AddNewConsoleCommand(ListDevices, "devlist", "Lists current managed devices",
|
||||||
ConsoleAccessLevelEnum.AccessOperator);
|
ConsoleAccessLevelEnum.AccessOperator);
|
||||||
CrestronConsole.AddNewConsoleCommand(s => CrestronConsole.ConsoleCommandResponse(DeviceJsonApi.GetProperties(s)), "devprops", "", ConsoleAccessLevelEnum.AccessOperator);
|
CrestronConsole.AddNewConsoleCommand(DeviceJsonApi.DoDeviceActionWithJson, "devjson", "",
|
||||||
CrestronConsole.AddNewConsoleCommand(s => CrestronConsole.ConsoleCommandResponse(DeviceJsonApi.GetMethods(s)), "devmethods", "", ConsoleAccessLevelEnum.AccessOperator);
|
ConsoleAccessLevelEnum.AccessOperator);
|
||||||
CrestronConsole.AddNewConsoleCommand(s => CrestronConsole.ConsoleCommandResponse(DeviceJsonApi.GetApiMethods(s)), "apimethods", "", ConsoleAccessLevelEnum.AccessOperator);
|
CrestronConsole.AddNewConsoleCommand(s => CrestronConsole.ConsoleCommandResponse(DeviceJsonApi.GetProperties(s)), "devprops", "", ConsoleAccessLevelEnum.AccessOperator);
|
||||||
CrestronConsole.AddNewConsoleCommand(SimulateComReceiveOnDevice, "devsimreceive",
|
CrestronConsole.AddNewConsoleCommand(s => CrestronConsole.ConsoleCommandResponse(DeviceJsonApi.GetMethods(s)), "devmethods", "", ConsoleAccessLevelEnum.AccessOperator);
|
||||||
"Simulates incoming data on a com device", ConsoleAccessLevelEnum.AccessOperator);
|
CrestronConsole.AddNewConsoleCommand(s => CrestronConsole.ConsoleCommandResponse(DeviceJsonApi.GetApiMethods(s)), "apimethods", "", ConsoleAccessLevelEnum.AccessOperator);
|
||||||
|
CrestronConsole.AddNewConsoleCommand(SimulateComReceiveOnDevice, "devsimreceive",
|
||||||
CrestronConsole.AddNewConsoleCommand(s => SetDeviceStreamDebugging(s), "setdevicestreamdebug", "set comm debug [deviceKey] [off/rx/tx/both] ([minutes])", ConsoleAccessLevelEnum.AccessOperator);
|
"Simulates incoming data on a com device", ConsoleAccessLevelEnum.AccessOperator);
|
||||||
CrestronConsole.AddNewConsoleCommand(s => DisableAllDeviceStreamDebugging(), "disableallstreamdebug", "disables stream debugging on all devices", ConsoleAccessLevelEnum.AccessOperator);
|
|
||||||
}
|
CrestronConsole.AddNewConsoleCommand(SetDeviceStreamDebugging, "setdevicestreamdebug", "set comm debug [deviceKey] [off/rx/tx/both] ([minutes])", ConsoleAccessLevelEnum.AccessOperator);
|
||||||
|
CrestronConsole.AddNewConsoleCommand(s => DisableAllDeviceStreamDebugging(), "disableallstreamdebug", "disables stream debugging on all devices", ConsoleAccessLevelEnum.AccessOperator);
|
||||||
/// <summary>
|
}
|
||||||
/// Calls activate steps on all Device class items
|
|
||||||
/// </summary>
|
/// <summary>
|
||||||
public static void ActivateAll()
|
/// Calls activate steps on all Device class items
|
||||||
{
|
/// </summary>
|
||||||
try
|
public static void ActivateAll()
|
||||||
{
|
{
|
||||||
DeviceCriticalSection.Enter();
|
try
|
||||||
AddDeviceEnabled = false;
|
{
|
||||||
// PreActivate all devices
|
DeviceCriticalSection.Enter();
|
||||||
foreach (var d in Devices.Values)
|
AddDeviceEnabled = false;
|
||||||
{
|
// PreActivate all devices
|
||||||
try
|
foreach (var d in Devices.Values)
|
||||||
{
|
{
|
||||||
if (d is Device)
|
try
|
||||||
(d as Device).PreActivate();
|
{
|
||||||
}
|
if (d is Device)
|
||||||
catch (Exception e)
|
(d as Device).PreActivate();
|
||||||
{
|
}
|
||||||
Debug.Console(0, d, "ERROR: Device PreActivation failure:\r{0}", e);
|
catch (Exception e)
|
||||||
}
|
{
|
||||||
}
|
Debug.Console(0, d, "ERROR: Device PreActivation failure:\r{0}", e);
|
||||||
|
}
|
||||||
// Activate all devices
|
}
|
||||||
foreach (var d in Devices.Values)
|
|
||||||
{
|
// Activate all devices
|
||||||
try
|
foreach (var d in Devices.Values)
|
||||||
{
|
{
|
||||||
if (d is Device)
|
try
|
||||||
(d as Device).Activate();
|
{
|
||||||
}
|
if (d is Device)
|
||||||
catch (Exception e)
|
(d as Device).Activate();
|
||||||
{
|
}
|
||||||
Debug.Console(0, d, "ERROR: Device Activation failure:\r{0}", e);
|
catch (Exception e)
|
||||||
}
|
{
|
||||||
}
|
Debug.Console(0, d, "ERROR: Device Activation failure:\r{0}", e);
|
||||||
|
}
|
||||||
// PostActivate all devices
|
}
|
||||||
foreach (var d in Devices.Values)
|
|
||||||
{
|
// PostActivate all devices
|
||||||
try
|
foreach (var d in Devices.Values)
|
||||||
{
|
{
|
||||||
if (d is Device)
|
try
|
||||||
(d as Device).PostActivate();
|
{
|
||||||
}
|
if (d is Device)
|
||||||
catch (Exception e)
|
(d as Device).PostActivate();
|
||||||
{
|
}
|
||||||
Debug.Console(0, d, "ERROR: Device PostActivation failure:\r{0}", e);
|
catch (Exception e)
|
||||||
}
|
{
|
||||||
}
|
Debug.Console(0, d, "ERROR: Device PostActivation failure:\r{0}", e);
|
||||||
}
|
}
|
||||||
finally
|
}
|
||||||
{
|
|
||||||
DeviceCriticalSection.Leave();
|
OnAllDevicesActivated();
|
||||||
}
|
}
|
||||||
}
|
finally
|
||||||
|
{
|
||||||
/// <summary>
|
DeviceCriticalSection.Leave();
|
||||||
/// Calls activate on all Device class items
|
}
|
||||||
/// </summary>
|
}
|
||||||
public static void DeactivateAll()
|
|
||||||
{
|
private static void OnAllDevicesActivated()
|
||||||
try
|
{
|
||||||
{
|
var handler = AllDevicesActivated;
|
||||||
DeviceCriticalSection.Enter();
|
if (handler != null)
|
||||||
foreach (var d in Devices.Values.OfType<Device>())
|
{
|
||||||
{
|
handler(null, new EventArgs());
|
||||||
d.Deactivate();
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
finally
|
/// <summary>
|
||||||
{
|
/// Calls activate on all Device class items
|
||||||
DeviceCriticalSection.Leave();
|
/// </summary>
|
||||||
}
|
public static void DeactivateAll()
|
||||||
}
|
{
|
||||||
|
try
|
||||||
//static void ListMethods(string devKey)
|
{
|
||||||
//{
|
DeviceCriticalSection.Enter();
|
||||||
// var dev = GetDeviceForKey(devKey);
|
foreach (var d in Devices.Values.OfType<Device>())
|
||||||
// if(dev != null)
|
{
|
||||||
// {
|
d.Deactivate();
|
||||||
// var type = dev.GetType().GetCType();
|
}
|
||||||
// var methods = type.GetMethods(BindingFlags.Public|BindingFlags.Instance);
|
}
|
||||||
// var sb = new StringBuilder();
|
finally
|
||||||
// sb.AppendLine(string.Format("{2} methods on [{0}] ({1}):", dev.Key, type.Name, methods.Length));
|
{
|
||||||
// foreach (var m in methods)
|
DeviceCriticalSection.Leave();
|
||||||
// {
|
}
|
||||||
// sb.Append(string.Format("{0}(", m.Name));
|
}
|
||||||
// var pars = m.GetParameters();
|
|
||||||
// foreach (var p in pars)
|
//static void ListMethods(string devKey)
|
||||||
// sb.Append(string.Format("({1}){0} ", p.Name, p.ParameterType.Name));
|
//{
|
||||||
// sb.AppendLine(")");
|
// var dev = GetDeviceForKey(devKey);
|
||||||
// }
|
// if(dev != null)
|
||||||
// CrestronConsole.ConsoleCommandResponse(sb.ToString());
|
// {
|
||||||
// }
|
// var type = dev.GetType().GetCType();
|
||||||
//}
|
// var methods = type.GetMethods(BindingFlags.Public|BindingFlags.Instance);
|
||||||
|
// var sb = new StringBuilder();
|
||||||
private static void ListDevices(string s)
|
// sb.AppendLine(string.Format("{2} methods on [{0}] ({1}):", dev.Key, type.Name, methods.Length));
|
||||||
{
|
// foreach (var m in methods)
|
||||||
Debug.Console(0, "{0} Devices registered with Device Manager:", Devices.Count);
|
// {
|
||||||
var sorted = Devices.Values.ToList();
|
// sb.Append(string.Format("{0}(", m.Name));
|
||||||
sorted.Sort((a, b) => a.Key.CompareTo(b.Key));
|
// var pars = m.GetParameters();
|
||||||
|
// foreach (var p in pars)
|
||||||
foreach (var d in sorted)
|
// sb.Append(string.Format("({1}){0} ", p.Name, p.ParameterType.Name));
|
||||||
{
|
// sb.AppendLine(")");
|
||||||
var name = d is IKeyName ? (d as IKeyName).Name : "---";
|
// }
|
||||||
Debug.Console(0, " [{0}] {1}", d.Key, name);
|
// CrestronConsole.ConsoleCommandResponse(sb.ToString());
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|
||||||
private static void ListDeviceFeedbacks(string devKey)
|
private static void ListDevices(string s)
|
||||||
{
|
{
|
||||||
var dev = GetDeviceForKey(devKey);
|
Debug.Console(0, "{0} Devices registered with Device Manager:", Devices.Count);
|
||||||
if (dev == null)
|
var sorted = Devices.Values.ToList();
|
||||||
{
|
sorted.Sort((a, b) => a.Key.CompareTo(b.Key));
|
||||||
Debug.Console(0, "Device '{0}' not found", devKey);
|
|
||||||
return;
|
foreach (var d in sorted)
|
||||||
}
|
{
|
||||||
var statusDev = dev as IHasFeedback;
|
var name = d is IKeyName ? (d as IKeyName).Name : "---";
|
||||||
if (statusDev == null)
|
Debug.Console(0, " [{0}] {1}", d.Key, name);
|
||||||
{
|
}
|
||||||
Debug.Console(0, "Device '{0}' does not have visible feedbacks", devKey);
|
}
|
||||||
return;
|
|
||||||
}
|
private static void ListDeviceFeedbacks(string devKey)
|
||||||
statusDev.DumpFeedbacksToConsole(true);
|
{
|
||||||
}
|
var dev = GetDeviceForKey(devKey);
|
||||||
|
if (dev == null)
|
||||||
//static void ListDeviceCommands(string devKey)
|
{
|
||||||
//{
|
Debug.Console(0, "Device '{0}' not found", devKey);
|
||||||
// var dev = GetDeviceForKey(devKey);
|
return;
|
||||||
// if (dev == null)
|
}
|
||||||
// {
|
var statusDev = dev as IHasFeedback;
|
||||||
// Debug.Console(0, "Device '{0}' not found", devKey);
|
if (statusDev == null)
|
||||||
// return;
|
{
|
||||||
// }
|
Debug.Console(0, "Device '{0}' does not have visible feedbacks", devKey);
|
||||||
// Debug.Console(0, "This needs to be reworked. Stay tuned.", devKey);
|
return;
|
||||||
//}
|
}
|
||||||
|
statusDev.DumpFeedbacksToConsole(true);
|
||||||
private static void ListDeviceCommStatuses(string input)
|
}
|
||||||
{
|
|
||||||
var sb = new StringBuilder();
|
//static void ListDeviceCommands(string devKey)
|
||||||
foreach (var dev in Devices.Values.OfType<ICommunicationMonitor>())
|
//{
|
||||||
{
|
// var dev = GetDeviceForKey(devKey);
|
||||||
sb.Append(string.Format("{0}: {1}\r", dev,
|
// if (dev == null)
|
||||||
dev.CommunicationMonitor.Status));
|
// {
|
||||||
}
|
// Debug.Console(0, "Device '{0}' not found", devKey);
|
||||||
CrestronConsole.ConsoleCommandResponse(sb.ToString());
|
// return;
|
||||||
}
|
// }
|
||||||
|
// Debug.Console(0, "This needs to be reworked. Stay tuned.", devKey);
|
||||||
|
//}
|
||||||
//static void DoDeviceCommand(string command)
|
|
||||||
//{
|
private static void ListDeviceCommStatuses(string input)
|
||||||
// Debug.Console(0, "Not yet implemented. Stay tuned");
|
{
|
||||||
//}
|
var sb = new StringBuilder();
|
||||||
|
foreach (var dev in Devices.Values.OfType<ICommunicationMonitor>())
|
||||||
public static void AddDevice(IKeyed newDev)
|
{
|
||||||
{
|
sb.Append(string.Format("{0}: {1}\r", dev,
|
||||||
try
|
dev.CommunicationMonitor.Status));
|
||||||
{
|
}
|
||||||
if (!DeviceCriticalSection.TryEnter())
|
CrestronConsole.ConsoleCommandResponse(sb.ToString());
|
||||||
{
|
}
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Error, "Currently unable to add devices to Device Manager. Please try again");
|
|
||||||
return;
|
|
||||||
}
|
//static void DoDeviceCommand(string command)
|
||||||
// Check for device with same key
|
//{
|
||||||
//var existingDevice = _Devices.FirstOrDefault(d => d.Key.Equals(newDev.Key, StringComparison.OrdinalIgnoreCase));
|
// Debug.Console(0, "Not yet implemented. Stay tuned");
|
||||||
////// If it exists, remove or warn??
|
//}
|
||||||
//if (existingDevice != null)
|
|
||||||
|
public static void AddDevice(IKeyed newDev)
|
||||||
if (!AddDeviceEnabled)
|
{
|
||||||
{
|
try
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Error, "All devices have been activated. Adding new devices is not allowed.");
|
{
|
||||||
return;
|
if (!DeviceCriticalSection.TryEnter())
|
||||||
}
|
{
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Error, "Currently unable to add devices to Device Manager. Please try again");
|
||||||
if (Devices.ContainsKey(newDev.Key))
|
return;
|
||||||
{
|
}
|
||||||
Debug.Console(0, newDev, "WARNING: A device with this key already exists. Not added to manager");
|
// Check for device with same key
|
||||||
return;
|
//var existingDevice = _Devices.FirstOrDefault(d => d.Key.Equals(newDev.Key, StringComparison.OrdinalIgnoreCase));
|
||||||
}
|
////// If it exists, remove or warn??
|
||||||
Devices.Add(newDev.Key, newDev);
|
//if (existingDevice != null)
|
||||||
//if (!(_Devices.Contains(newDev)))
|
|
||||||
// _Devices.Add(newDev);
|
if (!AddDeviceEnabled)
|
||||||
}
|
{
|
||||||
finally
|
Debug.Console(0, Debug.ErrorLogLevel.Error, "All devices have been activated. Adding new devices is not allowed.");
|
||||||
{
|
return;
|
||||||
DeviceCriticalSection.Leave();
|
}
|
||||||
}
|
|
||||||
}
|
if (Devices.ContainsKey(newDev.Key))
|
||||||
|
{
|
||||||
public static void AddDevice(IEnumerable<IKeyed> devicesToAdd)
|
Debug.Console(0, newDev, "WARNING: A device with this key already exists. Not added to manager");
|
||||||
{
|
return;
|
||||||
try
|
}
|
||||||
{
|
Devices.Add(newDev.Key, newDev);
|
||||||
if (!DeviceCriticalSection.TryEnter())
|
//if (!(_Devices.Contains(newDev)))
|
||||||
{
|
// _Devices.Add(newDev);
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Error,
|
}
|
||||||
"Currently unable to add devices to Device Manager. Please try again");
|
finally
|
||||||
return;
|
{
|
||||||
}
|
DeviceCriticalSection.Leave();
|
||||||
if (!AddDeviceEnabled)
|
}
|
||||||
{
|
}
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Error,
|
|
||||||
"All devices have been activated. Adding new devices is not allowed.");
|
public static void AddDevice(IEnumerable<IKeyed> devicesToAdd)
|
||||||
return;
|
{
|
||||||
}
|
try
|
||||||
|
{
|
||||||
foreach (var dev in devicesToAdd)
|
if (!DeviceCriticalSection.TryEnter())
|
||||||
{
|
{
|
||||||
try
|
Debug.Console(0, Debug.ErrorLogLevel.Error,
|
||||||
{
|
"Currently unable to add devices to Device Manager. Please try again");
|
||||||
Devices.Add(dev.Key, dev);
|
return;
|
||||||
}
|
}
|
||||||
catch (ArgumentException ex)
|
if (!AddDeviceEnabled)
|
||||||
{
|
{
|
||||||
Debug.Console(0, "Error adding device with key {0} to Device Manager: {1}\r\nStack Trace: {2}",
|
Debug.Console(0, Debug.ErrorLogLevel.Error,
|
||||||
dev.Key, ex.Message, ex.StackTrace);
|
"All devices have been activated. Adding new devices is not allowed.");
|
||||||
}
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
finally
|
foreach (var dev in devicesToAdd)
|
||||||
{
|
{
|
||||||
DeviceCriticalSection.Leave();
|
try
|
||||||
}
|
{
|
||||||
}
|
Devices.Add(dev.Key, dev);
|
||||||
|
}
|
||||||
public static void RemoveDevice(IKeyed newDev)
|
catch (ArgumentException ex)
|
||||||
{
|
{
|
||||||
try
|
Debug.Console(0, "Error adding device with key {0} to Device Manager: {1}\r\nStack Trace: {2}",
|
||||||
{
|
dev.Key, ex.Message, ex.StackTrace);
|
||||||
DeviceCriticalSection.Enter();
|
}
|
||||||
if (newDev == null)
|
}
|
||||||
return;
|
}
|
||||||
if (Devices.ContainsKey(newDev.Key))
|
finally
|
||||||
Devices.Remove(newDev.Key);
|
{
|
||||||
//if (_Devices.Contains(newDev))
|
DeviceCriticalSection.Leave();
|
||||||
// _Devices.Remove(newDev);
|
}
|
||||||
else
|
}
|
||||||
Debug.Console(0, "Device manager: Device '{0}' does not exist in manager. Cannot remove", newDev.Key);
|
|
||||||
}
|
public static void RemoveDevice(IKeyed newDev)
|
||||||
finally
|
{
|
||||||
{
|
try
|
||||||
DeviceCriticalSection.Leave();
|
{
|
||||||
}
|
DeviceCriticalSection.Enter();
|
||||||
}
|
if (newDev == null)
|
||||||
|
return;
|
||||||
public static IEnumerable<string> GetDeviceKeys()
|
if (Devices.ContainsKey(newDev.Key))
|
||||||
{
|
Devices.Remove(newDev.Key);
|
||||||
//return _Devices.Select(d => d.Key).ToList();
|
//if (_Devices.Contains(newDev))
|
||||||
return Devices.Keys;
|
// _Devices.Remove(newDev);
|
||||||
}
|
else
|
||||||
|
Debug.Console(0, "Device manager: Device '{0}' does not exist in manager. Cannot remove", newDev.Key);
|
||||||
public static IEnumerable<IKeyed> GetDevices()
|
}
|
||||||
{
|
finally
|
||||||
//return _Devices.Select(d => d.Key).ToList();
|
{
|
||||||
return Devices.Values;
|
DeviceCriticalSection.Leave();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
public static IKeyed GetDeviceForKey(string key)
|
|
||||||
{
|
public static IEnumerable<string> GetDeviceKeys()
|
||||||
//return _Devices.FirstOrDefault(d => d.Key.Equals(key, StringComparison.OrdinalIgnoreCase));
|
{
|
||||||
if (key != null && Devices.ContainsKey(key))
|
//return _Devices.Select(d => d.Key).ToList();
|
||||||
return Devices[key];
|
return Devices.Keys;
|
||||||
|
}
|
||||||
return null;
|
|
||||||
}
|
public static IEnumerable<IKeyed> GetDevices()
|
||||||
|
{
|
||||||
/// <summary>
|
//return _Devices.Select(d => d.Key).ToList();
|
||||||
/// Console handler that simulates com port data receive
|
return Devices.Values;
|
||||||
/// </summary>
|
}
|
||||||
/// <param name="s"></param>
|
|
||||||
public static void SimulateComReceiveOnDevice(string s)
|
public static IKeyed GetDeviceForKey(string key)
|
||||||
{
|
{
|
||||||
// devcomsim:1 xyzabc
|
//return _Devices.FirstOrDefault(d => d.Key.Equals(key, StringComparison.OrdinalIgnoreCase));
|
||||||
var match = Regex.Match(s, @"(\S*)\s*(.*)");
|
if (key != null && Devices.ContainsKey(key))
|
||||||
if (match.Groups.Count < 3)
|
return Devices[key];
|
||||||
{
|
|
||||||
CrestronConsole.ConsoleCommandResponse(" Format: devsimreceive:P <device key> <string to send>");
|
return null;
|
||||||
return;
|
}
|
||||||
}
|
|
||||||
//Debug.Console(2, "**** {0} - {1} ****", match.Groups[1].Value, match.Groups[2].Value);
|
/// <summary>
|
||||||
|
/// Console handler that simulates com port data receive
|
||||||
var com = GetDeviceForKey(match.Groups[1].Value) as ComPortController;
|
/// </summary>
|
||||||
if (com == null)
|
/// <param name="s"></param>
|
||||||
{
|
public static void SimulateComReceiveOnDevice(string s)
|
||||||
CrestronConsole.ConsoleCommandResponse("'{0}' is not a comm port device", match.Groups[1].Value);
|
{
|
||||||
return;
|
// devcomsim:1 xyzabc
|
||||||
}
|
var match = Regex.Match(s, @"(\S*)\s*(.*)");
|
||||||
com.SimulateReceive(match.Groups[2].Value);
|
if (match.Groups.Count < 3)
|
||||||
}
|
{
|
||||||
|
CrestronConsole.ConsoleCommandResponse(" Format: devsimreceive:P <device key> <string to send>");
|
||||||
/// <summary>
|
return;
|
||||||
/// Attempts to set the debug level of a device
|
}
|
||||||
/// </summary>
|
//Debug.Console(2, "**** {0} - {1} ****", match.Groups[1].Value, match.Groups[2].Value);
|
||||||
/// <param name="s"></param>
|
|
||||||
public static void SetDeviceStreamDebugging(string s)
|
var com = GetDeviceForKey(match.Groups[1].Value) as ComPortController;
|
||||||
{
|
if (com == null)
|
||||||
var args = s.Split(' ');
|
{
|
||||||
|
CrestronConsole.ConsoleCommandResponse("'{0}' is not a comm port device", match.Groups[1].Value);
|
||||||
var deviceKey = args[0];
|
return;
|
||||||
var setting = args[1];
|
}
|
||||||
|
com.SimulateReceive(match.Groups[2].Value);
|
||||||
var timeout= String.Empty;
|
}
|
||||||
|
|
||||||
if (args.Length >= 3)
|
/// <summary>
|
||||||
{
|
/// Prints a list of routing inputs and outputs by device key.
|
||||||
timeout = args[2];
|
/// </summary>
|
||||||
}
|
/// <param name="s">Device key from which to report data</param>
|
||||||
|
public static void GetRoutingPorts(string s)
|
||||||
var device = GetDeviceForKey(deviceKey) as IStreamDebugging;
|
{
|
||||||
|
var device = GetDeviceForKey(s);
|
||||||
if (device == null)
|
|
||||||
{
|
if (device == null) return;
|
||||||
Debug.Console(0, "Unable to get device with key: {0}", deviceKey);
|
var inputPorts = ((device as IRoutingInputs) != null) ? (device as IRoutingInputs).InputPorts : null;
|
||||||
return;
|
var outputPorts = ((device as IRoutingOutputs) != null) ? (device as IRoutingOutputs).OutputPorts : null;
|
||||||
}
|
if (inputPorts != null)
|
||||||
|
{
|
||||||
eStreamDebuggingSetting debugSetting;
|
Debug.Console(0, "Device {0} has {1} Input Ports:", s, inputPorts.Count);
|
||||||
|
foreach (var routingInputPort in inputPorts)
|
||||||
try
|
{
|
||||||
{
|
Debug.Console(0, "{0}", routingInputPort.Key);
|
||||||
debugSetting = (eStreamDebuggingSetting)Enum.Parse(typeof(eStreamDebuggingSetting), setting, true);
|
}
|
||||||
}
|
}
|
||||||
catch
|
if (outputPorts != null)
|
||||||
{
|
{
|
||||||
Debug.Console(0, "Unable to convert setting value. Please use off/rx/tx/both");
|
Debug.Console(0, "Device {0} has {1} Output Ports:", s, outputPorts.Count);
|
||||||
return;
|
foreach (var routingOutputPort in outputPorts)
|
||||||
}
|
{
|
||||||
|
Debug.Console(0, "{0}", routingOutputPort.Key);
|
||||||
if (!string.IsNullOrEmpty(timeout))
|
}
|
||||||
{
|
}
|
||||||
try
|
}
|
||||||
{
|
|
||||||
var min = Convert.ToUInt32(timeout);
|
/// <summary>
|
||||||
|
/// Attempts to set the debug level of a device
|
||||||
device.StreamDebugging.SetDebuggingWithSpecificTimeout(debugSetting, min);
|
/// </summary>
|
||||||
Debug.Console(0, "Device: '{0}' debug level set to {1) for {2} minutes", deviceKey, debugSetting, min);
|
/// <param name="s"></param>
|
||||||
|
public static void SetDeviceStreamDebugging(string s)
|
||||||
}
|
{
|
||||||
catch (Exception e)
|
if (String.IsNullOrEmpty(s) || s.Contains("?"))
|
||||||
{
|
{
|
||||||
Debug.Console(0, "Unable to convert minutes or settings value. Please use an integer value for minutes. Errro: {0}", e);
|
CrestronConsole.ConsoleCommandResponse(
|
||||||
}
|
@"SETDEVICESTREAMDEBUG [{deviceKey}] [OFF |TX | RX | BOTH] [timeOutInMinutes]
|
||||||
}
|
{deviceKey} [OFF | TX | RX | BOTH] - Device to set stream debugging on, and which setting to use
|
||||||
else
|
timeOutInMinutes - Set timeout for stream debugging. Default is 30 minutes");
|
||||||
{
|
return;
|
||||||
device.StreamDebugging.SetDebuggingWithDefaultTimeout(debugSetting);
|
}
|
||||||
Debug.Console(0, "Device: '{0}' debug level set to {1) for default time (30 minutes)", deviceKey, debugSetting);
|
|
||||||
}
|
var args = s.Split(' ');
|
||||||
}
|
|
||||||
|
var deviceKey = args[0];
|
||||||
/// <summary>
|
var setting = args[1];
|
||||||
/// Sets stream debugging settings to off for all devices
|
|
||||||
/// </summary>
|
var timeout= String.Empty;
|
||||||
public static void DisableAllDeviceStreamDebugging()
|
|
||||||
{
|
if (args.Length >= 3)
|
||||||
foreach (var device in AllDevices)
|
{
|
||||||
{
|
timeout = args[2];
|
||||||
var streamDevice = device as IStreamDebugging;
|
}
|
||||||
|
|
||||||
if (streamDevice != null)
|
var device = GetDeviceForKey(deviceKey) as IStreamDebugging;
|
||||||
{
|
|
||||||
streamDevice.StreamDebugging.SetDebuggingWithDefaultTimeout(eStreamDebuggingSetting.Off);
|
if (device == null)
|
||||||
}
|
{
|
||||||
}
|
Debug.Console(0, "Unable to get device with key: {0}", deviceKey);
|
||||||
}
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
eStreamDebuggingSetting debugSetting;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
debugSetting = (eStreamDebuggingSetting)Enum.Parse(typeof(eStreamDebuggingSetting), setting, true);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
Debug.Console(0, "Unable to convert setting value. Please use off/rx/tx/both");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(timeout))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var min = Convert.ToUInt32(timeout);
|
||||||
|
|
||||||
|
device.StreamDebugging.SetDebuggingWithSpecificTimeout(debugSetting, min);
|
||||||
|
Debug.Console(0, "Device: '{0}' debug level set to {1} for {2} minutes", deviceKey, debugSetting, min);
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Debug.Console(0, "Unable to convert minutes or settings value. Please use an integer value for minutes. Errro: {0}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
device.StreamDebugging.SetDebuggingWithDefaultTimeout(debugSetting);
|
||||||
|
Debug.Console(0, "Device: '{0}' debug level set to {1} for default time (30 minutes)", deviceKey, debugSetting);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Sets stream debugging settings to off for all devices
|
||||||
|
/// </summary>
|
||||||
|
public static void DisableAllDeviceStreamDebugging()
|
||||||
|
{
|
||||||
|
foreach (var device in AllDevices)
|
||||||
|
{
|
||||||
|
var streamDevice = device as IStreamDebugging;
|
||||||
|
|
||||||
|
if (streamDevice != null)
|
||||||
|
{
|
||||||
|
streamDevice.StreamDebugging.SetDebuggingWithDefaultTimeout(eStreamDebuggingSetting.Off);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,113 +1,134 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
using Crestron.SimplSharp.Reflection;
|
using Crestron.SimplSharp.Reflection;
|
||||||
|
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core
|
namespace PepperDash.Essentials.Core
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Defines the basic needs for an EssentialsDevice to enable it to be build by an IDeviceFactory class
|
/// Defines the basic needs for an EssentialsDevice to enable it to be build by an IDeviceFactory class
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Description("The base Essentials Device Class")]
|
[Description("The base Essentials Device Class")]
|
||||||
public abstract class EssentialsDevice : Device
|
public abstract class EssentialsDevice : Device
|
||||||
{
|
{
|
||||||
protected EssentialsDevice(string key)
|
protected EssentialsDevice(string key)
|
||||||
: base(key)
|
: base(key)
|
||||||
{
|
{
|
||||||
|
SubscribeToActivateComplete();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected EssentialsDevice(string key, string name)
|
protected EssentialsDevice(string key, string name)
|
||||||
: base(key, name)
|
: base(key, name)
|
||||||
{
|
{
|
||||||
|
SubscribeToActivateComplete();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
private void SubscribeToActivateComplete()
|
||||||
[AttributeUsage(AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
|
{
|
||||||
public class DescriptionAttribute : Attribute
|
DeviceManager.AllDevicesActivated += DeviceManagerOnAllDevicesActivated;
|
||||||
{
|
}
|
||||||
private string _Description;
|
|
||||||
|
private void DeviceManagerOnAllDevicesActivated(object sender, EventArgs eventArgs)
|
||||||
public DescriptionAttribute(string description)
|
{
|
||||||
{
|
CrestronInvoke.BeginInvoke((o) =>
|
||||||
Debug.Console(2, "Setting Description: {0}", description);
|
{
|
||||||
_Description = description;
|
try
|
||||||
}
|
{
|
||||||
|
Initialize();
|
||||||
public string Description
|
}
|
||||||
{
|
catch (Exception ex)
|
||||||
get { return _Description; }
|
{
|
||||||
}
|
Debug.Console(0, this, Debug.ErrorLogLevel.Error, "Exception initializing device: {0}", ex.Message);
|
||||||
}
|
Debug.Console(1, this, Debug.ErrorLogLevel.Error, "Stack Trace: {0}", ex.StackTrace);
|
||||||
|
}
|
||||||
[AttributeUsage(AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
|
});
|
||||||
public class ConfigSnippetAttribute : Attribute
|
}
|
||||||
{
|
}
|
||||||
private string _ConfigSnippet;
|
|
||||||
|
[AttributeUsage(AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
|
||||||
public ConfigSnippetAttribute(string configSnippet)
|
public class DescriptionAttribute : Attribute
|
||||||
{
|
{
|
||||||
Debug.Console(2, "Setting Config Snippet {0}", configSnippet);
|
private string _Description;
|
||||||
_ConfigSnippet = configSnippet;
|
|
||||||
}
|
public DescriptionAttribute(string description)
|
||||||
|
{
|
||||||
public string ConfigSnippet
|
Debug.Console(2, "Setting Description: {0}", description);
|
||||||
{
|
_Description = description;
|
||||||
get { return _ConfigSnippet; }
|
}
|
||||||
}
|
|
||||||
}
|
public string Description
|
||||||
|
{
|
||||||
/// <summary>
|
get { return _Description; }
|
||||||
/// Devices the basic needs for a Device Factory
|
}
|
||||||
/// </summary>
|
}
|
||||||
public abstract class EssentialsDeviceFactory<T> : IDeviceFactory where T:EssentialsDevice
|
|
||||||
{
|
[AttributeUsage(AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
|
||||||
#region IDeviceFactory Members
|
public class ConfigSnippetAttribute : Attribute
|
||||||
|
{
|
||||||
/// <summary>
|
private string _ConfigSnippet;
|
||||||
/// A list of strings that can be used in the type property of a DeviceConfig object to build an instance of this device
|
|
||||||
/// </summary>
|
public ConfigSnippetAttribute(string configSnippet)
|
||||||
public List<string> TypeNames { get; protected set; }
|
{
|
||||||
|
Debug.Console(2, "Setting Config Snippet {0}", configSnippet);
|
||||||
/// <summary>
|
_ConfigSnippet = configSnippet;
|
||||||
/// Loads an item to the DeviceFactory.FactoryMethods dictionary for each entry in the TypeNames list
|
}
|
||||||
/// </summary>
|
|
||||||
public void LoadTypeFactories()
|
public string ConfigSnippet
|
||||||
{
|
{
|
||||||
foreach (var typeName in TypeNames)
|
get { return _ConfigSnippet; }
|
||||||
{
|
}
|
||||||
Debug.Console(2, "Getting Description Attribute from class: '{0}'", typeof(T).FullName);
|
}
|
||||||
var descriptionAttribute = typeof(T).GetCustomAttributes(typeof(DescriptionAttribute), true) as DescriptionAttribute[];
|
|
||||||
|
/// <summary>
|
||||||
|
/// Devices the basic needs for a Device Factory
|
||||||
|
/// </summary>
|
||||||
|
public abstract class EssentialsDeviceFactory<T> : IDeviceFactory where T:EssentialsDevice
|
||||||
|
{
|
||||||
|
#region IDeviceFactory Members
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A list of strings that can be used in the type property of a DeviceConfig object to build an instance of this device
|
||||||
|
/// </summary>
|
||||||
|
public List<string> TypeNames { get; protected set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Loads an item to the DeviceFactory.FactoryMethods dictionary for each entry in the TypeNames list
|
||||||
|
/// </summary>
|
||||||
|
public void LoadTypeFactories()
|
||||||
|
{
|
||||||
|
foreach (var typeName in TypeNames)
|
||||||
|
{
|
||||||
|
Debug.Console(2, "Getting Description Attribute from class: '{0}'", typeof(T).FullName);
|
||||||
|
var descriptionAttribute = typeof(T).GetCustomAttributes(typeof(DescriptionAttribute), true) as DescriptionAttribute[];
|
||||||
string description = descriptionAttribute[0].Description;
|
string description = descriptionAttribute[0].Description;
|
||||||
var snippetAttribute = typeof(T).GetCustomAttributes(typeof(ConfigSnippetAttribute), true) as ConfigSnippetAttribute[];
|
var snippetAttribute = typeof(T).GetCustomAttributes(typeof(ConfigSnippetAttribute), true) as ConfigSnippetAttribute[];
|
||||||
DeviceFactory.AddFactoryForType(typeName.ToLower(), description, typeof(T), BuildDevice);
|
DeviceFactory.AddFactoryForType(typeName.ToLower(), description, typeof(T), BuildDevice);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The method that will build the device
|
/// The method that will build the device
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="dc">The device config</param>
|
/// <param name="dc">The device config</param>
|
||||||
/// <returns>An instance of the device</returns>
|
/// <returns>An instance of the device</returns>
|
||||||
public abstract EssentialsDevice BuildDevice(DeviceConfig dc);
|
public abstract EssentialsDevice BuildDevice(DeviceConfig dc);
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Devices the basic needs for a Device Factory
|
/// Devices the basic needs for a Device Factory
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public abstract class EssentialsPluginDeviceFactory<T> : EssentialsDeviceFactory<T>, IPluginDeviceFactory where T : EssentialsDevice
|
public abstract class EssentialsPluginDeviceFactory<T> : EssentialsDeviceFactory<T>, IPluginDeviceFactory where T : EssentialsDevice
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Specifies the minimum version of Essentials required for a plugin to run. Must use the format Major.Minor.Build (ex. "1.4.33")
|
/// Specifies the minimum version of Essentials required for a plugin to run. Must use the format Major.Minor.Build (ex. "1.4.33")
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string MinimumEssentialsFrameworkVersion { get; protected set; }
|
public string MinimumEssentialsFrameworkVersion { get; protected set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,138 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Crestron.SimplSharpPro.DeviceSupport;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using PepperDash.Core;
|
||||||
|
using PepperDash.Essentials.Core;
|
||||||
|
using PepperDash.Essentials.Core.Bridges;
|
||||||
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core.Devices
|
||||||
|
{
|
||||||
|
public class GenericIrController: EssentialsBridgeableDevice
|
||||||
|
{
|
||||||
|
//data storage for bridging
|
||||||
|
private BasicTriList _trilist;
|
||||||
|
private uint _joinStart;
|
||||||
|
private string _joinMapKey;
|
||||||
|
private EiscApiAdvanced _bridge;
|
||||||
|
|
||||||
|
private readonly IrOutputPortController _port;
|
||||||
|
|
||||||
|
public string[] IrCommands {get { return _port.IrFileCommands; }}
|
||||||
|
|
||||||
|
public GenericIrController(string key, string name, IrOutputPortController irPort) : base(key, name)
|
||||||
|
{
|
||||||
|
_port = irPort;
|
||||||
|
|
||||||
|
if (_port == null)
|
||||||
|
{
|
||||||
|
Debug.Console(0, this, Debug.ErrorLogLevel.Error, "IR Port is null, device will not function");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
DeviceManager.AddDevice(_port);
|
||||||
|
|
||||||
|
_port.DriverLoaded.OutputChange += DriverLoadedOnOutputChange;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DriverLoadedOnOutputChange(object sender, FeedbackEventArgs args)
|
||||||
|
{
|
||||||
|
if (!args.BoolValue)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_trilist == null || _bridge == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
LinkToApi(_trilist, _joinStart, _joinMapKey, _bridge);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Overrides of EssentialsBridgeableDevice
|
||||||
|
|
||||||
|
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
||||||
|
{
|
||||||
|
//if driver isn't loaded yet, store the variables until it is loaded, then call the LinkToApi method again
|
||||||
|
if (!_port.DriverIsLoaded)
|
||||||
|
{
|
||||||
|
_trilist = trilist;
|
||||||
|
_joinStart = joinStart;
|
||||||
|
_joinMapKey = joinMapKey;
|
||||||
|
_bridge = bridge;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var joinMap = new GenericIrControllerJoinMap(joinStart);
|
||||||
|
|
||||||
|
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(joinMapSerialized))
|
||||||
|
joinMap = JsonConvert.DeserializeObject<GenericIrControllerJoinMap>(joinMapSerialized);
|
||||||
|
|
||||||
|
for (uint i = 0; i < _port.IrFileCommands.Length; i++)
|
||||||
|
{
|
||||||
|
var cmd = _port.IrFileCommands[i];
|
||||||
|
var joinData = new JoinDataComplete(new JoinData {JoinNumber = i, JoinSpan = 1},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = cmd,
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
joinData.SetJoinOffset(joinStart);
|
||||||
|
|
||||||
|
joinMap.Joins.Add(cmd,joinData);
|
||||||
|
|
||||||
|
trilist.SetBoolSigAction(joinData.JoinNumber, (b) => Press(cmd, b));
|
||||||
|
}
|
||||||
|
|
||||||
|
joinMap.PrintJoinMapInfo();
|
||||||
|
|
||||||
|
if (bridge != null)
|
||||||
|
{
|
||||||
|
bridge.AddJoinMap(Key, joinMap);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Console(0, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
public void Press(string command, bool pressRelease)
|
||||||
|
{
|
||||||
|
_port.PressRelease(command, pressRelease);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public sealed class GenericIrControllerJoinMap : JoinMapBaseAdvanced
|
||||||
|
{
|
||||||
|
public GenericIrControllerJoinMap(uint joinStart) : base(joinStart)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class GenericIrControllerFactory : EssentialsDeviceFactory<GenericIrController>
|
||||||
|
{
|
||||||
|
public GenericIrControllerFactory()
|
||||||
|
{
|
||||||
|
TypeNames = new List<string> {"genericIrController"};
|
||||||
|
}
|
||||||
|
#region Overrides of EssentialsDeviceFactory<GenericIRController>
|
||||||
|
|
||||||
|
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
||||||
|
{
|
||||||
|
Debug.Console(1, "Factory Attempting to create new Generic IR Controller Device");
|
||||||
|
|
||||||
|
var irPort = IRPortHelper.GetIrOutputPortController(dc);
|
||||||
|
|
||||||
|
return new GenericIrController(dc.Key, dc.Name, irPort);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core
|
||||||
|
{
|
||||||
|
public interface IHasDspPresets
|
||||||
|
{
|
||||||
|
List<IDspPreset> Presets { get; }
|
||||||
|
|
||||||
|
void RecallPreset(IDspPreset preset);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IDspPreset
|
||||||
|
{
|
||||||
|
string Name { get; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core
|
namespace PepperDash.Essentials.Core
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using Crestron.SimplSharp;
|
||||||
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core.Devices
|
||||||
|
{
|
||||||
|
public interface IReconfigurableDevice
|
||||||
|
{
|
||||||
|
event EventHandler<EventArgs> ConfigChanged;
|
||||||
|
|
||||||
|
DeviceConfig Config { get; }
|
||||||
|
|
||||||
|
void SetConfig(DeviceConfig config);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,138 +1,169 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
using Crestron.SimplSharpPro;
|
using Crestron.SimplSharpPro;
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
using Crestron.SimplSharpPro.DeviceSupport;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
|
||||||
|
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core
|
namespace PepperDash.Essentials.Core
|
||||||
{
|
{
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// IR port wrapper. May act standalone
|
/// IR port wrapper. May act standalone
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class IrOutputPortController : Device
|
public class IrOutputPortController : Device
|
||||||
{
|
{
|
||||||
uint IrPortUid;
|
uint IrPortUid;
|
||||||
IROutputPort IrPort;
|
IROutputPort IrPort;
|
||||||
|
|
||||||
public ushort StandardIrPulseTime { get; set; }
|
public BoolFeedback DriverLoaded { get; private set; }
|
||||||
public string DriverFilepath { get; private set; }
|
|
||||||
public bool DriverIsLoaded { get; private set; }
|
public ushort StandardIrPulseTime { get; set; }
|
||||||
|
public string DriverFilepath { get; private set; }
|
||||||
/// <summary>
|
public bool DriverIsLoaded { get; private set; }
|
||||||
/// Constructor for IrDevice base class. If a null port is provided, this class will
|
|
||||||
/// still function without trying to talk to a port.
|
public string[] IrFileCommands { get { return IrPort.AvailableStandardIRCmds(IrPortUid); } }
|
||||||
/// </summary>
|
|
||||||
public IrOutputPortController(string key, IROutputPort port, string irDriverFilepath)
|
/// <summary>
|
||||||
: base(key)
|
/// Constructor for IrDevice base class. If a null port is provided, this class will
|
||||||
{
|
/// still function without trying to talk to a port.
|
||||||
//if (port == null) throw new ArgumentNullException("port");
|
/// </summary>
|
||||||
IrPort = port;
|
public IrOutputPortController(string key, IROutputPort port, string irDriverFilepath)
|
||||||
if (port == null)
|
: base(key)
|
||||||
{
|
{
|
||||||
Debug.Console(0, this, "WARNING No valid IR Port assigned to controller. IR will not function");
|
//if (port == null) throw new ArgumentNullException("port");
|
||||||
return;
|
|
||||||
}
|
DriverLoaded = new BoolFeedback(() => DriverIsLoaded);
|
||||||
LoadDriver(irDriverFilepath);
|
IrPort = port;
|
||||||
|
if (port == null)
|
||||||
|
{
|
||||||
|
Debug.Console(0, this, "WARNING No valid IR Port assigned to controller. IR will not function");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
LoadDriver(irDriverFilepath);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IrOutputPortController(string key, Func<DeviceConfig, IROutputPort> postActivationFunc,
|
public IrOutputPortController(string key, Func<DeviceConfig, IROutputPort> postActivationFunc,
|
||||||
DeviceConfig config)
|
DeviceConfig config)
|
||||||
: base(key)
|
: base(key)
|
||||||
{
|
{
|
||||||
|
DriverLoaded = new BoolFeedback(() => DriverIsLoaded);
|
||||||
AddPostActivationAction(() =>
|
AddPostActivationAction(() =>
|
||||||
{
|
{
|
||||||
IrPort = postActivationFunc(config);
|
IrPort = postActivationFunc(config);
|
||||||
|
|
||||||
|
if (IrPort == null)
|
||||||
|
{
|
||||||
|
Debug.Console(0, this, "WARNING No valid IR Port assigned to controller. IR will not function");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var filePath = Global.FilePathPrefix + "ir" + Global.DirectorySeparator + config.Properties["control"]["irFile"].Value<string>();
|
||||||
|
Debug.Console(1, "*************Attempting to load IR file: {0}***************", filePath);
|
||||||
|
|
||||||
|
LoadDriver(filePath);
|
||||||
|
|
||||||
|
PrintAvailableCommands();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void PrintAvailableCommands()
|
||||||
|
{
|
||||||
|
Debug.Console(2, this, "Available IR Commands in IR File {0}", IrPortUid);
|
||||||
|
foreach (var cmd in IrPort.AvailableIRCmds())
|
||||||
|
{
|
||||||
|
Debug.Console(2, this, "{0}", cmd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Loads the IR driver at path
|
/// Loads the IR driver at path
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="path"></param>
|
/// <param name="path"></param>
|
||||||
public void LoadDriver(string path)
|
public void LoadDriver(string path)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(path)) path = DriverFilepath;
|
Debug.Console(2, this, "***Loading IR File***");
|
||||||
try
|
if (string.IsNullOrEmpty(path)) path = DriverFilepath;
|
||||||
{
|
try
|
||||||
IrPortUid = IrPort.LoadIRDriver(path);
|
{
|
||||||
DriverFilepath = path;
|
IrPortUid = IrPort.LoadIRDriver(path);
|
||||||
StandardIrPulseTime = 200;
|
DriverFilepath = path;
|
||||||
DriverIsLoaded = true;
|
StandardIrPulseTime = 200;
|
||||||
}
|
DriverIsLoaded = true;
|
||||||
catch
|
|
||||||
{
|
DriverLoaded.FireUpdate();
|
||||||
DriverIsLoaded = false;
|
}
|
||||||
var message = string.Format("WARNING IR Driver '{0}' failed to load", path);
|
catch
|
||||||
Debug.Console(0, this, message);
|
{
|
||||||
ErrorLog.Error(message);
|
DriverIsLoaded = false;
|
||||||
}
|
var message = string.Format("WARNING IR Driver '{0}' failed to load", path);
|
||||||
}
|
Debug.Console(0, this, Debug.ErrorLogLevel.Error, message);
|
||||||
|
DriverLoaded.FireUpdate();
|
||||||
|
}
|
||||||
/// <summary>
|
|
||||||
/// Starts and stops IR command on driver. Safe for missing commands
|
|
||||||
/// </summary>
|
|
||||||
public virtual void PressRelease(string command, bool state)
|
|
||||||
{
|
|
||||||
Debug.Console(2, this, "IR:'{0}'={1}", command, state);
|
|
||||||
if (IrPort == null)
|
|
||||||
{
|
|
||||||
Debug.Console(2, this, "WARNING No IR Port assigned to controller");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!DriverIsLoaded)
|
|
||||||
{
|
|
||||||
Debug.Console(2, this, "WARNING IR driver is not loaded");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (state)
|
|
||||||
{
|
|
||||||
if (IrPort.IsIRCommandAvailable(IrPortUid, command))
|
|
||||||
IrPort.Press(IrPortUid, command);
|
|
||||||
else
|
|
||||||
NoIrCommandError(command);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
IrPort.Release();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Pulses a command on driver. Safe for missing commands
|
|
||||||
/// </summary>
|
|
||||||
public virtual void Pulse(string command, ushort time)
|
|
||||||
{
|
|
||||||
if (IrPort == null)
|
|
||||||
{
|
|
||||||
Debug.Console(2, this, "WARNING No IR Port assigned to controller");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!DriverIsLoaded)
|
|
||||||
{
|
|
||||||
Debug.Console(2, this, "WARNING IR driver is not loaded");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (IrPort.IsIRCommandAvailable(IrPortUid, command))
|
|
||||||
IrPort.PressAndRelease(IrPortUid, command, time);
|
|
||||||
else
|
|
||||||
NoIrCommandError(command);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Notifies the console when a bad command is used.
|
|
||||||
/// </summary>
|
|
||||||
protected void NoIrCommandError(string command)
|
|
||||||
{
|
|
||||||
Debug.Console(2, this, "Device {0}: IR Driver {1} does not contain command {2}",
|
|
||||||
Key, IrPort.IRDriverFileNameByIRDriverId(IrPortUid), command);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Starts and stops IR command on driver. Safe for missing commands
|
||||||
|
/// </summary>
|
||||||
|
public virtual void PressRelease(string command, bool state)
|
||||||
|
{
|
||||||
|
Debug.Console(2, this, "IR:'{0}'={1}", command, state);
|
||||||
|
if (IrPort == null)
|
||||||
|
{
|
||||||
|
Debug.Console(2, this, "WARNING No IR Port assigned to controller");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!DriverIsLoaded)
|
||||||
|
{
|
||||||
|
Debug.Console(2, this, "WARNING IR driver is not loaded");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (state)
|
||||||
|
{
|
||||||
|
if (IrPort.IsIRCommandAvailable(IrPortUid, command))
|
||||||
|
IrPort.Press(IrPortUid, command);
|
||||||
|
else
|
||||||
|
NoIrCommandError(command);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
IrPort.Release();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Pulses a command on driver. Safe for missing commands
|
||||||
|
/// </summary>
|
||||||
|
public virtual void Pulse(string command, ushort time)
|
||||||
|
{
|
||||||
|
if (IrPort == null)
|
||||||
|
{
|
||||||
|
Debug.Console(2, this, "WARNING No IR Port assigned to controller");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!DriverIsLoaded)
|
||||||
|
{
|
||||||
|
Debug.Console(2, this, "WARNING IR driver is not loaded");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (IrPort.IsIRCommandAvailable(IrPortUid, command))
|
||||||
|
IrPort.PressAndRelease(IrPortUid, command, time);
|
||||||
|
else
|
||||||
|
NoIrCommandError(command);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Notifies the console when a bad command is used.
|
||||||
|
/// </summary>
|
||||||
|
protected void NoIrCommandError(string command)
|
||||||
|
{
|
||||||
|
Debug.Console(2, this, "Device {0}: IR Driver {1} does not contain command {2}",
|
||||||
|
Key, IrPort.IRDriverFileNameByIRDriverId(IrPortUid), command);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -7,13 +7,15 @@ using Crestron.SimplSharpPro.DeviceSupport;
|
|||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
using PepperDash.Essentials.Core.Bridges;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Devices
|
namespace PepperDash.Essentials.Core.Devices
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public abstract class ReconfigurableDevice : EssentialsDevice
|
public abstract class ReconfigurableDevice : EssentialsDevice, IReconfigurableDevice
|
||||||
{
|
{
|
||||||
public event EventHandler<EventArgs> ConfigChanged;
|
public event EventHandler<EventArgs> ConfigChanged;
|
||||||
|
|
||||||
@@ -52,6 +54,8 @@ namespace PepperDash.Essentials.Core.Devices
|
|||||||
Name = config.Name;
|
Name = config.Name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Used by the extending class to allow for any custom actions to be taken (tell the ConfigWriter to write config, etc)
|
/// Used by the extending class to allow for any custom actions to be taken (tell the ConfigWriter to write config, etc)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -130,10 +130,24 @@ namespace PepperDash.Essentials.Core
|
|||||||
[JsonProperty("sourceListKey")]
|
[JsonProperty("sourceListKey")]
|
||||||
public string SourceListKey { get; set; }
|
public string SourceListKey { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates if the device associated with this source is controllable
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("isControllable")]
|
||||||
|
public bool IsControllable { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates that the device associated with this source has audio available
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("isAudioSource")]
|
||||||
|
public bool IsAudioSource { get; set; }
|
||||||
|
|
||||||
public SourceListItem()
|
public SourceListItem()
|
||||||
{
|
{
|
||||||
Icon = "Blank";
|
Icon = "Blank";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SourceRouteListItem
|
public class SourceRouteListItem
|
||||||
|
|||||||
@@ -20,10 +20,13 @@ namespace PepperDash.Essentials.Core
|
|||||||
public IrOutputPortController IrPort { get; private set; }
|
public IrOutputPortController IrPort { get; private set; }
|
||||||
public ushort IrPulseTime { get; set; }
|
public ushort IrPulseTime { get; set; }
|
||||||
|
|
||||||
protected override Func<bool> PowerIsOnFeedbackFunc
|
[Obsolete("This property will be removed in version 2.0.0")]
|
||||||
{
|
public override BoolFeedback PowerIsOnFeedback { get; protected set; }
|
||||||
get { return () => _PowerIsOn; }
|
|
||||||
}
|
protected Func<bool> PowerIsOnFeedbackFunc
|
||||||
|
{
|
||||||
|
get { return () => _PowerIsOn; }
|
||||||
|
}
|
||||||
protected override Func<bool> IsCoolingDownFeedbackFunc
|
protected override Func<bool> IsCoolingDownFeedbackFunc
|
||||||
{
|
{
|
||||||
get { return () => _IsCoolingDown; }
|
get { return () => _IsCoolingDown; }
|
||||||
@@ -33,7 +36,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
get { return () => _IsWarmingUp; }
|
get { return () => _IsWarmingUp; }
|
||||||
}
|
}
|
||||||
|
|
||||||
bool _PowerIsOn;
|
bool _PowerIsOn;
|
||||||
bool _IsWarmingUp;
|
bool _IsWarmingUp;
|
||||||
bool _IsCoolingDown;
|
bool _IsCoolingDown;
|
||||||
|
|
||||||
@@ -43,11 +46,14 @@ namespace PepperDash.Essentials.Core
|
|||||||
IrPort = new IrOutputPortController(key + "-ir", port, irDriverFilepath);
|
IrPort = new IrOutputPortController(key + "-ir", port, irDriverFilepath);
|
||||||
DeviceManager.AddDevice(IrPort);
|
DeviceManager.AddDevice(IrPort);
|
||||||
|
|
||||||
PowerIsOnFeedback.OutputChange += (o, a) => {
|
PowerIsOnFeedback = new BoolFeedback(PowerIsOnFeedbackFunc);
|
||||||
Debug.Console(2, this, "Power on={0}", _PowerIsOn);
|
|
||||||
if (_PowerIsOn) StartWarmingTimer();
|
PowerIsOnFeedback.OutputChange += (o, a) =>
|
||||||
else StartCoolingTimer();
|
{
|
||||||
};
|
Debug.Console(2, this, "Power on={0}", _PowerIsOn);
|
||||||
|
if (_PowerIsOn) StartWarmingTimer();
|
||||||
|
else StartCoolingTimer();
|
||||||
|
};
|
||||||
IsWarmingUpFeedback.OutputChange += (o, a) => Debug.Console(2, this, "Warming up={0}", _IsWarmingUp);
|
IsWarmingUpFeedback.OutputChange += (o, a) => Debug.Console(2, this, "Warming up={0}", _IsWarmingUp);
|
||||||
IsCoolingDownFeedback.OutputChange += (o, a) => Debug.Console(2, this, "Cooling down={0}", _IsCoolingDown);
|
IsCoolingDownFeedback.OutputChange += (o, a) => Debug.Console(2, this, "Cooling down={0}", _IsCoolingDown);
|
||||||
|
|
||||||
@@ -110,21 +116,21 @@ namespace PepperDash.Essentials.Core
|
|||||||
public override void PowerOn()
|
public override void PowerOn()
|
||||||
{
|
{
|
||||||
IrPort.Pulse(IROutputStandardCommands.IROut_POWER_ON, IrPulseTime);
|
IrPort.Pulse(IROutputStandardCommands.IROut_POWER_ON, IrPulseTime);
|
||||||
_PowerIsOn = true;
|
_PowerIsOn = true;
|
||||||
PowerIsOnFeedback.FireUpdate();
|
PowerIsOnFeedback.FireUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void PowerOff()
|
public override void PowerOff()
|
||||||
{
|
{
|
||||||
_PowerIsOn = false;
|
_PowerIsOn = false;
|
||||||
PowerIsOnFeedback.FireUpdate();
|
PowerIsOnFeedback.FireUpdate();
|
||||||
IrPort.Pulse(IROutputStandardCommands.IROut_POWER_OFF, IrPulseTime);
|
IrPort.Pulse(IROutputStandardCommands.IROut_POWER_OFF, IrPulseTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void PowerToggle()
|
public override void PowerToggle()
|
||||||
{
|
{
|
||||||
_PowerIsOn = false;
|
_PowerIsOn = false;
|
||||||
PowerIsOnFeedback.FireUpdate();
|
PowerIsOnFeedback.FireUpdate();
|
||||||
IrPort.Pulse(IROutputStandardCommands.IROut_POWER, IrPulseTime);
|
IrPort.Pulse(IROutputStandardCommands.IROut_POWER, IrPulseTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user