mirror of
https://github.com/PepperDash/Essentials.git
synced 2026-02-09 09:45:06 +00:00
Compare commits
705 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
22ff61d7f3 | ||
|
|
f066321f3a | ||
|
|
302603aa54 | ||
|
|
dea858e187 | ||
|
|
ddbee2ed04 | ||
|
|
b7c9677c7a | ||
|
|
d6581cab2e | ||
|
|
66c481e3dc | ||
|
|
edd01785d5 | ||
|
|
192aa4255c | ||
|
|
637ca2f312 | ||
|
|
bf7a0600f3 | ||
|
|
f59654d75e | ||
|
|
211665c0c4 | ||
|
|
829e3eb634 | ||
|
|
683f007e0b | ||
|
|
23bfecd870 | ||
|
|
0b485d8d96 | ||
|
|
1d42d88c3f | ||
|
|
ec0b2fa181 | ||
|
|
1b621e1655 | ||
|
|
3ecadf72e9 | ||
|
|
744298bdb5 | ||
|
|
fe090113ce | ||
|
|
55e50f68d3 | ||
|
|
8d13de0e8c | ||
|
|
41aae794b6 | ||
|
|
dbafce0aa8 | ||
|
|
383777c0f5 | ||
|
|
5e24bb6cd3 | ||
|
|
4fdc19ff20 | ||
|
|
518c0a8bfb | ||
|
|
d17cd42b19 | ||
|
|
35d7c23815 | ||
|
|
c7e6e0c250 | ||
|
|
7c4222a598 | ||
|
|
fda888b095 | ||
|
|
894da801b1 | ||
|
|
642d573c3b | ||
|
|
03cf6ffd60 | ||
|
|
989becb8dd | ||
|
|
97e0b732d0 | ||
|
|
80073c22b1 | ||
|
|
49edaa33ac | ||
|
|
f9b326e1e1 | ||
|
|
7cfd27a5cc | ||
|
|
bb23452bb0 | ||
|
|
f184808ab5 | ||
|
|
b686ee6df6 | ||
|
|
671ebc65a0 | ||
|
|
b12b1fa3fd | ||
|
|
91aa304990 | ||
|
|
6aad15c452 | ||
|
|
c43fdc156d | ||
|
|
d920234652 | ||
|
|
8103ca6cb2 | ||
|
|
232233d58e | ||
|
|
985c0e05e3 | ||
|
|
cef8dbd706 | ||
|
|
9732da7a8a | ||
|
|
6cd686ec7c | ||
|
|
3152430584 | ||
|
|
22453d4786 | ||
|
|
2312657a2f | ||
|
|
fb93dab3a3 | ||
|
|
507edd4e43 | ||
|
|
cdf876cb5a | ||
|
|
8341631618 | ||
|
|
75dacb48a1 | ||
|
|
6a4c7bb65e | ||
|
|
276c681b66 | ||
|
|
414a4a9564 | ||
|
|
25cb4e8727 | ||
|
|
044a259f0b | ||
|
|
ecabd66b07 | ||
|
|
aff2371a4b | ||
|
|
7a93223678 | ||
|
|
5590925774 | ||
|
|
3b73a7d73c | ||
|
|
af85135674 | ||
|
|
2767bccb2c | ||
|
|
2f7e6bf778 | ||
|
|
232ec81ec0 | ||
|
|
98d3d8182e | ||
|
|
0da38f5fd2 | ||
|
|
bd4ae16ab7 | ||
|
|
1d2722d409 | ||
|
|
99e2dd1ff4 | ||
|
|
38d6200409 | ||
|
|
e8d42b701e | ||
|
|
0686e9d054 | ||
|
|
b917cb552e | ||
|
|
a1ee157ab8 | ||
|
|
b1befeb32d | ||
|
|
615c0d1545 | ||
|
|
a2e041652d | ||
|
|
76033f53fc | ||
|
|
fa4d4bbd0f | ||
|
|
08a0cdfddd | ||
|
|
56e4488087 | ||
|
|
62b57e453d | ||
|
|
2a1ff2e32b | ||
|
|
8ede3a49ae | ||
|
|
ca75b751a7 | ||
|
|
7ed4f479a9 | ||
|
|
3eeca2fbed | ||
|
|
82fb724bdd | ||
|
|
4360dcdca9 | ||
|
|
bfe87ae090 | ||
|
|
8497924c85 | ||
|
|
52bfbb6dcf | ||
|
|
715a8af0a3 | ||
|
|
86acda9935 | ||
|
|
12a9146d79 | ||
|
|
4ee9e2aa26 | ||
|
|
b65ecddb39 | ||
|
|
1c8b44e3d7 | ||
|
|
bc94560536 | ||
|
|
ae424a2a10 | ||
|
|
5b679c1f35 | ||
|
|
88c4c4ae77 | ||
|
|
e705d2191a | ||
|
|
6a3d11dee1 | ||
|
|
0d802bdeed | ||
|
|
00958164ff | ||
|
|
2fea151089 | ||
|
|
bfa49b4772 | ||
|
|
9596d0f3c3 | ||
|
|
0a3f2bb524 | ||
|
|
38ae5dcd2f | ||
|
|
ea86c8b639 | ||
|
|
ac379763ce | ||
|
|
b694f7640a | ||
|
|
f954043981 | ||
|
|
495bf70d3a | ||
|
|
e1c93cc13a | ||
|
|
ce9c8042e4 | ||
|
|
5d1aa3b024 | ||
|
|
f6286cb5c1 | ||
|
|
2d7b2c05c5 | ||
|
|
9f8542049c | ||
|
|
a26c951dba | ||
|
|
83ca3ee350 | ||
|
|
acdff4ad67 | ||
|
|
708d4c266e | ||
|
|
6160580f08 | ||
|
|
c7363c6434 | ||
|
|
5f04190e6a | ||
|
|
6b908e18de | ||
|
|
4d4230d9f4 | ||
|
|
2e788d1917 | ||
|
|
1f21b573e2 | ||
|
|
a03e6824c5 | ||
|
|
67cdd8bfa6 | ||
|
|
44f6b465d4 | ||
|
|
48220b8fe9 | ||
|
|
51f5d7e07b | ||
|
|
ea3cb6eb80 | ||
|
|
91464d8ec1 | ||
|
|
80c98c60ca | ||
|
|
8d8899f9ac | ||
|
|
001933bac3 | ||
|
|
8445656289 | ||
|
|
e8a8d481aa | ||
|
|
fd1de75a1d | ||
|
|
7f08bfc913 | ||
|
|
377cf23bca | ||
|
|
6f16bc3427 | ||
|
|
a1bb6685d4 | ||
|
|
53e3e603b9 | ||
|
|
827678961c | ||
|
|
17368a0a12 | ||
|
|
9a9387b151 | ||
|
|
7f8d4d94d0 | ||
|
|
df228fca6d | ||
|
|
1ccc2c891e | ||
|
|
35ec5e903e | ||
|
|
f98292a4aa | ||
|
|
6b6604b7a9 | ||
|
|
55eb110373 | ||
|
|
42418fedb8 | ||
|
|
407fc2e948 | ||
|
|
49177da820 | ||
|
|
a1809dccb4 | ||
|
|
7d97bc118e | ||
|
|
48bc41a69e | ||
|
|
e4a8e89135 | ||
|
|
1bd6825258 | ||
|
|
e5099e9a2a | ||
|
|
ccdaa12f20 | ||
|
|
60d387c792 | ||
|
|
d9b4ca815e | ||
|
|
37686044d4 | ||
|
|
ef50098460 | ||
|
|
f2eff3fdb4 | ||
|
|
2749fdc2e9 | ||
|
|
514fe466fd | ||
|
|
c77d394e08 | ||
|
|
b689a54936 | ||
|
|
1046672386 | ||
|
|
0cfcf4f266 | ||
|
|
d86cc44c3b | ||
|
|
26bd0d624e | ||
|
|
841cb2a83b | ||
|
|
b89112bec1 | ||
|
|
5920c7c0f0 | ||
|
|
d23ef01281 | ||
|
|
dab153f1b0 | ||
|
|
c5ad321842 | ||
|
|
c78b305faa | ||
|
|
5853dd6617 | ||
|
|
a67b435565 | ||
|
|
84d8ff410e | ||
|
|
625c870072 | ||
|
|
c475155546 | ||
|
|
1b6669d4ef | ||
|
|
ffbba24b5a | ||
|
|
9bdbb1fbad | ||
|
|
0465a3b9a6 | ||
|
|
a0ef356bac | ||
|
|
e62dd762f4 | ||
|
|
9c4e4c7976 | ||
|
|
486d6db7d8 | ||
|
|
81d9261a73 | ||
|
|
2ace6ef6bc | ||
|
|
cc6d94b188 | ||
|
|
0525f76b6b | ||
|
|
7fa3031cfa | ||
|
|
d34177482e | ||
|
|
345442e195 | ||
|
|
e94e8b60a6 | ||
|
|
4f4c8cba04 | ||
|
|
1be0a3cba9 | ||
|
|
ce513ac086 | ||
|
|
c98cd05a5c | ||
|
|
d68645ccb0 | ||
|
|
9517eaa0b0 | ||
|
|
6b140bf2d7 | ||
|
|
eab0d2b1d7 | ||
|
|
df8a885594 | ||
|
|
5ea79ac94e | ||
|
|
459dc951e9 | ||
|
|
f823abacc1 | ||
|
|
0a38442ac5 | ||
|
|
083a3662e0 | ||
|
|
37e1e50b94 | ||
|
|
f0eeae0432 | ||
|
|
4b663eea62 | ||
|
|
8d2d45b5ce | ||
|
|
62fdd6a572 | ||
|
|
305fe5c372 | ||
|
|
b39afe2f50 | ||
|
|
862610b17d | ||
|
|
43698ba839 | ||
|
|
7bfc82c3cc | ||
|
|
b975ce6a6d | ||
|
|
e83acd5bfa | ||
|
|
2f1592bc62 | ||
|
|
1c609764b8 | ||
|
|
c7464a1e34 | ||
|
|
608a9068b9 | ||
|
|
e006a4616a | ||
|
|
677789bec1 | ||
|
|
0dc589f2ea | ||
|
|
aecb36e937 | ||
|
|
be97fe15da | ||
|
|
2a7311ba50 | ||
|
|
b95c341fca | ||
|
|
469d3b0975 | ||
|
|
bece417bf3 | ||
|
|
75774d128d | ||
|
|
430c819813 | ||
|
|
6c2d8c02c1 | ||
|
|
2d0876486d | ||
|
|
22427b1246 | ||
|
|
3c7495aaa1 | ||
|
|
ef4b0441d3 | ||
|
|
190697d855 | ||
|
|
19e78d649f | ||
|
|
0dad34893e | ||
|
|
1fee896a3d | ||
|
|
b6f0ccbf17 | ||
|
|
f81fe3d01f | ||
|
|
4f5b649b1d | ||
|
|
d0ee05def9 | ||
|
|
dd0a52c1a2 | ||
|
|
76abd05830 | ||
|
|
102535cd04 | ||
|
|
e0e9fc2ce4 | ||
|
|
a657525562 | ||
|
|
10bc39ffea | ||
|
|
2a9f6e253b | ||
|
|
496b70f73f | ||
|
|
0869961622 | ||
|
|
dedcfcbb66 | ||
|
|
19b3c51c25 | ||
|
|
476d661ece | ||
|
|
546cdacc0f | ||
|
|
b4605578ad | ||
|
|
39f25cc9db | ||
|
|
788aa33a3a | ||
|
|
46ecb676c0 | ||
|
|
19c4428dc8 | ||
|
|
25ddb95db5 | ||
|
|
43ff15ff5e | ||
|
|
406e6a912f | ||
|
|
57f1db17c3 | ||
|
|
c9d97e5cae | ||
|
|
f33763ce43 | ||
|
|
5707d12fbe | ||
|
|
8fe586dfec | ||
|
|
696f169ea4 | ||
|
|
efd4f379ee | ||
|
|
aef491855c | ||
|
|
1dd55f5a5f | ||
|
|
7882210eaf | ||
|
|
138628613c | ||
|
|
a192ec3117 | ||
|
|
f9ca609c1e | ||
|
|
b0a21a1c2f | ||
|
|
a4339bf5a4 | ||
|
|
06cc871432 | ||
|
|
45b6a09067 | ||
|
|
2085e14f24 | ||
|
|
912e545678 | ||
|
|
efe8b15763 | ||
|
|
f2cb95af96 | ||
|
|
3bf3ac2cce | ||
|
|
55d8e6f205 | ||
|
|
4ef8e8cf14 | ||
|
|
e581219e32 | ||
|
|
d11e0db14a | ||
|
|
4c5b60bddb | ||
|
|
0b59dbe20d | ||
|
|
279eaaaf62 | ||
|
|
fd3e8d81f8 | ||
|
|
1dfdca0ab4 | ||
|
|
ba5ab18fad | ||
|
|
7caef808b7 | ||
|
|
fd7f708a83 | ||
|
|
966a6c194f | ||
|
|
dea7edaa1f | ||
|
|
75e74aa06b | ||
|
|
b671f4c77e | ||
|
|
26eedb684a | ||
|
|
0705c412fb | ||
|
|
b76178990d | ||
|
|
c2ce9b2249 | ||
|
|
a1465f55ba | ||
|
|
ea4192838d | ||
|
|
b8553bdb7c | ||
|
|
6e741c4d44 | ||
|
|
24d9873af2 | ||
|
|
7e7159e543 | ||
|
|
2cc5631672 | ||
|
|
4fcccfff0b | ||
|
|
531bda5c7f | ||
|
|
04e159c1d1 | ||
|
|
281bfc4147 | ||
|
|
c6e511131b | ||
|
|
88b10f7ae6 | ||
|
|
9286d5bfc4 | ||
|
|
072c13459c | ||
|
|
93d6bf607b | ||
|
|
35effa5e82 | ||
|
|
caf5a6812b | ||
|
|
99c4dc2266 | ||
|
|
1d47a60695 | ||
|
|
cde25c56e2 | ||
|
|
8da86c360c | ||
|
|
53fa0c0865 | ||
|
|
03cebb75ce | ||
|
|
fc8b4120c7 | ||
|
|
5ec96310c6 | ||
|
|
53d92555c8 | ||
|
|
42b94e3a47 | ||
|
|
4b37d68c0e | ||
|
|
b321fc7b76 | ||
|
|
41e9bead0b | ||
|
|
404f5c921b | ||
|
|
acfd82fa82 | ||
|
|
e387a5534b | ||
|
|
adbb76b87c | ||
|
|
230f29d3f8 | ||
|
|
6530856d28 | ||
|
|
5c560ae82f | ||
|
|
30c1b2755e | ||
|
|
49fcb9e394 | ||
|
|
3a3ccb0acd | ||
|
|
ff7a1838aa | ||
|
|
3a03fa31e8 | ||
|
|
f91930930b | ||
|
|
d8671ea73f | ||
|
|
72ec4de912 | ||
|
|
b9bc3bd0f3 | ||
|
|
8f440c3cb9 | ||
|
|
31536e7f97 | ||
|
|
8499338fac | ||
|
|
622749a37f | ||
|
|
bcd7efa911 | ||
|
|
b58b42c496 | ||
|
|
f7a41f08c4 | ||
|
|
7a7ab33fa4 | ||
|
|
dc9d285de0 | ||
|
|
2519fffb58 | ||
|
|
3f4cc0cb26 | ||
|
|
12f8cc1c0c | ||
|
|
bfa1fee522 | ||
|
|
4cd01aa428 | ||
|
|
98c8a42d97 | ||
|
|
2eacaec577 | ||
|
|
dbec871500 | ||
|
|
03bcb5f338 | ||
|
|
dc760caf71 | ||
|
|
361a9caac1 | ||
|
|
e90436081a | ||
|
|
b3821e90d1 | ||
|
|
282c8b2cef | ||
|
|
250f62d79c | ||
|
|
64b5bc8cb8 | ||
|
|
6766574b38 | ||
|
|
0b660966ac | ||
|
|
18c35b103e | ||
|
|
edb4a1f371 | ||
|
|
7a23f141fc | ||
|
|
02c71f709c | ||
|
|
b993419c3d | ||
|
|
ef8a61c3eb | ||
|
|
d2c8da68a5 | ||
|
|
618fa68000 | ||
|
|
64e100f839 | ||
|
|
7991716ee2 | ||
|
|
531c37c752 | ||
|
|
c06184d973 | ||
|
|
806d845750 | ||
|
|
d0e357f4b7 | ||
|
|
15b65fb9a9 | ||
|
|
51dc215504 | ||
|
|
90c4435253 | ||
|
|
44fcbf98f2 | ||
|
|
79253c6b31 | ||
|
|
4d433ebf22 | ||
|
|
671d506b45 | ||
|
|
f57ee74e8c | ||
|
|
1acc018a81 | ||
|
|
0d33354f08 | ||
|
|
d6d0e3cfda | ||
|
|
282ea62f83 | ||
|
|
5608721e3d | ||
|
|
3aca786252 | ||
|
|
5c5d35a72b | ||
|
|
fcdfaca6a8 | ||
|
|
a93ded8c79 | ||
|
|
06edf6c508 | ||
|
|
96adbdb76a | ||
|
|
911bd8daba | ||
|
|
4f6ae386b4 | ||
|
|
2170a79399 | ||
|
|
902a94a82c | ||
|
|
e55a647854 | ||
|
|
ae23eec005 | ||
|
|
c5232ca6b8 | ||
|
|
f75d884986 | ||
|
|
563f690277 | ||
|
|
c7e33b5682 | ||
|
|
91963ea39b | ||
|
|
072618f981 | ||
|
|
7bfc3b35f6 | ||
|
|
204b3a4d4d | ||
|
|
44793f0375 | ||
|
|
6b65db55c1 | ||
|
|
35b5e6dfc5 | ||
|
|
e52b367ef0 | ||
|
|
54d31e128e | ||
|
|
fc9f0dc7f1 | ||
|
|
827315c3cc | ||
|
|
452ea52ae3 | ||
|
|
31418fd469 | ||
|
|
be074b5722 | ||
|
|
20e9ab8cb9 | ||
|
|
65881be81b | ||
|
|
5329d7f931 | ||
|
|
717b9b272c | ||
|
|
b70739ac4c | ||
|
|
101804656a | ||
|
|
4b11145f17 | ||
|
|
2ee1ca974e | ||
|
|
1141ed192d | ||
|
|
08c8cbf7fe | ||
|
|
01bddbf2ff | ||
|
|
33f5881e91 | ||
|
|
37313040e1 | ||
|
|
4102a06497 | ||
|
|
0acec71a7f | ||
|
|
f3d8084d11 | ||
|
|
0e211e02b8 | ||
|
|
894a6a70bb | ||
|
|
2f17734a4c | ||
|
|
c10cf202de | ||
|
|
459587bbb8 | ||
|
|
560e7a0f04 | ||
|
|
0e27928a88 | ||
|
|
c8732aa8cf | ||
|
|
c52e31a785 | ||
|
|
bfa27d589b | ||
|
|
02d12c1f60 | ||
|
|
9ed0390f79 | ||
|
|
80c1a9a46e | ||
|
|
3a5033ba4e | ||
|
|
e1e0527184 | ||
|
|
2ff87d6c4d | ||
|
|
04bbcd1d31 | ||
|
|
1db9e2cc8c | ||
|
|
41d123edf3 | ||
|
|
926e3b7bc8 | ||
|
|
999b3903b7 | ||
|
|
cebca45877 | ||
|
|
31244e4294 | ||
|
|
373f271a91 | ||
|
|
f46386cc28 | ||
|
|
5a75be0a66 | ||
|
|
5782e82eea | ||
|
|
3b2b69de1b | ||
|
|
29a79490ba | ||
|
|
011e82676c | ||
|
|
4edf8921bb | ||
|
|
d53b5470c5 | ||
|
|
ddab940dab | ||
|
|
c81c91aa46 | ||
|
|
b3238ec7b4 | ||
|
|
eec025f5bd | ||
|
|
0d20ddf66a | ||
|
|
d150e03bdd | ||
|
|
158b2fc346 | ||
|
|
e078e6bda7 | ||
|
|
6de70a83f1 | ||
|
|
d370564900 | ||
|
|
23b3ed2416 | ||
|
|
47d1eb9105 | ||
|
|
837e3044f6 | ||
|
|
ad93eb33cd | ||
|
|
da50272980 | ||
|
|
c8f095f0a3 | ||
|
|
42fbd813a2 | ||
|
|
69f5460442 | ||
|
|
b32212083d | ||
|
|
88702f97c6 | ||
|
|
9b759daca1 | ||
|
|
9363e94749 | ||
|
|
6474bfa136 | ||
|
|
43e57ab6d1 | ||
|
|
9d7f5af26e | ||
|
|
3a101d89ea | ||
|
|
703695e768 | ||
|
|
bb3897160b | ||
|
|
3b2ff5eed8 | ||
|
|
9828e79668 | ||
|
|
a231bb75a6 | ||
|
|
fcc2a5db06 | ||
|
|
f0010a7625 | ||
|
|
294f2fd9ec | ||
|
|
4bf1da36e2 | ||
|
|
0facecc682 | ||
|
|
ed627875a0 | ||
|
|
1d00261b1f | ||
|
|
e52259e750 | ||
|
|
661b3ef9f4 | ||
|
|
dc109b3e35 | ||
|
|
1ae93b3ffd | ||
|
|
e0ca3ac2be | ||
|
|
aaf6d0a21a | ||
|
|
0e5052910f | ||
|
|
b335617e37 | ||
|
|
46578cb3e2 | ||
|
|
c45bf44056 | ||
|
|
96a77539a1 | ||
|
|
1873cca375 | ||
|
|
739bd0c312 | ||
|
|
a403a8b81f | ||
|
|
ca27e01f94 | ||
|
|
50d5850097 | ||
|
|
a2ca41d965 | ||
|
|
5272f84507 | ||
|
|
9a324191d8 | ||
|
|
a2157a9654 | ||
|
|
83298bb06a | ||
|
|
f6ef7017a2 | ||
|
|
1418e8f8c6 | ||
|
|
d097cfe51b | ||
|
|
88ea297f16 | ||
|
|
63feaac9bd | ||
|
|
c5f0bff133 | ||
|
|
bcfd90204b | ||
|
|
475be152a7 | ||
|
|
534110cfbf | ||
|
|
cbe96dbed9 | ||
|
|
e2fe8834c5 | ||
|
|
93e542befd | ||
|
|
3852617270 | ||
|
|
d7a04e202b | ||
|
|
abd6ab121e | ||
|
|
0c274015dd | ||
|
|
ffc0f8f58e | ||
|
|
c47f7ba7e3 | ||
|
|
733dbf9bd7 | ||
|
|
58c3c4fac7 | ||
|
|
82ddd40953 | ||
|
|
60702755c1 | ||
|
|
8e05302d78 | ||
|
|
e6fb9cd1eb | ||
|
|
e6904ca91c | ||
|
|
3cc0574487 | ||
|
|
a74a703610 | ||
|
|
e0813354d9 | ||
|
|
96a4af40c9 | ||
|
|
662966d7b4 | ||
|
|
2f3b2adce4 | ||
|
|
8e53c2d804 | ||
|
|
830b83f99f | ||
|
|
e679b68e30 | ||
|
|
2f0e865740 | ||
|
|
a4f1c7ecb5 | ||
|
|
9dd24e1f02 | ||
|
|
a7cab21040 | ||
|
|
9ca5fe7518 | ||
|
|
f8dec30f94 | ||
|
|
4701937fb6 | ||
|
|
dbe4b4cec8 | ||
|
|
e57068cdb6 | ||
|
|
f5e9c4860c | ||
|
|
a050328bb2 | ||
|
|
f0129f7349 | ||
|
|
b3f6d205ea | ||
|
|
4c5849d52c | ||
|
|
c227ea26d1 | ||
|
|
5029f27bc9 | ||
|
|
5e826f4b73 | ||
|
|
39c6f5e5c7 | ||
|
|
085bc97321 | ||
|
|
b1573e99de | ||
|
|
c25901f8c9 | ||
|
|
73918b9294 | ||
|
|
1500f5aabe | ||
|
|
8f52f49884 | ||
|
|
b5251651af | ||
|
|
8716388be4 | ||
|
|
81d9531853 | ||
|
|
1b096de377 | ||
|
|
7afcbaee61 | ||
|
|
daa0427b53 | ||
|
|
dab74e59be | ||
|
|
fd76244add | ||
|
|
bbcf8e5f3b | ||
|
|
b71313248d | ||
|
|
f27b6fadb9 | ||
|
|
113b08a227 | ||
|
|
0f9e6ca901 | ||
|
|
ddf2bd4c64 | ||
|
|
8bda88dd36 | ||
|
|
cb1115b232 | ||
|
|
c62299aef7 | ||
|
|
1632f5888c | ||
|
|
b5e5eebac6 | ||
|
|
c9ce835786 | ||
|
|
bc004a8764 | ||
|
|
27bae27771 | ||
|
|
05377b06fb | ||
|
|
a875880bc3 | ||
|
|
891feecca1 | ||
|
|
c4a64ab3c2 | ||
|
|
1a2ea3e4a3 | ||
|
|
4126df4720 | ||
|
|
003a2aa76d | ||
|
|
687300811e | ||
|
|
f04f5991d4 | ||
|
|
263e792768 | ||
|
|
1cf5aafa03 | ||
|
|
6c32c6154e | ||
|
|
a2ebeab839 | ||
|
|
f565ad9381 | ||
|
|
ab53432197 | ||
|
|
8ecf7ff0db | ||
|
|
d81bcfba9a | ||
|
|
7f87b083cb | ||
|
|
eef5c41dfe | ||
|
|
dd1b15edee | ||
|
|
1a44d28adb | ||
|
|
e218f13d45 | ||
|
|
df92bdac8e | ||
|
|
51ece9daff | ||
|
|
08d6090bc5 | ||
|
|
96cd5cfe81 | ||
|
|
0d854270b6 | ||
|
|
16d5795267 | ||
|
|
c54351f8ee | ||
|
|
5819ac78ec | ||
|
|
ebc50f0caa | ||
|
|
85f28498c4 | ||
|
|
df192895a1 | ||
|
|
e74d8c2497 | ||
|
|
042c94e6cf | ||
|
|
0ed613de73 | ||
|
|
b07e85c4e7 | ||
|
|
3e9b67a1ad | ||
|
|
3b84c0e3db |
59
.github/scripts/GenerateVersionNumber.ps1
vendored
Normal file
59
.github/scripts/GenerateVersionNumber.ps1
vendored
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
$latestVersions = $(git tag --merged origin/main)
|
||||||
|
$latestVersion = [version]"0.0.0"
|
||||||
|
Write-Host "GITHUB_REF: $($Env:GITHUB_REF)"
|
||||||
|
Write-Host "GITHUB_HEAD_REF: $($Env:GITHUB_HEAD_REF)"
|
||||||
|
Write-Host "GITHUB_BASE_REF: $($Env:GITHUB_BASE_REF)"
|
||||||
|
Foreach ($version in $latestVersions) {
|
||||||
|
Write-Host $version
|
||||||
|
try {
|
||||||
|
if (([version]$version) -ge $latestVersion) {
|
||||||
|
$latestVersion = $version
|
||||||
|
Write-Host "Setting latest version to: $latestVersion"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
Write-Host "Unable to convert $($version). Skipping"
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$newVersion = [version]$latestVersion
|
||||||
|
$phase = ""
|
||||||
|
$newVersionString = ""
|
||||||
|
|
||||||
|
switch -regex ($Env:GITHUB_REF) {
|
||||||
|
'^refs\/pull\/*.' {
|
||||||
|
$splitRef = $Env:GITHUB_REF -split "/"
|
||||||
|
$phase = "pr$($splitRef[2])"
|
||||||
|
$newVersionString = "{0}.{1}.{2}-{3}-{4}" -f $newVersion.Major, $newVersion.Minor, ($newVersion.Build + 1), $phase, $Env:GITHUB_RUN_NUMBER
|
||||||
|
}
|
||||||
|
'^refs\/heads\/main*.' {
|
||||||
|
$newVersionString = "{0}.{1}.{2}" -f $newVersion.Major, $newVersion.Minor, $newVersion.Build
|
||||||
|
}
|
||||||
|
'^refs\/heads\/feature\/*.' {
|
||||||
|
$phase = 'alpha'
|
||||||
|
$newVersionString = "{0}.{1}.{2}-{3}-{4}" -f $newVersion.Major, $newVersion.Minor, ($newVersion.Build + 1), $phase, $Env:GITHUB_RUN_NUMBER
|
||||||
|
}
|
||||||
|
'^refs\/heads\/release\/*.' {
|
||||||
|
$splitRef = $Env:GITHUB_REF -split "/"
|
||||||
|
$version = [version]($splitRef[-1] -replace "v", "")
|
||||||
|
$phase = 'rc'
|
||||||
|
$newVersionString = "{0}.{1}.{2}-{3}-{4}" -f $version.Major, $version.Minor, $version.Build, $phase, $Env:GITHUB_RUN_NUMBER
|
||||||
|
}
|
||||||
|
'^refs\/heads\/development*.' {
|
||||||
|
$phase = 'beta'
|
||||||
|
$newVersionString = "{0}.{1}.{2}-{3}-{4}" -f $newVersion.Major, $newVersion.Minor, ($newVersion.Build + 1), $phase, $Env:GITHUB_RUN_NUMBER
|
||||||
|
}
|
||||||
|
'^refs\/heads\/hotfix\/*.' {
|
||||||
|
$phase = 'hotfix'
|
||||||
|
$newVersionString = "{0}.{1}.{2}-{3}-{4}" -f $newVersion.Major, $newVersion.Minor, ($newVersion.Build + 1), $phase, $Env:GITHUB_RUN_NUMBER
|
||||||
|
}
|
||||||
|
'^refs\/heads\/bugfix\/*.' {
|
||||||
|
$phase = 'hotfix'
|
||||||
|
$newVersionString = "{0}.{1}.{2}-{3}-{4}" -f $newVersion.Major, $newVersion.Minor, ($newVersion.Build + 1), $phase, $Env:GITHUB_RUN_NUMBER
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Write-Output $newVersionString
|
||||||
40
.github/scripts/UpdateAssemblyVersion.ps1
vendored
Normal file
40
.github/scripts/UpdateAssemblyVersion.ps1
vendored
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
function Update-SourceVersion {
|
||||||
|
Param ([string]$Version)
|
||||||
|
#$fullVersion = $Version
|
||||||
|
$baseVersion = [regex]::Match($Version, "(\d+.\d+.\d+).*").captures.groups[1].value
|
||||||
|
$NewAssemblyVersion = ‘AssemblyVersion("‘ + $baseVersion + ‘.*")’
|
||||||
|
Write-Output "AssemblyVersion = $NewAssemblyVersion"
|
||||||
|
$NewAssemblyInformationalVersion = ‘AssemblyInformationalVersion("‘ + $Version + ‘")’
|
||||||
|
Write-Output "AssemblyInformationalVersion = $NewAssemblyInformationalVersion"
|
||||||
|
|
||||||
|
foreach ($o in $input) {
|
||||||
|
Write-output $o.FullName
|
||||||
|
$TmpFile = $o.FullName + “.tmp”
|
||||||
|
get-content $o.FullName |
|
||||||
|
ForEach-Object {
|
||||||
|
$_ -replace ‘AssemblyVersion\(".*"\)’, $NewAssemblyVersion } |
|
||||||
|
ForEach-Object {
|
||||||
|
$_ -replace ‘AssemblyInformationalVersion\(".*"\)’, $NewAssemblyInformationalVersion
|
||||||
|
} > $TmpFile
|
||||||
|
move-item $TmpFile $o.FullName -force
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function Update-AllAssemblyInfoFiles ( $version ) {
|
||||||
|
foreach ($file in “AssemblyInfo.cs”, “AssemblyInfo.vb” ) {
|
||||||
|
get-childitem -Path $Env:GITHUB_WORKSPACE -recurse | Where-Object { $_.Name -eq $file } | Update-SourceVersion $version ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# validate arguments
|
||||||
|
$r = [System.Text.RegularExpressions.Regex]::Match($args[0], "\d+\.\d+\.\d+.*");
|
||||||
|
if ($r.Success) {
|
||||||
|
Write-Output "Updating Assembly Version to $args ...";
|
||||||
|
Update-AllAssemblyInfoFiles $args[0];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Write-Output ” “;
|
||||||
|
Write-Output “Error: Input version does not match x.y.z format!”
|
||||||
|
Write-Output ” “;
|
||||||
|
Write-Output "Unable to apply version to AssemblyInfo.cs files";
|
||||||
|
}
|
||||||
44
.github/scripts/ZipBuildOutput.ps1
vendored
Normal file
44
.github/scripts/ZipBuildOutput.ps1
vendored
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
# Uncomment these for local testing
|
||||||
|
# $Env:GITHUB_WORKSPACE = "C:\Working Directories\PD\essentials"
|
||||||
|
# $Env:SOLUTION_FILE = "PepperDashEssentials"
|
||||||
|
# $Env:VERSION = "0.0.0-buildType-test"
|
||||||
|
|
||||||
|
# Sets the root directory for the operation
|
||||||
|
$destination = "$($Env:GITHUB_HOME)\output"
|
||||||
|
New-Item -ItemType Directory -Force -Path ($destination)
|
||||||
|
Get-ChildItem ($destination)
|
||||||
|
$exclusions = @(git submodule foreach --quiet 'echo $name')
|
||||||
|
# Trying to get any .json schema files (not currently working)
|
||||||
|
# Gets any files with the listed extensions.
|
||||||
|
Get-ChildItem -recurse -Path "$($Env:GITHUB_WORKSPACE)" -include "*.clz", "*.cpz", "*.cplz", "*.dll" | ForEach-Object {
|
||||||
|
$allowed = $true;
|
||||||
|
# Exclude any files in submodules
|
||||||
|
foreach ($exclude in $exclusions) {
|
||||||
|
if ((Split-Path $_.FullName -Parent).contains("$($exclude)")) {
|
||||||
|
$allowed = $false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($allowed) {
|
||||||
|
Write-Host "allowing $($_)"
|
||||||
|
$_;
|
||||||
|
}
|
||||||
|
} | Copy-Item -Destination ($destination) -Force
|
||||||
|
Write-Host "Getting matching files..."
|
||||||
|
# Get any files from the output folder that match the following extensions
|
||||||
|
Get-ChildItem -Path $destination | Where-Object { ($_.Extension -eq ".clz") -or ($_.Extension -eq ".cpz" -or ($_.Extension -eq ".cplz")) } | ForEach-Object {
|
||||||
|
# Replace the extensions with dll and xml and create an array
|
||||||
|
# Removed dll file capture, as previous step should capture all of them. Add if needed-> $($_ -replace "cpz|clz|cplz", "dll"),
|
||||||
|
$filenames = @($($_ -replace "cpz|clz|cplz", "xml"))
|
||||||
|
Write-Host "Filenames:"
|
||||||
|
Write-Host $filenames
|
||||||
|
if ($filenames.length -gt 0) {
|
||||||
|
# Attempt to get the files and return them to the output directory
|
||||||
|
Get-ChildItem -Recurse -Path "$($Env:GITHUB_WORKSPACE)" -include $filenames | Copy-Item -Destination ($destination) -Force
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Get-ChildItem -Path $destination\*.cpz | Rename-Item -NewName { "$($_.BaseName)-$($Env:VERSION)$($_.Extension)" }
|
||||||
|
Compress-Archive -Path $destination -DestinationPath "$($Env:GITHUB_WORKSPACE)\$($Env:SOLUTION_FILE)-$($Env:VERSION).zip" -Force
|
||||||
|
Write-Host "Output Contents post Zip"
|
||||||
|
Get-ChildItem -Path $destination
|
||||||
266
.github/workflows/docker.yml
vendored
Normal file
266
.github/workflows/docker.yml
vendored
Normal file
@@ -0,0 +1,266 @@
|
|||||||
|
name: Branch Build Using Docker
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- feature/*
|
||||||
|
- hotfix/*
|
||||||
|
- bugfix/*
|
||||||
|
- release/*
|
||||||
|
- development
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- development
|
||||||
|
|
||||||
|
env:
|
||||||
|
# solution path doesn't need slashes unless there it is multiple folders deep
|
||||||
|
# solution name does not include extension. .sln is assumed
|
||||||
|
SOLUTION_PATH: PepperDashEssentials
|
||||||
|
SOLUTION_FILE: PepperDashEssentials
|
||||||
|
# Do not edit this, we're just creating it here
|
||||||
|
VERSION: 0.0.0-buildtype-buildnumber
|
||||||
|
# Defaults to debug for build type
|
||||||
|
BUILD_TYPE: Debug
|
||||||
|
# Defaults to main as the release branch. Change as necessary
|
||||||
|
RELEASE_BRANCH: main
|
||||||
|
jobs:
|
||||||
|
Build_Project:
|
||||||
|
runs-on: windows-latest
|
||||||
|
steps:
|
||||||
|
# First we checkout the source repo
|
||||||
|
- name: Checkout repo
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
submodules: true
|
||||||
|
# Fetch all tags
|
||||||
|
- name: Fetch tags
|
||||||
|
run: git fetch --tags
|
||||||
|
# Generate the appropriate version number
|
||||||
|
- name: Set Version Number
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
$version = ./.github/scripts/GenerateVersionNumber.ps1
|
||||||
|
Write-Output "::set-env name=VERSION::$version"
|
||||||
|
# Use the version number to set the version of the assemblies
|
||||||
|
- name: Update AssemblyInfo.cs
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
Write-Output ${{ env.VERSION }}
|
||||||
|
./.github/scripts/UpdateAssemblyVersion.ps1 ${{ env.VERSION }}
|
||||||
|
# Login to Docker
|
||||||
|
- name: Login to Docker
|
||||||
|
uses: azure/docker-login@v1
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKER_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKER_TOKEN }}
|
||||||
|
# Build the solutions in the docker image
|
||||||
|
- name: Build Solution
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
Invoke-Expression "docker run --rm --mount type=bind,source=""$($Env:GITHUB_WORKSPACE)"",target=""c:/project"" pepperdash/sspbuilder:v1.4.1 c:\cihelpers\vsidebuild.exe -Solution ""c:\project\$($Env:SOLUTION_FILE).sln"" -BuildSolutionConfiguration $($ENV:BUILD_TYPE)"
|
||||||
|
# Zip up the output files as needed
|
||||||
|
- name: Zip Build Output
|
||||||
|
shell: powershell
|
||||||
|
run: ./.github/scripts/ZipBuildOutput.ps1
|
||||||
|
# Write the version to a file to be consumed by the push jobs
|
||||||
|
- name: Write Version
|
||||||
|
run: Write-Output "$($Env:VERSION)" | Out-File -FilePath "$($Env:GITHUB_HOME)\output\version.txt"
|
||||||
|
# Upload the build output as an artifact
|
||||||
|
- name: Upload Build Output
|
||||||
|
uses: actions/upload-artifact@v1
|
||||||
|
with:
|
||||||
|
name: Build
|
||||||
|
path: ./${{ env.SOLUTION_FILE}}-${{ env.VERSION}}.zip
|
||||||
|
# Upload the Version file as an artifact
|
||||||
|
- name: Upload version.txt
|
||||||
|
uses: actions/upload-artifact@v1
|
||||||
|
with:
|
||||||
|
name: Version
|
||||||
|
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
|
||||||
|
id: create_release
|
||||||
|
# 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
|
||||||
|
with:
|
||||||
|
tag_name: ${{ env.VERSION }}
|
||||||
|
release_name: ${{ env.VERSION }}
|
||||||
|
prerelease: ${{contains('debug', env.BUILD_TYPE)}}
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
# Upload the build package to the release
|
||||||
|
- name: Upload Release Package
|
||||||
|
if: contains(env.VERSION,'-rc-') || contains(env.VERSION,'-hotfix-')
|
||||||
|
id: upload_release
|
||||||
|
uses: actions/upload-release-asset@v1
|
||||||
|
with:
|
||||||
|
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
||||||
|
asset_path: ./${{ env.SOLUTION_FILE}}-${{ env.VERSION}}.zip
|
||||||
|
asset_name: ${{ env.SOLUTION_FILE}}-${{ env.VERSION}}.zip
|
||||||
|
asset_content_type: application/zip
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
# This step always runs and pushes the build to the internal build rep
|
||||||
|
Internal_Push_Output:
|
||||||
|
needs: Build_Project
|
||||||
|
runs-on: windows-latest
|
||||||
|
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
|
||||||
|
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 ./
|
||||||
|
# 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 ./
|
||||||
232
.github/workflows/main.yml
vendored
Normal file
232
.github/workflows/main.yml
vendored
Normal file
@@ -0,0 +1,232 @@
|
|||||||
|
name: main Build using Docker
|
||||||
|
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types:
|
||||||
|
- created
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
env:
|
||||||
|
# solution path doesn't need slashes unless there it is multiple folders deep
|
||||||
|
# solution name does not include extension. .sln is assumed
|
||||||
|
SOLUTION_PATH: PepperDashEssentials
|
||||||
|
SOLUTION_FILE: PepperDashEssentials
|
||||||
|
# Do not edit this, we're just creating it here
|
||||||
|
VERSION: 0.0.0-buildtype-buildnumber
|
||||||
|
# Defaults to debug for build type
|
||||||
|
BUILD_TYPE: Release
|
||||||
|
# Defaults to main as the release branch. Change as necessary
|
||||||
|
RELEASE_BRANCH: main
|
||||||
|
jobs:
|
||||||
|
Build_Project:
|
||||||
|
runs-on: windows-latest
|
||||||
|
steps:
|
||||||
|
# First we checkout the source repo
|
||||||
|
- name: Checkout repo
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
# And any submodules
|
||||||
|
- name: Checkout submodules
|
||||||
|
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
|
||||||
|
- name: Set Version Number
|
||||||
|
shell: powershell
|
||||||
|
env:
|
||||||
|
TAG_NAME: ${{ github.event.release.tag_name }}
|
||||||
|
run: Write-Output "::set-env name=VERSION::$($Env:TAG_NAME)"
|
||||||
|
# Use the version number to set the version of the assemblies
|
||||||
|
- name: Update AssemblyInfo.cs
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
Write-Output ${{ env.VERSION }}
|
||||||
|
./.github/scripts/UpdateAssemblyVersion.ps1 ${{ env.VERSION }}
|
||||||
|
# Login to Docker
|
||||||
|
- name: Login to Docker
|
||||||
|
uses: azure/docker-login@v1
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKER_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKER_TOKEN }}
|
||||||
|
# Build the solutions in the docker image
|
||||||
|
- name: Build Solution
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
Invoke-Expression "docker run --rm --mount type=bind,source=""$($Env:GITHUB_WORKSPACE)"",target=""c:/project"" pepperdash/sspbuilder c:\cihelpers\vsidebuild.exe -Solution ""c:\project\$($Env:SOLUTION_FILE).sln"" -BuildSolutionConfiguration $($ENV:BUILD_TYPE)"
|
||||||
|
# Zip up the output files as needed
|
||||||
|
- name: Zip Build Output
|
||||||
|
shell: powershell
|
||||||
|
run: ./.github/scripts/ZipBuildOutput.ps1
|
||||||
|
# Write the version to a file to be consumed by the push jobs
|
||||||
|
- name: Write Version
|
||||||
|
run: Write-Output "$($Env:VERSION)" | Out-File -FilePath "$($Env:GITHUB_HOME)\output\version.txt"
|
||||||
|
# Upload the build output as an artifact
|
||||||
|
- name: Upload Build Output
|
||||||
|
uses: actions/upload-artifact@v1
|
||||||
|
with:
|
||||||
|
name: Build
|
||||||
|
path: ./${{ env.SOLUTION_FILE}}-${{ env.VERSION}}.zip
|
||||||
|
# Upload the Version file as an artifact
|
||||||
|
- name: Upload version.txt
|
||||||
|
uses: actions/upload-artifact@v1
|
||||||
|
with:
|
||||||
|
name: Version
|
||||||
|
path: ${{env.GITHUB_HOME}}\output\version.txt
|
||||||
|
# Upload the build package to the release
|
||||||
|
- name: Upload Release Package
|
||||||
|
id: upload_release
|
||||||
|
uses: actions/upload-release-asset@v1
|
||||||
|
with:
|
||||||
|
upload_url: ${{ github.event.release.upload_url }}
|
||||||
|
asset_path: ./${{ env.SOLUTION_FILE}}-${{ env.VERSION}}.zip
|
||||||
|
asset_name: ${{ env.SOLUTION_FILE}}-${{ env.VERSION}}.zip
|
||||||
|
asset_content_type: application/zip
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
Internal_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-Engineering/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: Checkout main 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 ./
|
||||||
|
# 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 ./
|
||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -22,3 +22,6 @@ _ReSharper*/
|
|||||||
SIMPLSharpLogs/
|
SIMPLSharpLogs/
|
||||||
*.projectinfo
|
*.projectinfo
|
||||||
essentials-framework/EssentialDMTestConfig/
|
essentials-framework/EssentialDMTestConfig/
|
||||||
|
output/
|
||||||
|
|
||||||
|
PepperDashEssentials-0.0.0-buildType-test.zip
|
||||||
|
|||||||
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -1,3 +1,6 @@
|
|||||||
[submodule "essentials-framework/pepperdashcore-builds"]
|
[submodule "essentials-framework/pepperdashcore-builds"]
|
||||||
path = essentials-framework/pepperdashcore-builds
|
path = essentials-framework/pepperdashcore-builds
|
||||||
url = https://github.com/ndorin/PepperDashCore-Builds.git
|
url = https://github.com/ndorin/PepperDashCore-Builds.git
|
||||||
|
[submodule "Essentials-Template-UI"]
|
||||||
|
path = Essentials-Template-UI
|
||||||
|
url = https://github.com/PepperDash/Essentials-Template-UI.git
|
||||||
|
|||||||
1
Essentials-Template-UI
Submodule
1
Essentials-Template-UI
Submodule
Submodule Essentials-Template-UI added at 8eaf88791b
@@ -1,21 +1,21 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 10.00
|
Microsoft Visual Studio Solution File, Format Version 10.00
|
||||||
# Visual Studio 2008
|
# Visual Studio 2008
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PepperDashEssentials", ".\PepperDashEssentials\PepperDashEssentials.csproj", "{1BED5BA9-88C4-4365-9362-6F4B128071D3}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PepperDashEssentials", "PepperDashEssentials\PepperDashEssentials.csproj", "{1BED5BA9-88C4-4365-9362-6F4B128071D3}"
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
{892B761C-E479-44CE-BD74-243E9214AF13} = {892B761C-E479-44CE-BD74-243E9214AF13}
|
{892B761C-E479-44CE-BD74-243E9214AF13} = {892B761C-E479-44CE-BD74-243E9214AF13}
|
||||||
{9199CE8A-0C9F-4952-8672-3EED798B284F} = {9199CE8A-0C9F-4952-8672-3EED798B284F}
|
{9199CE8A-0C9F-4952-8672-3EED798B284F} = {9199CE8A-0C9F-4952-8672-3EED798B284F}
|
||||||
{A49AD6C8-FC0A-4CC0-9089-DFB4CF92D2B5} = {A49AD6C8-FC0A-4CC0-9089-DFB4CF92D2B5}
|
{A49AD6C8-FC0A-4CC0-9089-DFB4CF92D2B5} = {A49AD6C8-FC0A-4CC0-9089-DFB4CF92D2B5}
|
||||||
EndProjectSection
|
EndProjectSection
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PepperDash_Essentials_Core", ".\essentials-framework\Essentials Core\PepperDashEssentialsBase\PepperDash_Essentials_Core.csproj", "{A49AD6C8-FC0A-4CC0-9089-DFB4CF92D2B5}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PepperDash_Essentials_Core", "essentials-framework\Essentials Core\PepperDashEssentialsBase\PepperDash_Essentials_Core.csproj", "{A49AD6C8-FC0A-4CC0-9089-DFB4CF92D2B5}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Essentials Devices Common", ".\essentials-framework\Essentials Devices Common\Essentials Devices Common\Essentials Devices Common.csproj", "{892B761C-E479-44CE-BD74-243E9214AF13}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Essentials Devices Common", "essentials-framework\Essentials Devices Common\Essentials Devices Common\Essentials Devices Common.csproj", "{892B761C-E479-44CE-BD74-243E9214AF13}"
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
{A49AD6C8-FC0A-4CC0-9089-DFB4CF92D2B5} = {A49AD6C8-FC0A-4CC0-9089-DFB4CF92D2B5}
|
{A49AD6C8-FC0A-4CC0-9089-DFB4CF92D2B5} = {A49AD6C8-FC0A-4CC0-9089-DFB4CF92D2B5}
|
||||||
EndProjectSection
|
EndProjectSection
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Essentials_DM", ".\essentials-framework\Essentials DM\Essentials_DM\Essentials_DM.csproj", "{9199CE8A-0C9F-4952-8672-3EED798B284F}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PepperDash_Essentials_DM", "essentials-framework\Essentials DM\Essentials_DM\PepperDash_Essentials_DM.csproj", "{9199CE8A-0C9F-4952-8672-3EED798B284F}"
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
{A49AD6C8-FC0A-4CC0-9089-DFB4CF92D2B5} = {A49AD6C8-FC0A-4CC0-9089-DFB4CF92D2B5}
|
{A49AD6C8-FC0A-4CC0-9089-DFB4CF92D2B5} = {A49AD6C8-FC0A-4CC0-9089-DFB4CF92D2B5}
|
||||||
EndProjectSection
|
EndProjectSection
|
||||||
|
|||||||
@@ -1,37 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Core;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Room.MobileControl
|
|
||||||
{
|
|
||||||
public static class IChannelExtensions
|
|
||||||
{
|
|
||||||
public static void LinkActions(this IChannel dev, MobileControlSystemController controller)
|
|
||||||
{
|
|
||||||
var prefix = string.Format(@"/device/{0}/", (dev as IKeyed).Key);
|
|
||||||
|
|
||||||
controller.AddAction(prefix + "chanUp", new PressAndHoldAction(dev.ChannelUp));
|
|
||||||
controller.AddAction(prefix + "chanDown", new PressAndHoldAction(dev.ChannelDown));
|
|
||||||
controller.AddAction(prefix + "lastChan", new PressAndHoldAction(dev.LastChannel));
|
|
||||||
controller.AddAction(prefix + "guide", new PressAndHoldAction(dev.Guide));
|
|
||||||
controller.AddAction(prefix + "info", new PressAndHoldAction(dev.Info));
|
|
||||||
controller.AddAction(prefix + "exit", new PressAndHoldAction(dev.Exit));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void UnlinkActions(this IChannel dev, MobileControlSystemController controller)
|
|
||||||
{
|
|
||||||
var prefix = string.Format(@"/device/{0}/", (dev as IKeyed).Key);
|
|
||||||
|
|
||||||
controller.RemoveAction(prefix + "chanUp");
|
|
||||||
controller.RemoveAction(prefix + "chanDown");
|
|
||||||
controller.RemoveAction(prefix + "lastChan");
|
|
||||||
controller.RemoveAction(prefix + "guide");
|
|
||||||
controller.RemoveAction(prefix + "info");
|
|
||||||
controller.RemoveAction(prefix + "exit");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Core;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Room.MobileControl
|
|
||||||
{
|
|
||||||
public static class IColorExtensions
|
|
||||||
{
|
|
||||||
public static void LinkActions(this IColor dev, MobileControlSystemController controller)
|
|
||||||
{
|
|
||||||
var prefix = string.Format(@"/device/{0}/", (dev as IKeyed).Key);
|
|
||||||
|
|
||||||
controller.AddAction(prefix + "red", new PressAndHoldAction(dev.Red));
|
|
||||||
controller.AddAction(prefix + "green", new PressAndHoldAction(dev.Green));
|
|
||||||
controller.AddAction(prefix + "yellow", new PressAndHoldAction(dev.Yellow));
|
|
||||||
controller.AddAction(prefix + "blue", new PressAndHoldAction(dev.Blue));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void UnlinkActions(this IColor dev, MobileControlSystemController controller)
|
|
||||||
{
|
|
||||||
var prefix = string.Format(@"/device/{0}/", (dev as IKeyed).Key);
|
|
||||||
|
|
||||||
controller.RemoveAction(prefix + "red");
|
|
||||||
controller.RemoveAction(prefix + "green");
|
|
||||||
controller.RemoveAction(prefix + "yellow");
|
|
||||||
controller.RemoveAction(prefix + "blue");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Core;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Room.MobileControl
|
|
||||||
{
|
|
||||||
public static class IDPadExtensions
|
|
||||||
{
|
|
||||||
public static void LinkActions(this IDPad dev, MobileControlSystemController controller)
|
|
||||||
{
|
|
||||||
var prefix = string.Format(@"/device/{0}/", (dev as IKeyed).Key);
|
|
||||||
|
|
||||||
controller.AddAction(prefix + "up", new PressAndHoldAction(dev.Up));
|
|
||||||
controller.AddAction(prefix + "down", new PressAndHoldAction(dev.Down));
|
|
||||||
controller.AddAction(prefix + "left", new PressAndHoldAction(dev.Left));
|
|
||||||
controller.AddAction(prefix + "right", new PressAndHoldAction(dev.Right));
|
|
||||||
controller.AddAction(prefix + "select", new PressAndHoldAction(dev.Select));
|
|
||||||
controller.AddAction(prefix + "menu", new PressAndHoldAction(dev.Menu));
|
|
||||||
controller.AddAction(prefix + "exit", new PressAndHoldAction(dev.Exit));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void UnlinkActions(this IDPad dev, MobileControlSystemController controller)
|
|
||||||
{
|
|
||||||
var prefix = string.Format(@"/device/{0}/", (dev as IKeyed).Key);
|
|
||||||
|
|
||||||
controller.RemoveAction(prefix + "up");
|
|
||||||
controller.RemoveAction(prefix + "down");
|
|
||||||
controller.RemoveAction(prefix + "left");
|
|
||||||
controller.RemoveAction(prefix + "right");
|
|
||||||
controller.RemoveAction(prefix + "select");
|
|
||||||
controller.RemoveAction(prefix + "menu");
|
|
||||||
controller.RemoveAction(prefix + "exit");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Core;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Room.MobileControl
|
|
||||||
{
|
|
||||||
public static class IDvrExtensions
|
|
||||||
{
|
|
||||||
public static void LinkActions(this IDvr dev, MobileControlSystemController controller)
|
|
||||||
{
|
|
||||||
var prefix = string.Format(@"/device/{0}/", (dev as IKeyed).Key);
|
|
||||||
|
|
||||||
controller.AddAction(prefix + "dvrlist", new PressAndHoldAction(dev.DvrList));
|
|
||||||
controller.AddAction(prefix + "record", new PressAndHoldAction(dev.Record));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void UnlinkActions(this IDvr dev, MobileControlSystemController controller)
|
|
||||||
{
|
|
||||||
var prefix = string.Format(@"/device/{0}/", (dev as IKeyed).Key);
|
|
||||||
|
|
||||||
controller.RemoveAction(prefix + "dvrlist");
|
|
||||||
controller.RemoveAction(prefix + "record");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Core;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Room.MobileControl
|
|
||||||
{
|
|
||||||
public static class INumericExtensions
|
|
||||||
{
|
|
||||||
public static void LinkActions(this INumericKeypad dev, MobileControlSystemController controller)
|
|
||||||
{
|
|
||||||
var prefix = string.Format(@"/device/{0}/", (dev as IKeyed).Key);
|
|
||||||
|
|
||||||
controller.AddAction(prefix + "num0", new PressAndHoldAction(dev.Digit0));
|
|
||||||
controller.AddAction(prefix + "num1", new PressAndHoldAction(dev.Digit1));
|
|
||||||
controller.AddAction(prefix + "num2", new PressAndHoldAction(dev.Digit2));
|
|
||||||
controller.AddAction(prefix + "num3", new PressAndHoldAction(dev.Digit3));
|
|
||||||
controller.AddAction(prefix + "num4", new PressAndHoldAction(dev.Digit4));
|
|
||||||
controller.AddAction(prefix + "num5", new PressAndHoldAction(dev.Digit5));
|
|
||||||
controller.AddAction(prefix + "num6", new PressAndHoldAction(dev.Digit6));
|
|
||||||
controller.AddAction(prefix + "num7", new PressAndHoldAction(dev.Digit0));
|
|
||||||
controller.AddAction(prefix + "num8", new PressAndHoldAction(dev.Digit0));
|
|
||||||
controller.AddAction(prefix + "num9", new PressAndHoldAction(dev.Digit0));
|
|
||||||
controller.AddAction(prefix + "numDash", new PressAndHoldAction(dev.KeypadAccessoryButton1));
|
|
||||||
controller.AddAction(prefix + "numEnter", new PressAndHoldAction(dev.KeypadAccessoryButton2));
|
|
||||||
// Deal with the Accessory functions on the numpad later
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void UnlinkActions(this INumericKeypad dev, MobileControlSystemController controller)
|
|
||||||
{
|
|
||||||
var prefix = string.Format(@"/device/{0}/", (dev as IKeyed).Key);
|
|
||||||
|
|
||||||
controller.RemoveAction(prefix + "num0");
|
|
||||||
controller.RemoveAction(prefix + "num1");
|
|
||||||
controller.RemoveAction(prefix + "num2");
|
|
||||||
controller.RemoveAction(prefix + "num3");
|
|
||||||
controller.RemoveAction(prefix + "num4");
|
|
||||||
controller.RemoveAction(prefix + "num5");
|
|
||||||
controller.RemoveAction(prefix + "num6");
|
|
||||||
controller.RemoveAction(prefix + "num7");
|
|
||||||
controller.RemoveAction(prefix + "num8");
|
|
||||||
controller.RemoveAction(prefix + "num9");
|
|
||||||
controller.RemoveAction(prefix + "numDash");
|
|
||||||
controller.RemoveAction(prefix + "numEnter");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Core;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Room.MobileControl
|
|
||||||
{
|
|
||||||
public static class IPowerExtensions
|
|
||||||
{
|
|
||||||
public static void LinkActions(this IPower dev, MobileControlSystemController controller)
|
|
||||||
{
|
|
||||||
var prefix = string.Format(@"/device/{0}/", (dev as IKeyed).Key);
|
|
||||||
|
|
||||||
controller.AddAction(prefix + "powerOn", new Action(dev.PowerOn));
|
|
||||||
controller.AddAction(prefix + "powerOff", new Action(dev.PowerOff));
|
|
||||||
controller.AddAction(prefix + "powerToggle", new Action(dev.PowerToggle));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void UnlinkActions(this IPower dev, MobileControlSystemController controller)
|
|
||||||
{
|
|
||||||
var prefix = string.Format(@"/device/{0}/", (dev as IKeyed).Key);
|
|
||||||
|
|
||||||
controller.RemoveAction(prefix + "powerOn");
|
|
||||||
controller.RemoveAction(prefix + "powerOff");
|
|
||||||
controller.RemoveAction(prefix + "powerToggle");
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Core;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Room.MobileControl
|
|
||||||
{
|
|
||||||
public static class ISetTopBoxControlsExtensions
|
|
||||||
{
|
|
||||||
public static void LinkActions(this ISetTopBoxControls dev, MobileControlSystemController controller)
|
|
||||||
{
|
|
||||||
var prefix = string.Format(@"/device/{0}/", (dev as IKeyed).Key);
|
|
||||||
|
|
||||||
controller.AddAction(prefix + "dvrList", new PressAndHoldAction(dev.DvrList));
|
|
||||||
controller.AddAction(prefix + "replay", new PressAndHoldAction(dev.Replay));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void UnlinkActions(this ISetTopBoxControls dev, MobileControlSystemController controller)
|
|
||||||
{
|
|
||||||
var prefix = string.Format(@"/device/{0}/", (dev as IKeyed).Key);
|
|
||||||
|
|
||||||
controller.RemoveAction(prefix + "dvrList");
|
|
||||||
controller.RemoveAction(prefix + "replay");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Core;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Room.MobileControl
|
|
||||||
{
|
|
||||||
public static class ITransportExtensions
|
|
||||||
{
|
|
||||||
public static void LinkActions(this ITransport dev, MobileControlSystemController controller)
|
|
||||||
{
|
|
||||||
var prefix = string.Format(@"/device/{0}/", (dev as IKeyed).Key);
|
|
||||||
|
|
||||||
controller.AddAction(prefix + "play", new PressAndHoldAction(dev.Play));
|
|
||||||
controller.AddAction(prefix + "pause", new PressAndHoldAction(dev.Pause));
|
|
||||||
controller.AddAction(prefix + "stop", new PressAndHoldAction(dev.Stop));
|
|
||||||
controller.AddAction(prefix + "prevTrack", new PressAndHoldAction(dev.ChapPlus));
|
|
||||||
controller.AddAction(prefix + "nextTrack", new PressAndHoldAction(dev.ChapMinus));
|
|
||||||
controller.AddAction(prefix + "rewind", new PressAndHoldAction(dev.Rewind));
|
|
||||||
controller.AddAction(prefix + "ffwd", new PressAndHoldAction(dev.FFwd));
|
|
||||||
controller.AddAction(prefix + "record", new PressAndHoldAction(dev.Record));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void UnlinkActions(this ITransport dev, MobileControlSystemController controller)
|
|
||||||
{
|
|
||||||
var prefix = string.Format(@"/device/{0}/", (dev as IKeyed).Key);
|
|
||||||
|
|
||||||
controller.RemoveAction(prefix + "play");
|
|
||||||
controller.RemoveAction(prefix + "pause");
|
|
||||||
controller.RemoveAction(prefix + "stop");
|
|
||||||
controller.RemoveAction(prefix + "prevTrack");
|
|
||||||
controller.RemoveAction(prefix + "nextTrack");
|
|
||||||
controller.RemoveAction(prefix + "rewind");
|
|
||||||
controller.RemoveAction(prefix + "ffwd");
|
|
||||||
controller.RemoveAction(prefix + "record");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Room.MobileControl
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Represents a room whose configuration is derived from runtime data,
|
|
||||||
/// perhaps from another program, and that the data may not be fully
|
|
||||||
/// available at startup.
|
|
||||||
/// </summary>
|
|
||||||
public interface IDelayedConfiguration
|
|
||||||
{
|
|
||||||
event EventHandler<EventArgs> ConfigurationIsReady;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,102 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using Newtonsoft.Json.Linq;
|
|
||||||
|
|
||||||
using PepperDash.Essentials.Devices.Common.Codec;
|
|
||||||
using PepperDash.Essentials.Devices.Common.AudioCodec;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Provides a messaging bridge for an AudioCodecBase device
|
|
||||||
/// </summary>
|
|
||||||
public class AudioCodecBaseMessenger : MessengerBase
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Device being bridged
|
|
||||||
/// </summary>
|
|
||||||
public AudioCodecBase Codec { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Constuctor
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="key"></param>
|
|
||||||
/// <param name="codec"></param>
|
|
||||||
/// <param name="messagePath"></param>
|
|
||||||
public AudioCodecBaseMessenger(string key, AudioCodecBase codec, string messagePath)
|
|
||||||
: base(key, messagePath)
|
|
||||||
{
|
|
||||||
if (codec == null)
|
|
||||||
throw new ArgumentNullException("codec");
|
|
||||||
|
|
||||||
Codec = codec;
|
|
||||||
codec.CallStatusChange += new EventHandler<CodecCallStatusItemChangeEventArgs>(codec_CallStatusChange);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void CustomRegisterWithAppServer(MobileControlSystemController appServerController)
|
|
||||||
{
|
|
||||||
appServerController.AddAction(MessagePath + "/fullStatus", new Action(SendAtcFullMessageObject));
|
|
||||||
appServerController.AddAction(MessagePath + "/dial", new Action<string>(s => Codec.Dial(s)));
|
|
||||||
appServerController.AddAction(MessagePath + "/endCallById", new Action<string>(s =>
|
|
||||||
{
|
|
||||||
var call = GetCallWithId(s);
|
|
||||||
if (call != null)
|
|
||||||
Codec.EndCall(call);
|
|
||||||
}));
|
|
||||||
appServerController.AddAction(MessagePath + "/endAllCalls", new Action(Codec.EndAllCalls));
|
|
||||||
appServerController.AddAction(MessagePath + "/dtmf", new Action<string>(s => Codec.SendDtmf(s)));
|
|
||||||
appServerController.AddAction(MessagePath + "/rejectById", new Action<string>(s =>
|
|
||||||
{
|
|
||||||
var call = GetCallWithId(s);
|
|
||||||
if (call != null)
|
|
||||||
Codec.RejectCall(call);
|
|
||||||
}));
|
|
||||||
appServerController.AddAction(MessagePath + "/acceptById", new Action<string>(s =>
|
|
||||||
{
|
|
||||||
var call = GetCallWithId(s);
|
|
||||||
if (call != null)
|
|
||||||
Codec.AcceptCall(call);
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Helper to grab a call with string ID
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="id"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
CodecActiveCallItem GetCallWithId(string id)
|
|
||||||
{
|
|
||||||
return Codec.ActiveCalls.FirstOrDefault(c => c.Id == id);
|
|
||||||
}
|
|
||||||
|
|
||||||
void codec_CallStatusChange(object sender, CodecCallStatusItemChangeEventArgs e)
|
|
||||||
{
|
|
||||||
SendAtcFullMessageObject();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Helper method to build call status for vtc
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
void SendAtcFullMessageObject()
|
|
||||||
{
|
|
||||||
|
|
||||||
var info = Codec.CodecInfo;
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
isInCall = Codec.IsInCall,
|
|
||||||
calls = Codec.ActiveCalls,
|
|
||||||
info = new
|
|
||||||
{
|
|
||||||
phoneNumber = info.PhoneNumber
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core.Config;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
|
||||||
{
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles interactions with the app server to update the config
|
|
||||||
/// </summary>
|
|
||||||
public class ConfigMessenger : MessengerBase
|
|
||||||
{
|
|
||||||
public ConfigMessenger(string key, string messagePath)
|
|
||||||
: base(key, messagePath)
|
|
||||||
{
|
|
||||||
ConfigUpdater.ConfigStatusChanged -= ConfigUpdater_ConfigStatusChanged;
|
|
||||||
ConfigUpdater.ConfigStatusChanged += new EventHandler<ConfigStatusEventArgs>(ConfigUpdater_ConfigStatusChanged);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConfigUpdater_ConfigStatusChanged(object sender, ConfigStatusEventArgs e)
|
|
||||||
{
|
|
||||||
PostUpdateStatus(e.UpdateStatus.ToString());
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void CustomRegisterWithAppServer(MobileControlSystemController appServerController)
|
|
||||||
{
|
|
||||||
appServerController.AddAction(MessagePath + "/updateConfig", new Action<string>(s => GetConfigFile(s)));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Generates or passes the URL to make the request to GET the config from a server
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="url"></param>
|
|
||||||
void GetConfigFile(string url)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// Attempt to parse the URL
|
|
||||||
var parser = new Crestron.SimplSharp.Net.Http.UrlParser(url);
|
|
||||||
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Successfully parsed URL from AppServer message: {0}", parser.Url);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
// If unable to parse the URL, generate it from config data
|
|
||||||
Debug.Console(2, "Error parsing URL: {0}", e);
|
|
||||||
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Unable to parse URL from AppServer message. Generating URL from config data");
|
|
||||||
url = string.Format("http://{0}/api/system/{1}/config", AppServerController.Config.ServerUrl, AppServerController.SystemUuid);
|
|
||||||
}
|
|
||||||
|
|
||||||
ConfigUpdater.GetConfigFromServer(url);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Posts a message with the current status of the config update
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="status"></param>
|
|
||||||
void PostUpdateStatus(string status)
|
|
||||||
{
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
updateStatus = status
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,216 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using Crestron.SimplSharpPro.EthernetCommunication;
|
|
||||||
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Devices.Common.Codec;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
|
||||||
{
|
|
||||||
public class Ddvc01AtcMessenger : MessengerBase
|
|
||||||
{
|
|
||||||
BasicTriList EISC;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 221
|
|
||||||
/// </summary>
|
|
||||||
const uint BDialHangupOnHook = 221;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 251
|
|
||||||
/// </summary>
|
|
||||||
const uint BIncomingAnswer = 251;
|
|
||||||
/// <summary>
|
|
||||||
/// 252
|
|
||||||
/// </summary>
|
|
||||||
const uint BIncomingReject = 252;
|
|
||||||
/// <summary>
|
|
||||||
/// 241
|
|
||||||
/// </summary>
|
|
||||||
const uint BSpeedDial1 = 241;
|
|
||||||
/// <summary>
|
|
||||||
/// 242
|
|
||||||
/// </summary>
|
|
||||||
const uint BSpeedDial2 = 242;
|
|
||||||
/// <summary>
|
|
||||||
/// 243
|
|
||||||
/// </summary>
|
|
||||||
const uint BSpeedDial3 = 243;
|
|
||||||
/// <summary>
|
|
||||||
/// 244
|
|
||||||
/// </summary>
|
|
||||||
const uint BSpeedDial4 = 244;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 201
|
|
||||||
/// </summary>
|
|
||||||
const uint SCurrentDialString = 201;
|
|
||||||
/// <summary>
|
|
||||||
/// 211
|
|
||||||
/// </summary>
|
|
||||||
const uint SCurrentCallNumber = 211;
|
|
||||||
/// <summary>
|
|
||||||
/// 212
|
|
||||||
/// </summary>
|
|
||||||
const uint SCurrentCallName = 212;
|
|
||||||
/// <summary>
|
|
||||||
/// 221
|
|
||||||
/// </summary>
|
|
||||||
const uint SHookState = 221;
|
|
||||||
/// <summary>
|
|
||||||
/// 222
|
|
||||||
/// </summary>
|
|
||||||
const uint SCallDirection = 222;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 201-212 0-9*#
|
|
||||||
/// </summary>
|
|
||||||
Dictionary<string, uint> DTMFMap = new Dictionary<string, uint>
|
|
||||||
{
|
|
||||||
{ "1", 201 },
|
|
||||||
{ "2", 202 },
|
|
||||||
{ "3", 203 },
|
|
||||||
{ "4", 204 },
|
|
||||||
{ "5", 205 },
|
|
||||||
{ "6", 206 },
|
|
||||||
{ "7", 207 },
|
|
||||||
{ "8", 208 },
|
|
||||||
{ "9", 209 },
|
|
||||||
{ "0", 210 },
|
|
||||||
{ "*", 211 },
|
|
||||||
{ "#", 212 },
|
|
||||||
};
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
CodecActiveCallItem CurrentCallItem;
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="eisc"></param>
|
|
||||||
/// <param name="messagePath"></param>
|
|
||||||
public Ddvc01AtcMessenger(string key, BasicTriList eisc, string messagePath)
|
|
||||||
: base(key, messagePath)
|
|
||||||
{
|
|
||||||
EISC = eisc;
|
|
||||||
|
|
||||||
CurrentCallItem = new CodecActiveCallItem();
|
|
||||||
CurrentCallItem.Type = eCodecCallType.Audio;
|
|
||||||
CurrentCallItem.Id = "-audio-";
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
void SendFullStatus()
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
this.PostStatusMessage(new
|
|
||||||
{
|
|
||||||
calls = GetCurrentCallList(),
|
|
||||||
currentCallString = EISC.GetString(SCurrentCallNumber),
|
|
||||||
currentDialString = EISC.GetString(SCurrentDialString),
|
|
||||||
isInCall = EISC.GetString(SHookState) == "Connected"
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="appServerController"></param>
|
|
||||||
protected override void CustomRegisterWithAppServer(MobileControlSystemController appServerController)
|
|
||||||
{
|
|
||||||
//EISC.SetStringSigAction(SCurrentDialString, s => PostStatusMessage(new { currentDialString = s }));
|
|
||||||
|
|
||||||
EISC.SetStringSigAction(SHookState, s =>
|
|
||||||
{
|
|
||||||
CurrentCallItem.Status = (eCodecCallStatus)Enum.Parse(typeof(eCodecCallStatus), s, true);
|
|
||||||
//GetCurrentCallList();
|
|
||||||
SendFullStatus();
|
|
||||||
});
|
|
||||||
|
|
||||||
EISC.SetStringSigAction(SCurrentCallNumber, s =>
|
|
||||||
{
|
|
||||||
CurrentCallItem.Number = s;
|
|
||||||
SendCallsList();
|
|
||||||
});
|
|
||||||
|
|
||||||
EISC.SetStringSigAction(SCurrentCallName, s =>
|
|
||||||
{
|
|
||||||
CurrentCallItem.Name = s;
|
|
||||||
SendCallsList();
|
|
||||||
});
|
|
||||||
|
|
||||||
EISC.SetStringSigAction(SCallDirection, s =>
|
|
||||||
{
|
|
||||||
CurrentCallItem.Direction = (eCodecCallDirection)Enum.Parse(typeof(eCodecCallDirection), s, true);
|
|
||||||
SendCallsList();
|
|
||||||
});
|
|
||||||
|
|
||||||
// Add press and holds using helper
|
|
||||||
Action<string, uint> addPHAction = (s, u) =>
|
|
||||||
AppServerController.AddAction(MessagePath + s, new PressAndHoldAction(b => EISC.SetBool(u, b)));
|
|
||||||
|
|
||||||
// Add straight pulse calls
|
|
||||||
Action<string, uint> addAction = (s, u) =>
|
|
||||||
AppServerController.AddAction(MessagePath + s, new Action(() => EISC.PulseBool(u, 100)));
|
|
||||||
addAction("/endCallById", BDialHangupOnHook);
|
|
||||||
addAction("/endAllCalls", BDialHangupOnHook);
|
|
||||||
addAction("/acceptById", BIncomingAnswer);
|
|
||||||
addAction("/rejectById", BIncomingReject);
|
|
||||||
addAction("/speedDial1", BSpeedDial1);
|
|
||||||
addAction("/speedDial2", BSpeedDial2);
|
|
||||||
addAction("/speedDial3", BSpeedDial3);
|
|
||||||
addAction("/speedDial4", BSpeedDial4);
|
|
||||||
|
|
||||||
// Get status
|
|
||||||
AppServerController.AddAction(MessagePath + "/fullStatus", new Action(SendFullStatus));
|
|
||||||
// Dial on string
|
|
||||||
AppServerController.AddAction(MessagePath + "/dial", new Action<string>(s => EISC.SetString(SCurrentDialString, s)));
|
|
||||||
// Pulse DTMF
|
|
||||||
AppServerController.AddAction(MessagePath + "/dtmf", new Action<string>(s =>
|
|
||||||
{
|
|
||||||
if (DTMFMap.ContainsKey(s))
|
|
||||||
{
|
|
||||||
EISC.PulseBool(DTMFMap[s], 100);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
void SendCallsList()
|
|
||||||
{
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
calls = GetCurrentCallList(),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Turns the
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
List<CodecActiveCallItem> GetCurrentCallList()
|
|
||||||
{
|
|
||||||
if (CurrentCallItem.Status == eCodecCallStatus.Disconnected)
|
|
||||||
{
|
|
||||||
return new List<CodecActiveCallItem>();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return new List<CodecActiveCallItem>() { CurrentCallItem };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,648 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using Crestron.SimplSharpPro.EthernetCommunication;
|
|
||||||
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Devices.Common.Codec;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
|
||||||
{
|
|
||||||
public class Ddvc01VtcMessenger : MessengerBase
|
|
||||||
{
|
|
||||||
BasicTriList EISC;
|
|
||||||
|
|
||||||
/********* Bools *********/
|
|
||||||
/// <summary>
|
|
||||||
/// 724
|
|
||||||
/// </summary>
|
|
||||||
const uint BDialHangup = 724;
|
|
||||||
/// <summary>
|
|
||||||
/// 750
|
|
||||||
/// </summary>
|
|
||||||
const uint BCallIncoming = 750;
|
|
||||||
/// <summary>
|
|
||||||
/// 751
|
|
||||||
/// </summary>
|
|
||||||
const uint BIncomingAnswer = 751;
|
|
||||||
/// <summary>
|
|
||||||
/// 752
|
|
||||||
/// </summary>
|
|
||||||
const uint BIncomingReject = 752;
|
|
||||||
/// <summary>
|
|
||||||
/// 741
|
|
||||||
/// </summary>
|
|
||||||
const uint BSpeedDial1 = 741;
|
|
||||||
/// <summary>
|
|
||||||
/// 742
|
|
||||||
/// </summary>
|
|
||||||
const uint BSpeedDial2 = 742;
|
|
||||||
/// <summary>
|
|
||||||
/// 743
|
|
||||||
/// </summary>
|
|
||||||
const uint BSpeedDial3 = 743;
|
|
||||||
/// <summary>
|
|
||||||
/// 744
|
|
||||||
/// </summary>
|
|
||||||
const uint BSpeedDial4 = 744;
|
|
||||||
/// <summary>
|
|
||||||
/// 800
|
|
||||||
/// </summary>
|
|
||||||
const uint BDirectorySearchBusy = 800;
|
|
||||||
/// <summary>
|
|
||||||
/// 801
|
|
||||||
/// </summary>
|
|
||||||
const uint BDirectoryLineSelected = 801;
|
|
||||||
/// <summary>
|
|
||||||
/// 801 when selected entry is a contact
|
|
||||||
/// </summary>
|
|
||||||
const uint BDirectoryEntryIsContact = 801;
|
|
||||||
/// <summary>
|
|
||||||
/// 802 To show/hide back button
|
|
||||||
/// </summary>
|
|
||||||
const uint BDirectoryIsRoot = 802;
|
|
||||||
/// <summary>
|
|
||||||
/// 803 Pulse from system to inform us when directory is ready
|
|
||||||
/// </summary>
|
|
||||||
const uint DDirectoryHasChanged = 803;
|
|
||||||
/// <summary>
|
|
||||||
/// 804
|
|
||||||
/// </summary>
|
|
||||||
const uint BDirectoryRoot = 804;
|
|
||||||
/// <summary>
|
|
||||||
/// 805
|
|
||||||
/// </summary>
|
|
||||||
const uint BDirectoryFolderBack = 805;
|
|
||||||
/// <summary>
|
|
||||||
/// 806
|
|
||||||
/// </summary>
|
|
||||||
const uint BDirectoryDialSelectedLine = 806;
|
|
||||||
/// <summary>
|
|
||||||
/// 811
|
|
||||||
/// </summary>
|
|
||||||
const uint BCameraControlUp = 811;
|
|
||||||
/// <summary>
|
|
||||||
/// 812
|
|
||||||
/// </summary>
|
|
||||||
const uint BCameraControlDown = 812;
|
|
||||||
/// <summary>
|
|
||||||
/// 813
|
|
||||||
/// </summary>
|
|
||||||
const uint BCameraControlLeft = 813;
|
|
||||||
/// <summary>
|
|
||||||
/// 814
|
|
||||||
/// </summary>
|
|
||||||
const uint BCameraControlRight = 814;
|
|
||||||
/// <summary>
|
|
||||||
/// 815
|
|
||||||
/// </summary>
|
|
||||||
const uint BCameraControlZoomIn = 815;
|
|
||||||
/// <summary>
|
|
||||||
/// 816
|
|
||||||
/// </summary>
|
|
||||||
const uint BCameraControlZoomOut = 816;
|
|
||||||
/// <summary>
|
|
||||||
/// 821 - 826
|
|
||||||
/// </summary>
|
|
||||||
const uint BCameraPresetStart = 821;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 831
|
|
||||||
/// </summary>
|
|
||||||
const uint BCameraModeAuto = 831;
|
|
||||||
/// <summary>
|
|
||||||
/// 832
|
|
||||||
/// </summary>
|
|
||||||
const uint BCameraModeManual = 832;
|
|
||||||
/// <summary>
|
|
||||||
/// 833
|
|
||||||
/// </summary>
|
|
||||||
const uint BCameraModeOff = 833;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 841
|
|
||||||
/// </summary>
|
|
||||||
const uint BCameraSelfView = 841;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 842
|
|
||||||
/// </summary>
|
|
||||||
const uint BCameraLayout = 842;
|
|
||||||
/// <summary>
|
|
||||||
/// 843
|
|
||||||
/// </summary>
|
|
||||||
const uint BCameraSupportsAutoMode = 843;
|
|
||||||
/// <summary>
|
|
||||||
/// 844
|
|
||||||
/// </summary>
|
|
||||||
const uint BCameraSupportsOffMode = 844;
|
|
||||||
|
|
||||||
|
|
||||||
/********* Ushorts *********/
|
|
||||||
/// <summary>
|
|
||||||
/// 760
|
|
||||||
/// </summary>
|
|
||||||
const uint UCameraNumberSelect = 760;
|
|
||||||
/// <summary>
|
|
||||||
/// 801
|
|
||||||
/// </summary>
|
|
||||||
const uint UDirectorySelectRow = 801;
|
|
||||||
/// <summary>
|
|
||||||
/// 801
|
|
||||||
/// </summary>
|
|
||||||
const uint UDirectoryRowCount = 801;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********* Strings *********/
|
|
||||||
/// <summary>
|
|
||||||
/// 701
|
|
||||||
/// </summary>
|
|
||||||
const uint SCurrentDialString = 701;
|
|
||||||
/// <summary>
|
|
||||||
/// 702
|
|
||||||
/// </summary>
|
|
||||||
const uint SCurrentCallName = 702;
|
|
||||||
/// <summary>
|
|
||||||
/// 703
|
|
||||||
/// </summary>
|
|
||||||
const uint SCurrentCallNumber = 703;
|
|
||||||
/// <summary>
|
|
||||||
/// 731
|
|
||||||
/// </summary>
|
|
||||||
const uint SHookState = 731;
|
|
||||||
/// <summary>
|
|
||||||
/// 722
|
|
||||||
/// </summary>
|
|
||||||
const uint SCallDirection = 722;
|
|
||||||
/// <summary>
|
|
||||||
/// 751
|
|
||||||
/// </summary>
|
|
||||||
const uint SIncomingCallName = 751;
|
|
||||||
/// <summary>
|
|
||||||
/// 752
|
|
||||||
/// </summary>
|
|
||||||
const uint SIncomingCallNumber = 752;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 800
|
|
||||||
/// </summary>
|
|
||||||
const uint SDirectorySearchString = 800;
|
|
||||||
/// <summary>
|
|
||||||
/// 801-1055
|
|
||||||
/// </summary>
|
|
||||||
const uint SDirectoryEntriesStart = 801;
|
|
||||||
/// <summary>
|
|
||||||
/// 1056
|
|
||||||
/// </summary>
|
|
||||||
const uint SDirectoryEntrySelectedName = 1056;
|
|
||||||
/// <summary>
|
|
||||||
/// 1057
|
|
||||||
/// </summary>
|
|
||||||
const uint SDirectoryEntrySelectedNumber = 1057;
|
|
||||||
/// <summary>
|
|
||||||
/// 1058
|
|
||||||
/// </summary>
|
|
||||||
const uint SDirectorySelectedFolderName = 1058;
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 701-712 0-9*#
|
|
||||||
/// </summary>
|
|
||||||
Dictionary<string, uint> DTMFMap = new Dictionary<string, uint>
|
|
||||||
{
|
|
||||||
{ "1", 701 },
|
|
||||||
{ "2", 702 },
|
|
||||||
{ "3", 703 },
|
|
||||||
{ "4", 704 },
|
|
||||||
{ "5", 705 },
|
|
||||||
{ "6", 706 },
|
|
||||||
{ "7", 707 },
|
|
||||||
{ "8", 708 },
|
|
||||||
{ "9", 709 },
|
|
||||||
{ "0", 710 },
|
|
||||||
{ "*", 711 },
|
|
||||||
{ "#", 712 },
|
|
||||||
};
|
|
||||||
|
|
||||||
CodecActiveCallItem CurrentCallItem;
|
|
||||||
CodecActiveCallItem IncomingCallItem;
|
|
||||||
|
|
||||||
ushort PreviousDirectoryLength = 0;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="eisc"></param>
|
|
||||||
/// <param name="messagePath"></param>
|
|
||||||
public Ddvc01VtcMessenger(string key, BasicTriList eisc, string messagePath)
|
|
||||||
: base(key, messagePath)
|
|
||||||
{
|
|
||||||
EISC = eisc;
|
|
||||||
|
|
||||||
CurrentCallItem = new CodecActiveCallItem();
|
|
||||||
CurrentCallItem.Type = eCodecCallType.Video;
|
|
||||||
CurrentCallItem.Id = "-video-";
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="appServerController"></param>
|
|
||||||
protected override void CustomRegisterWithAppServer(MobileControlSystemController appServerController)
|
|
||||||
{
|
|
||||||
var asc = appServerController;
|
|
||||||
EISC.SetStringSigAction(SHookState, s =>
|
|
||||||
{
|
|
||||||
CurrentCallItem.Status = (eCodecCallStatus)Enum.Parse(typeof(eCodecCallStatus), s, true);
|
|
||||||
PostFullStatus(); // SendCallsList();
|
|
||||||
});
|
|
||||||
|
|
||||||
EISC.SetStringSigAction(SCurrentCallNumber, s =>
|
|
||||||
{
|
|
||||||
CurrentCallItem.Number = s;
|
|
||||||
PostCallsList();
|
|
||||||
});
|
|
||||||
|
|
||||||
EISC.SetStringSigAction(SCurrentCallName, s =>
|
|
||||||
{
|
|
||||||
CurrentCallItem.Name = s;
|
|
||||||
PostCallsList();
|
|
||||||
});
|
|
||||||
|
|
||||||
EISC.SetStringSigAction(SCallDirection, s =>
|
|
||||||
{
|
|
||||||
CurrentCallItem.Direction = (eCodecCallDirection)Enum.Parse(typeof(eCodecCallDirection), s, true);
|
|
||||||
PostCallsList();
|
|
||||||
});
|
|
||||||
|
|
||||||
EISC.SetBoolSigAction(BCallIncoming, b =>
|
|
||||||
{
|
|
||||||
if (b)
|
|
||||||
{
|
|
||||||
var ica = new CodecActiveCallItem()
|
|
||||||
{
|
|
||||||
Direction = eCodecCallDirection.Incoming,
|
|
||||||
Id = "-video-incoming",
|
|
||||||
Name = EISC.GetString(SIncomingCallName),
|
|
||||||
Number = EISC.GetString(SIncomingCallNumber),
|
|
||||||
Status = eCodecCallStatus.Ringing,
|
|
||||||
Type = eCodecCallType.Video
|
|
||||||
};
|
|
||||||
IncomingCallItem = ica;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
IncomingCallItem = null;
|
|
||||||
}
|
|
||||||
PostCallsList();
|
|
||||||
});
|
|
||||||
|
|
||||||
EISC.SetBoolSigAction(BCameraSupportsAutoMode, b =>
|
|
||||||
{
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
cameraSupportsAutoMode = b
|
|
||||||
});
|
|
||||||
});
|
|
||||||
EISC.SetBoolSigAction(BCameraSupportsOffMode, b =>
|
|
||||||
{
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
cameraSupportsOffMode = b
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// Directory insanity
|
|
||||||
EISC.SetUShortSigAction(UDirectoryRowCount, u =>
|
|
||||||
{
|
|
||||||
// The length of the list comes in before the list does.
|
|
||||||
// Splice the sig change operation onto the last string sig that will be changing
|
|
||||||
// when the directory entries make it through.
|
|
||||||
if (PreviousDirectoryLength > 0)
|
|
||||||
{
|
|
||||||
EISC.ClearStringSigAction(SDirectoryEntriesStart + PreviousDirectoryLength - 1);
|
|
||||||
}
|
|
||||||
EISC.SetStringSigAction(SDirectoryEntriesStart + u - 1, s => PostDirectory());
|
|
||||||
PreviousDirectoryLength = u;
|
|
||||||
});
|
|
||||||
|
|
||||||
EISC.SetStringSigAction(SDirectoryEntrySelectedName, s =>
|
|
||||||
{
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
directoryContactSelected = new
|
|
||||||
{
|
|
||||||
name = EISC.GetString(SDirectoryEntrySelectedName),
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
EISC.SetStringSigAction(SDirectoryEntrySelectedNumber, s =>
|
|
||||||
{
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
directoryContactSelected = new
|
|
||||||
{
|
|
||||||
number = EISC.GetString(SDirectoryEntrySelectedNumber),
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
EISC.SetStringSigAction(SDirectorySelectedFolderName, s => PostStatusMessage(new
|
|
||||||
{
|
|
||||||
directorySelectedFolderName = EISC.GetString(SDirectorySelectedFolderName)
|
|
||||||
}));
|
|
||||||
|
|
||||||
EISC.SetSigTrueAction(BCameraModeAuto, () => PostCameraMode());
|
|
||||||
EISC.SetSigTrueAction(BCameraModeManual, () => PostCameraMode());
|
|
||||||
EISC.SetSigTrueAction(BCameraModeOff, () => PostCameraMode());
|
|
||||||
|
|
||||||
EISC.SetBoolSigAction(BCameraSelfView, b => PostStatusMessage(new
|
|
||||||
{
|
|
||||||
cameraSelfView = b
|
|
||||||
}));
|
|
||||||
|
|
||||||
EISC.SetUShortSigAction(UCameraNumberSelect, (u) => PostSelectedCamera());
|
|
||||||
|
|
||||||
|
|
||||||
// Add press and holds using helper action
|
|
||||||
Action<string, uint> addPHAction = (s, u) =>
|
|
||||||
AppServerController.AddAction(MessagePath + s, new PressAndHoldAction(b => EISC.SetBool(u, b)));
|
|
||||||
addPHAction("/cameraUp", BCameraControlUp);
|
|
||||||
addPHAction("/cameraDown", BCameraControlDown);
|
|
||||||
addPHAction("/cameraLeft", BCameraControlLeft);
|
|
||||||
addPHAction("/cameraRight", BCameraControlRight);
|
|
||||||
addPHAction("/cameraZoomIn", BCameraControlZoomIn);
|
|
||||||
addPHAction("/cameraZoomOut", BCameraControlZoomOut);
|
|
||||||
|
|
||||||
// Add straight pulse calls using helper action
|
|
||||||
Action<string, uint> addAction = (s, u) =>
|
|
||||||
AppServerController.AddAction(MessagePath + s, new Action(() => EISC.PulseBool(u, 100)));
|
|
||||||
addAction("/endCallById", BDialHangup);
|
|
||||||
addAction("/endAllCalls", BDialHangup);
|
|
||||||
addAction("/acceptById", BIncomingAnswer);
|
|
||||||
addAction("/rejectById", BIncomingReject);
|
|
||||||
addAction("/speedDial1", BSpeedDial1);
|
|
||||||
addAction("/speedDial2", BSpeedDial2);
|
|
||||||
addAction("/speedDial3", BSpeedDial3);
|
|
||||||
addAction("/speedDial4", BSpeedDial4);
|
|
||||||
addAction("/cameraModeAuto", BCameraModeAuto);
|
|
||||||
addAction("/cameraModeManual", BCameraModeManual);
|
|
||||||
addAction("/cameraModeOff", BCameraModeOff);
|
|
||||||
addAction("/cameraSelfView", BCameraSelfView);
|
|
||||||
addAction("/cameraLayout", BCameraLayout);
|
|
||||||
|
|
||||||
asc.AddAction("/cameraSelect", new Action<string>(SelectCamera));
|
|
||||||
|
|
||||||
// camera presets
|
|
||||||
for(uint i = 0; i < 6; i++)
|
|
||||||
{
|
|
||||||
addAction("/cameraPreset" + (i + 1), BCameraPresetStart + i);
|
|
||||||
}
|
|
||||||
|
|
||||||
asc.AddAction(MessagePath + "/isReady", new Action(PostIsReady));
|
|
||||||
// Get status
|
|
||||||
asc.AddAction(MessagePath + "/fullStatus", new Action(PostFullStatus));
|
|
||||||
// Dial on string
|
|
||||||
asc.AddAction(MessagePath + "/dial", new Action<string>(s =>
|
|
||||||
EISC.SetString(SCurrentDialString, s)));
|
|
||||||
// Pulse DTMF
|
|
||||||
asc.AddAction(MessagePath + "/dtmf", new Action<string>(s =>
|
|
||||||
{
|
|
||||||
if (DTMFMap.ContainsKey(s))
|
|
||||||
{
|
|
||||||
EISC.PulseBool(DTMFMap[s], 100);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
// Directory madness
|
|
||||||
asc.AddAction(MessagePath + "/directoryRoot", new Action(() => EISC.PulseBool(BDirectoryRoot)));
|
|
||||||
asc.AddAction(MessagePath + "/directoryBack", new Action(() => EISC.PulseBool(BDirectoryFolderBack)));
|
|
||||||
asc.AddAction(MessagePath + "/directoryById", new Action<string>(s =>
|
|
||||||
{
|
|
||||||
// the id should contain the line number to forward to simpl
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var u = ushort.Parse(s);
|
|
||||||
EISC.SetUshort(UDirectorySelectRow, u);
|
|
||||||
EISC.PulseBool(BDirectoryLineSelected);
|
|
||||||
}
|
|
||||||
catch (Exception)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, Debug.ErrorLogLevel.Warning,
|
|
||||||
"/directoryById request contains non-numeric ID incompatible with DDVC bridge");
|
|
||||||
}
|
|
||||||
|
|
||||||
}));
|
|
||||||
asc.AddAction(MessagePath + "/directorySelectContact", new Action<string>(s =>
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var u = ushort.Parse(s);
|
|
||||||
EISC.SetUshort(UDirectorySelectRow, u);
|
|
||||||
EISC.PulseBool(BDirectoryLineSelected);
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
asc.AddAction(MessagePath + "/directoryDialContact", new Action(() => {
|
|
||||||
EISC.PulseBool(BDirectoryDialSelectedLine);
|
|
||||||
}));
|
|
||||||
asc.AddAction(MessagePath + "/getDirectory", new Action(() =>
|
|
||||||
{
|
|
||||||
if (EISC.GetUshort(UDirectoryRowCount) > 0)
|
|
||||||
{
|
|
||||||
PostDirectory();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
EISC.PulseBool(BDirectoryRoot);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
void PostFullStatus()
|
|
||||||
{
|
|
||||||
this.PostStatusMessage(new
|
|
||||||
{
|
|
||||||
calls = GetCurrentCallList(),
|
|
||||||
cameraMode = GetCameraMode(),
|
|
||||||
cameraSelfView = EISC.GetBool(BCameraSelfView),
|
|
||||||
cameraSupportsAutoMode = EISC.GetBool(BCameraSupportsAutoMode),
|
|
||||||
cameraSupportsOffMode = EISC.GetBool(BCameraSupportsOffMode),
|
|
||||||
currentCallString = EISC.GetString(SCurrentCallNumber),
|
|
||||||
currentDialString = EISC.GetString(SCurrentDialString),
|
|
||||||
directoryContactSelected = new
|
|
||||||
{
|
|
||||||
name = EISC.GetString(SDirectoryEntrySelectedName),
|
|
||||||
number = EISC.GetString(SDirectoryEntrySelectedNumber)
|
|
||||||
},
|
|
||||||
directorySelectedFolderName = EISC.GetString(SDirectorySelectedFolderName),
|
|
||||||
isInCall = EISC.GetString(SHookState) == "Connected",
|
|
||||||
hasDirectory = true,
|
|
||||||
hasDirectorySearch = false,
|
|
||||||
hasRecents = !EISC.BooleanOutput[502].BoolValue,
|
|
||||||
hasCameras = true,
|
|
||||||
showCamerasWhenNotInCall = EISC.BooleanOutput[503].BoolValue,
|
|
||||||
selectedCamera = GetSelectedCamera(),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
void PostDirectory()
|
|
||||||
{
|
|
||||||
var u = EISC.GetUshort(UDirectoryRowCount);
|
|
||||||
var items = new List<object>();
|
|
||||||
for (uint i = 0; i < u; i++)
|
|
||||||
{
|
|
||||||
var name = EISC.GetString(SDirectoryEntriesStart + i);
|
|
||||||
var id = (i + 1).ToString();
|
|
||||||
// is folder or contact?
|
|
||||||
if (name.StartsWith("[+]"))
|
|
||||||
{
|
|
||||||
items.Add(new
|
|
||||||
{
|
|
||||||
folderId = id,
|
|
||||||
name = name
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
items.Add(new
|
|
||||||
{
|
|
||||||
contactId = id,
|
|
||||||
name = name
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var directoryMessage = new
|
|
||||||
{
|
|
||||||
currentDirectory = new
|
|
||||||
{
|
|
||||||
isRootDirectory = EISC.GetBool(BDirectoryIsRoot),
|
|
||||||
directoryResults = items
|
|
||||||
}
|
|
||||||
};
|
|
||||||
PostStatusMessage(directoryMessage);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
void PostCameraMode()
|
|
||||||
{
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
cameraMode = GetCameraMode()
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="mode"></param>
|
|
||||||
string GetCameraMode()
|
|
||||||
{
|
|
||||||
string m;
|
|
||||||
if (EISC.GetBool(BCameraModeAuto)) m = "auto";
|
|
||||||
else if (EISC.GetBool(BCameraModeManual)) m = "manual";
|
|
||||||
else m = "off";
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
|
|
||||||
void PostSelectedCamera()
|
|
||||||
{
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
selectedCamera = GetSelectedCamera()
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
string GetSelectedCamera()
|
|
||||||
{
|
|
||||||
var num = EISC.GetUshort(UCameraNumberSelect);
|
|
||||||
string m;
|
|
||||||
if (num == 100)
|
|
||||||
{
|
|
||||||
m = "cameraFar";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m = "camera" + num;
|
|
||||||
}
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
void PostIsReady()
|
|
||||||
{
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
isReady = true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
void PostCallsList()
|
|
||||||
{
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
calls = GetCurrentCallList(),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="s"></param>
|
|
||||||
void SelectCamera(string s)
|
|
||||||
{
|
|
||||||
var cam = s.Substring(6);
|
|
||||||
if (cam.ToLower() == "far")
|
|
||||||
{
|
|
||||||
EISC.SetUshort(UCameraNumberSelect, 100);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
EISC.SetUshort(UCameraNumberSelect, UInt16.Parse(cam));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Turns the
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
List<CodecActiveCallItem> GetCurrentCallList()
|
|
||||||
{
|
|
||||||
var list = new List<CodecActiveCallItem>();
|
|
||||||
if (CurrentCallItem.Status != eCodecCallStatus.Disconnected)
|
|
||||||
{
|
|
||||||
list.Add(CurrentCallItem);
|
|
||||||
}
|
|
||||||
if (EISC.GetBool(BCallIncoming)) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using Newtonsoft.Json.Linq;
|
|
||||||
|
|
||||||
using PepperDash.Core;
|
|
||||||
|
|
||||||
using PepperDash.Essentials.Devices.Common.Codec;
|
|
||||||
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Provides a messaging bridge for a VideoCodecBase
|
|
||||||
/// </summary>
|
|
||||||
public abstract class MessengerBase : IKeyed
|
|
||||||
{
|
|
||||||
public string Key { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public MobileControlSystemController AppServerController { get; private set; }
|
|
||||||
|
|
||||||
public string MessagePath { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="codec"></param>
|
|
||||||
public MessengerBase(string key, string messagePath)
|
|
||||||
{
|
|
||||||
Key = key;
|
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(messagePath))
|
|
||||||
throw new ArgumentException("messagePath must not be empty or null");
|
|
||||||
|
|
||||||
MessagePath = messagePath;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Registers this messenger with appserver controller
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="appServerController"></param>
|
|
||||||
public void RegisterWithAppServer(MobileControlSystemController appServerController)
|
|
||||||
{
|
|
||||||
if (appServerController == null)
|
|
||||||
throw new ArgumentNullException("appServerController");
|
|
||||||
|
|
||||||
AppServerController = appServerController;
|
|
||||||
CustomRegisterWithAppServer(AppServerController);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Implemented in extending classes. Wire up API calls and feedback here
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="appServerController"></param>
|
|
||||||
abstract protected void CustomRegisterWithAppServer(MobileControlSystemController appServerController);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Helper for posting status message
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="contentObject">The contents of the content object</param>
|
|
||||||
protected void PostStatusMessage(object contentObject)
|
|
||||||
{
|
|
||||||
if (AppServerController != null)
|
|
||||||
{
|
|
||||||
AppServerController.SendMessageToServer(JObject.FromObject(new
|
|
||||||
{
|
|
||||||
type = MessagePath,
|
|
||||||
content = contentObject
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,95 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core.Monitoring;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
|
||||||
{
|
|
||||||
public class SystemMonitorMessenger : MessengerBase
|
|
||||||
{
|
|
||||||
public SystemMonitorController SysMon { get; private set; }
|
|
||||||
|
|
||||||
public SystemMonitorMessenger(string key, SystemMonitorController sysMon, string messagePath)
|
|
||||||
: base(key, messagePath)
|
|
||||||
{
|
|
||||||
if (sysMon == null)
|
|
||||||
throw new ArgumentNullException("sysMon");
|
|
||||||
|
|
||||||
SysMon = sysMon;
|
|
||||||
|
|
||||||
SysMon.SystemMonitorPropertiesChanged += new EventHandler<EventArgs>(SysMon_SystemMonitorPropertiesChanged);
|
|
||||||
|
|
||||||
foreach (var p in SysMon.ProgramStatusFeedbackCollection)
|
|
||||||
{
|
|
||||||
p.Value.ProgramInfoChanged += new EventHandler<ProgramInfoEventArgs>(ProgramInfoChanged);
|
|
||||||
}
|
|
||||||
|
|
||||||
CrestronConsole.AddNewConsoleCommand(s => SendFullStatusMessage(), "SendFullSysMonStatus", "Sends the full System Monitor Status", ConsoleAccessLevelEnum.AccessOperator);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Posts the program information message
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sender"></param>
|
|
||||||
/// <param name="e"></param>
|
|
||||||
void ProgramInfoChanged(object sender, ProgramInfoEventArgs e)
|
|
||||||
{
|
|
||||||
if (e.ProgramInfo != null)
|
|
||||||
{
|
|
||||||
//Debug.Console(1, "Posting Status Message: {0}", e.ProgramInfo.ToString());
|
|
||||||
PostStatusMessage(e.ProgramInfo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Posts the system monitor properties
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sender"></param>
|
|
||||||
/// <param name="e"></param>
|
|
||||||
void SysMon_SystemMonitorPropertiesChanged(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
SendSystemMonitorStatusMessage();
|
|
||||||
}
|
|
||||||
|
|
||||||
void SendFullStatusMessage()
|
|
||||||
{
|
|
||||||
SendSystemMonitorStatusMessage();
|
|
||||||
|
|
||||||
foreach (var p in SysMon.ProgramStatusFeedbackCollection)
|
|
||||||
{
|
|
||||||
PostStatusMessage(p.Value.ProgramInfo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void SendSystemMonitorStatusMessage()
|
|
||||||
{
|
|
||||||
Debug.Console(1, "Posting System Monitor Status Message.");
|
|
||||||
|
|
||||||
// This takes a while, launch a new thread
|
|
||||||
CrestronInvoke.BeginInvoke((o) =>
|
|
||||||
{
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
timeZone = SysMon.TimeZoneFeedback.IntValue,
|
|
||||||
timeZoneName = SysMon.TimeZoneTextFeedback.StringValue,
|
|
||||||
ioControllerVersion = SysMon.IOControllerVersionFeedback.StringValue,
|
|
||||||
snmpVersion = SysMon.SnmpVersionFeedback.StringValue,
|
|
||||||
bacnetVersion = SysMon.BACnetAppVersionFeedback.StringValue,
|
|
||||||
controllerVersion = SysMon.ControllerVersionFeedback.StringValue
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void CustomRegisterWithAppServer(MobileControlSystemController appServerController)
|
|
||||||
{
|
|
||||||
AppServerController.AddAction(MessagePath + "/fullStatus", new Action(SendFullStatusMessage));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,373 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using Newtonsoft.Json.Linq;
|
|
||||||
|
|
||||||
using PepperDash.Essentials.Devices.Common.Codec;
|
|
||||||
using PepperDash.Essentials.Devices.Common.Cameras;
|
|
||||||
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Provides a messaging bridge for a VideoCodecBase device
|
|
||||||
/// </summary>
|
|
||||||
public class VideoCodecBaseMessenger : MessengerBase
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public VideoCodecBase Codec { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="codec"></param>
|
|
||||||
public VideoCodecBaseMessenger(string key, VideoCodecBase codec, string messagePath)
|
|
||||||
: base(key, messagePath)
|
|
||||||
{
|
|
||||||
if (codec == null)
|
|
||||||
throw new ArgumentNullException("codec");
|
|
||||||
|
|
||||||
Codec = codec;
|
|
||||||
codec.CallStatusChange += new EventHandler<CodecCallStatusItemChangeEventArgs>(codec_CallStatusChange);
|
|
||||||
codec.IsReadyChange += new EventHandler<EventArgs>(codec_IsReadyChange);
|
|
||||||
|
|
||||||
var dirCodec = codec as IHasDirectory;
|
|
||||||
if (dirCodec != null)
|
|
||||||
{
|
|
||||||
dirCodec.DirectoryResultReturned += new EventHandler<DirectoryEventArgs>(dirCodec_DirectoryResultReturned);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
var recCodec = codec as IHasCallHistory;
|
|
||||||
if (recCodec != null)
|
|
||||||
{
|
|
||||||
recCodec.CallHistory.RecentCallsListHasChanged += new EventHandler<EventArgs>(CallHistory_RecentCallsListHasChanged);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sender"></param>
|
|
||||||
/// <param name="e"></param>
|
|
||||||
void CallHistory_RecentCallsListHasChanged(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
var recents = (sender as CodecCallHistory).RecentCalls;
|
|
||||||
|
|
||||||
if (recents != null)
|
|
||||||
{
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
recentCalls = recents
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sender"></param>
|
|
||||||
/// <param name="e"></param>
|
|
||||||
void dirCodec_DirectoryResultReturned(object sender, DirectoryEventArgs e)
|
|
||||||
{
|
|
||||||
SendDirectory((Codec as IHasDirectory).CurrentDirectoryResult, e.DirectoryIsOnRoot);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Posts the current directory
|
|
||||||
/// </summary>
|
|
||||||
void SendDirectory(CodecDirectory directory, bool isRoot)
|
|
||||||
{
|
|
||||||
var dirCodec = Codec as IHasDirectory;
|
|
||||||
|
|
||||||
if (dirCodec != null)
|
|
||||||
{
|
|
||||||
var prefixedDirectoryResults = PrefixDirectoryFolderItems(directory);
|
|
||||||
|
|
||||||
var directoryMessage = new
|
|
||||||
{
|
|
||||||
currentDirectory = new
|
|
||||||
{
|
|
||||||
directoryResults = prefixedDirectoryResults,
|
|
||||||
isRootDirectory = isRoot
|
|
||||||
}
|
|
||||||
};
|
|
||||||
PostStatusMessage(directoryMessage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Iterates a directory object and prefixes any folder items with "[+] "
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="directory"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
List<DirectoryItem> PrefixDirectoryFolderItems (CodecDirectory directory)
|
|
||||||
{
|
|
||||||
var tempDirectoryList = new List<DirectoryItem>();
|
|
||||||
|
|
||||||
if (directory.CurrentDirectoryResults.Count > 0)
|
|
||||||
{
|
|
||||||
foreach (var item in directory.CurrentDirectoryResults)
|
|
||||||
{
|
|
||||||
if (item is DirectoryFolder)
|
|
||||||
{
|
|
||||||
var newFolder = new DirectoryFolder();
|
|
||||||
|
|
||||||
newFolder = (DirectoryFolder)item.Clone();
|
|
||||||
|
|
||||||
string prefixName = "[+] " + newFolder.Name;
|
|
||||||
|
|
||||||
newFolder.Name = prefixName;
|
|
||||||
|
|
||||||
tempDirectoryList.Add(newFolder);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
tempDirectoryList.Add(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//else
|
|
||||||
//{
|
|
||||||
// DirectoryItem noResults = new DirectoryItem() { Name = "No Results Found" };
|
|
||||||
|
|
||||||
// tempDirectoryList.Add(noResults);
|
|
||||||
//}
|
|
||||||
|
|
||||||
return tempDirectoryList;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sender"></param>
|
|
||||||
/// <param name="e"></param>
|
|
||||||
void codec_IsReadyChange(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
isReady = true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Called from base's RegisterWithAppServer method
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="appServerController"></param>
|
|
||||||
protected override void CustomRegisterWithAppServer(MobileControlSystemController appServerController)
|
|
||||||
{
|
|
||||||
appServerController.AddAction("/device/videoCodec/isReady", new Action(SendIsReady));
|
|
||||||
appServerController.AddAction("/device/videoCodec/fullStatus", new Action(SendVtcFullMessageObject));
|
|
||||||
appServerController.AddAction("/device/videoCodec/dial", new Action<string>(s => Codec.Dial(s)));
|
|
||||||
appServerController.AddAction("/device/videoCodec/endCallById", new Action<string>(s =>
|
|
||||||
{
|
|
||||||
var call = GetCallWithId(s);
|
|
||||||
if (call != null)
|
|
||||||
Codec.EndCall(call);
|
|
||||||
}));
|
|
||||||
appServerController.AddAction(MessagePath + "/endAllCalls", new Action(Codec.EndAllCalls));
|
|
||||||
appServerController.AddAction(MessagePath + "/dtmf", new Action<string>(s => Codec.SendDtmf(s)));
|
|
||||||
appServerController.AddAction(MessagePath + "/rejectById", new Action<string>(s =>
|
|
||||||
{
|
|
||||||
var call = GetCallWithId(s);
|
|
||||||
if (call != null)
|
|
||||||
Codec.RejectCall(call);
|
|
||||||
}));
|
|
||||||
appServerController.AddAction(MessagePath + "/acceptById", new Action<string>(s =>
|
|
||||||
{
|
|
||||||
var call = GetCallWithId(s);
|
|
||||||
if (call != null)
|
|
||||||
Codec.AcceptCall(call);
|
|
||||||
}));
|
|
||||||
|
|
||||||
// Directory actions
|
|
||||||
var dirCodec = Codec as IHasDirectory;
|
|
||||||
if (dirCodec != null)
|
|
||||||
{
|
|
||||||
appServerController.AddAction(MessagePath + "/getDirectory", new Action(GetDirectoryRoot));
|
|
||||||
appServerController.AddAction(MessagePath + "/directoryById", new Action<string>(s => GetDirectory(s)));
|
|
||||||
appServerController.AddAction(MessagePath + "/directorySearch", new Action<string>(s => DirectorySearch(s)));
|
|
||||||
appServerController.AddAction(MessagePath + "/directoryBack", new Action(GetPreviousDirectory));
|
|
||||||
}
|
|
||||||
|
|
||||||
// History actions
|
|
||||||
var recCodec = Codec as IHasCallHistory;
|
|
||||||
if (recCodec != null)
|
|
||||||
{
|
|
||||||
appServerController.AddAction(MessagePath + "/getCallHistory", new Action(GetCallHistory));
|
|
||||||
}
|
|
||||||
|
|
||||||
appServerController.AddAction(MessagePath + "/privacyModeOn", new Action(Codec.PrivacyModeOn));
|
|
||||||
appServerController.AddAction(MessagePath + "/privacyModeOff", new Action(Codec.PrivacyModeOff));
|
|
||||||
appServerController.AddAction(MessagePath + "/privacyModeToggle", new Action(Codec.PrivacyModeToggle));
|
|
||||||
appServerController.AddAction(MessagePath + "/sharingStart", new Action(Codec.StartSharing));
|
|
||||||
appServerController.AddAction(MessagePath + "/sharingStop", new Action(Codec.StopSharing));
|
|
||||||
appServerController.AddAction(MessagePath + "/standbyOn", new Action(Codec.StandbyActivate));
|
|
||||||
appServerController.AddAction(MessagePath + "/standbyOff", new Action(Codec.StandbyDeactivate));
|
|
||||||
}
|
|
||||||
|
|
||||||
void GetCallHistory()
|
|
||||||
{
|
|
||||||
var codec = (Codec as IHasCallHistory);
|
|
||||||
|
|
||||||
if (codec != null)
|
|
||||||
{
|
|
||||||
var recents = codec.CallHistory.RecentCalls;
|
|
||||||
|
|
||||||
if (recents != null)
|
|
||||||
{
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
recentCalls = recents
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void GetFullStatusMessage()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Helper to grab a call with string ID
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="id"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
CodecActiveCallItem GetCallWithId(string id)
|
|
||||||
{
|
|
||||||
return Codec.ActiveCalls.FirstOrDefault(c => c.Id == id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="s"></param>
|
|
||||||
void DirectorySearch(string s)
|
|
||||||
{
|
|
||||||
var dirCodec = Codec as IHasDirectory;
|
|
||||||
if (dirCodec != null)
|
|
||||||
{
|
|
||||||
dirCodec.SearchDirectory(s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="id"></param>
|
|
||||||
void GetDirectory(string id)
|
|
||||||
{
|
|
||||||
var dirCodec = Codec as IHasDirectory;
|
|
||||||
if(dirCodec == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
dirCodec.GetDirectoryFolderContents(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
void GetDirectoryRoot()
|
|
||||||
{
|
|
||||||
var dirCodec = Codec as IHasDirectory;
|
|
||||||
if (dirCodec == null)
|
|
||||||
{
|
|
||||||
// do something else?
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!dirCodec.PhonebookSyncState.InitialSyncComplete)
|
|
||||||
{
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
initialSyncComplete = false
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
dirCodec.SetCurrentDirectoryToRoot();
|
|
||||||
|
|
||||||
//PostStatusMessage(new
|
|
||||||
//{
|
|
||||||
// currentDirectory = dirCodec.DirectoryRoot
|
|
||||||
//});
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Requests the parent folder contents
|
|
||||||
/// </summary>
|
|
||||||
void GetPreviousDirectory()
|
|
||||||
{
|
|
||||||
var dirCodec = Codec as IHasDirectory;
|
|
||||||
if (dirCodec == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
dirCodec.GetDirectoryParentFolderContents();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handler for codec changes
|
|
||||||
/// </summary>
|
|
||||||
void codec_CallStatusChange(object sender, CodecCallStatusItemChangeEventArgs e)
|
|
||||||
{
|
|
||||||
SendVtcFullMessageObject();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
void SendIsReady()
|
|
||||||
{
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
isReady = Codec.IsReady
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Helper method to build call status for vtc
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
void SendVtcFullMessageObject()
|
|
||||||
{
|
|
||||||
if (!Codec.IsReady)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var info = Codec.CodecInfo;
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
isInCall = Codec.IsInCall,
|
|
||||||
privacyModeIsOn = Codec.PrivacyModeIsOnFeedback.BoolValue,
|
|
||||||
sharingContentIsOn = Codec.SharingContentIsOnFeedback.BoolValue,
|
|
||||||
sharingSource = Codec.SharingSourceFeedback.StringValue,
|
|
||||||
standbyIsOn = Codec.StandbyIsOnFeedback.StringValue,
|
|
||||||
calls = Codec.ActiveCalls,
|
|
||||||
info = new
|
|
||||||
{
|
|
||||||
autoAnswerEnabled = info.AutoAnswerEnabled,
|
|
||||||
e164Alias = info.E164Alias,
|
|
||||||
h323Id = info.H323Id,
|
|
||||||
ipAddress = info.IpAddress,
|
|
||||||
sipPhoneNumber = info.SipPhoneNumber,
|
|
||||||
sipURI = info.SipUri
|
|
||||||
},
|
|
||||||
showSelfViewByDefault = Codec.ShowSelfViewByDefault,
|
|
||||||
hasDirectory = Codec is IHasDirectory,
|
|
||||||
hasDirectorySearch = true,
|
|
||||||
hasRecents = Codec is IHasCallHistory,
|
|
||||||
hasCameras = Codec is IHasCodecCameras
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using PepperDash.Essentials.Core.Config;
|
|
||||||
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials
|
|
||||||
{
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public class MobileControlConfig
|
|
||||||
{
|
|
||||||
[JsonProperty("serverUrl")]
|
|
||||||
public string ServerUrl { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("clientAppUrl")]
|
|
||||||
public string ClientAppUrl { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public class MobileControlDdvc01RoomBridgePropertiesConfig
|
|
||||||
{
|
|
||||||
[JsonProperty("eiscId")]
|
|
||||||
public string EiscId { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,148 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharpPro.EthernetCommunication;
|
|
||||||
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Room.MobileControl
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Represents a generic device connection through to and EISC for DDVC01
|
|
||||||
/// </summary>
|
|
||||||
public class MobileControlDdvc01DeviceBridge : Device, IChannel, INumericKeypad
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// EISC used to talk to Simpl
|
|
||||||
/// </summary>
|
|
||||||
ThreeSeriesTcpIpEthernetIntersystemCommunications EISC;
|
|
||||||
|
|
||||||
public MobileControlDdvc01DeviceBridge(string key, string name, ThreeSeriesTcpIpEthernetIntersystemCommunications eisc)
|
|
||||||
: base(key, name)
|
|
||||||
{
|
|
||||||
EISC = eisc;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#region IChannel Members
|
|
||||||
|
|
||||||
public void ChannelUp(bool pressRelease)
|
|
||||||
{
|
|
||||||
EISC.SetBool(1111, pressRelease);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void ChannelDown(bool pressRelease)
|
|
||||||
{
|
|
||||||
EISC.SetBool(1111, pressRelease);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void LastChannel(bool pressRelease)
|
|
||||||
{
|
|
||||||
EISC.SetBool(1111, pressRelease);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Guide(bool pressRelease)
|
|
||||||
{
|
|
||||||
EISC.SetBool(1111, pressRelease);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Info(bool pressRelease)
|
|
||||||
{
|
|
||||||
EISC.SetBool(1111, pressRelease);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Exit(bool pressRelease)
|
|
||||||
{
|
|
||||||
EISC.SetBool(1111, pressRelease);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region INumericKeypad Members
|
|
||||||
|
|
||||||
public void Digit0(bool pressRelease)
|
|
||||||
{
|
|
||||||
EISC.SetBool(1111, pressRelease);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Digit1(bool pressRelease)
|
|
||||||
{
|
|
||||||
EISC.SetBool(1111, pressRelease);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Digit2(bool pressRelease)
|
|
||||||
{
|
|
||||||
EISC.SetBool(1111, pressRelease);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Digit3(bool pressRelease)
|
|
||||||
{
|
|
||||||
EISC.SetBool(1111, pressRelease);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Digit4(bool pressRelease)
|
|
||||||
{
|
|
||||||
EISC.SetBool(1111, pressRelease);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Digit5(bool pressRelease)
|
|
||||||
{
|
|
||||||
EISC.SetBool(1111, pressRelease);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Digit6(bool pressRelease)
|
|
||||||
{
|
|
||||||
EISC.SetBool(1111, pressRelease);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Digit7(bool pressRelease)
|
|
||||||
{
|
|
||||||
EISC.SetBool(1111, pressRelease);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Digit8(bool pressRelease)
|
|
||||||
{
|
|
||||||
EISC.SetBool(1111, pressRelease);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Digit9(bool pressRelease)
|
|
||||||
{
|
|
||||||
EISC.SetBool(1111, pressRelease);
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool HasKeypadAccessoryButton1
|
|
||||||
{
|
|
||||||
get { throw new NotImplementedException(); }
|
|
||||||
}
|
|
||||||
|
|
||||||
public string KeypadAccessoryButton1Label
|
|
||||||
{
|
|
||||||
get { throw new NotImplementedException(); }
|
|
||||||
}
|
|
||||||
|
|
||||||
public void KeypadAccessoryButton1(bool pressRelease)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool HasKeypadAccessoryButton2
|
|
||||||
{
|
|
||||||
get { throw new NotImplementedException(); }
|
|
||||||
}
|
|
||||||
|
|
||||||
public string KeypadAccessoryButton2Label
|
|
||||||
{
|
|
||||||
get { throw new NotImplementedException(); }
|
|
||||||
}
|
|
||||||
|
|
||||||
public void KeypadAccessoryButton2(bool pressRelease)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,864 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Text.RegularExpressions;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharp.CrestronIO;
|
|
||||||
using Crestron.SimplSharp.Reflection;
|
|
||||||
using Crestron.SimplSharpPro.CrestronThread;
|
|
||||||
using Crestron.SimplSharp.CrestronWebSocketClient;
|
|
||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Crestron.SimplSharp.Net.Http;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using Newtonsoft.Json.Linq;
|
|
||||||
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Core.Config;
|
|
||||||
using PepperDash.Essentials.Room.MobileControl;
|
|
||||||
using PepperDash.Essentials.AppServer.Messengers;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials
|
|
||||||
{
|
|
||||||
public class MobileControlSystemController : Device
|
|
||||||
{
|
|
||||||
WebSocketClient WSClient;
|
|
||||||
|
|
||||||
//bool LinkUp;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Prevents post operations from stomping on each other and getting lost
|
|
||||||
/// </summary>
|
|
||||||
CEvent PostLockEvent = new CEvent(true, true);
|
|
||||||
|
|
||||||
CEvent RegisterLockEvent = new CEvent(true, true);
|
|
||||||
|
|
||||||
public MobileControlConfig Config { get; private set; }
|
|
||||||
|
|
||||||
Dictionary<string, Object> ActionDictionary = new Dictionary<string, Object>(StringComparer.InvariantCultureIgnoreCase);
|
|
||||||
|
|
||||||
Dictionary<string, CTimer> PushedActions = new Dictionary<string, CTimer>();
|
|
||||||
|
|
||||||
public ConfigMessenger ConfigMessenger { get; private set; }
|
|
||||||
|
|
||||||
CTimer ServerHeartbeatCheckTimer;
|
|
||||||
|
|
||||||
long ServerHeartbeatInterval = 20000;
|
|
||||||
|
|
||||||
CTimer ServerReconnectTimer;
|
|
||||||
|
|
||||||
long ServerReconnectInterval = 5000;
|
|
||||||
|
|
||||||
DateTime LastAckMessage;
|
|
||||||
|
|
||||||
public string SystemUuid;
|
|
||||||
|
|
||||||
List<MobileControlBridgeBase> RoomBridges = new List<MobileControlBridgeBase>();
|
|
||||||
|
|
||||||
long ButtonHeartbeatInterval = 1000;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Used for tracking HTTP debugging
|
|
||||||
/// </summary>
|
|
||||||
bool HttpDebugEnabled;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="key"></param>
|
|
||||||
/// <param name="name"></param>
|
|
||||||
/// <param name="config"></param>
|
|
||||||
public MobileControlSystemController(string key, string name, MobileControlConfig config) : base(key, name)
|
|
||||||
{
|
|
||||||
Config = config;
|
|
||||||
|
|
||||||
SystemUuid = ConfigReader.ConfigObject.SystemUuid;
|
|
||||||
|
|
||||||
Debug.Console(0, this, "Mobile UI controller initializing for server:{0}", config.ServerUrl);
|
|
||||||
|
|
||||||
CrestronConsole.AddNewConsoleCommand(AuthorizeSystem,
|
|
||||||
"mobileauth", "Authorizes system to talk to Mobile Control server", ConsoleAccessLevelEnum.AccessOperator);
|
|
||||||
CrestronConsole.AddNewConsoleCommand(s => ShowInfo(),
|
|
||||||
"mobileinfo", "Shows information for current mobile control session", ConsoleAccessLevelEnum.AccessOperator);
|
|
||||||
CrestronConsole.AddNewConsoleCommand(s => {
|
|
||||||
s = s.Trim();
|
|
||||||
if(!string.IsNullOrEmpty(s))
|
|
||||||
{
|
|
||||||
HttpDebugEnabled = (s.Trim() != "0");
|
|
||||||
}
|
|
||||||
CrestronConsole.ConsoleCommandResponse("HTTP Debug {0}", HttpDebugEnabled ? "Enabled" : "Disabled");
|
|
||||||
},
|
|
||||||
"mobilehttpdebug", "1 enables more verbose HTTP response debugging", ConsoleAccessLevelEnum.AccessOperator);
|
|
||||||
CrestronConsole.AddNewConsoleCommand(TestHttpRequest,
|
|
||||||
"mobilehttprequest", "Tests an HTTP get to URL given", ConsoleAccessLevelEnum.AccessOperator);
|
|
||||||
|
|
||||||
CrestronConsole.AddNewConsoleCommand(PrintActionDictionaryPaths, "mobileshowactionpaths",
|
|
||||||
"Prints the paths in the Action Dictionary", ConsoleAccessLevelEnum.AccessOperator);
|
|
||||||
CrestronConsole.AddNewConsoleCommand(s => ConnectWebsocketClient(), "mobileconnect",
|
|
||||||
"Forces connect of websocket", ConsoleAccessLevelEnum.AccessOperator);
|
|
||||||
CrestronConsole.AddNewConsoleCommand(s => CleanUpWebsocketClient(), "mobiledisco",
|
|
||||||
"Disconnects websocket", ConsoleAccessLevelEnum.AccessOperator);
|
|
||||||
|
|
||||||
CrestronConsole.AddNewConsoleCommand(s => ParseStreamRx(s), "mobilesimulateaction", "Simulates a message from the server", ConsoleAccessLevelEnum.AccessOperator);
|
|
||||||
|
|
||||||
CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
|
|
||||||
CrestronEnvironment.EthernetEventHandler += new EthernetEventHandler(CrestronEnvironment_EthernetEventHandler);
|
|
||||||
|
|
||||||
// Config Messenger
|
|
||||||
var cmKey = Key + "-config";
|
|
||||||
ConfigMessenger = new ConfigMessenger(cmKey, "/config");
|
|
||||||
ConfigMessenger.RegisterWithAppServer(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// If config rooms is empty or null then go
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
public override bool CustomActivate()
|
|
||||||
{
|
|
||||||
if (ConfigReader.ConfigObject.Rooms == null || ConfigReader.ConfigObject.Rooms.Count == 0)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Config contains no rooms. Registering with Server.");
|
|
||||||
RegisterSystemToServer();
|
|
||||||
}
|
|
||||||
|
|
||||||
return base.CustomActivate();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="ethernetEventArgs"></param>
|
|
||||||
void CrestronEnvironment_EthernetEventHandler(EthernetEventArgs args)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, Debug.ErrorLogLevel.Warning, "Ethernet status change, port {0}: {1}",
|
|
||||||
args.EthernetAdapter, args.EthernetEventType);
|
|
||||||
|
|
||||||
if (args.EthernetEventType == eEthernetEventType.LinkDown && WSClient != null && args.EthernetAdapter == WSClient.EthernetAdapter)
|
|
||||||
{
|
|
||||||
CleanUpWebsocketClient();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Sends message to server to indicate the system is shutting down
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="programEventType"></param>
|
|
||||||
void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType)
|
|
||||||
{
|
|
||||||
if (programEventType == eProgramStatusEventType.Stopping
|
|
||||||
&& WSClient != null
|
|
||||||
&& WSClient.Connected)
|
|
||||||
{
|
|
||||||
CleanUpWebsocketClient();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void PrintActionDictionaryPaths(object o)
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "ActionDictionary Contents:");
|
|
||||||
|
|
||||||
foreach (var item in ActionDictionary)
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "{0}", item.Key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Adds an action to the dictionary
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="key">The path of the API command</param>
|
|
||||||
/// <param name="action">The action to be triggered by the commmand</param>
|
|
||||||
public void AddAction(string key, object action)
|
|
||||||
{
|
|
||||||
if (!ActionDictionary.ContainsKey(key))
|
|
||||||
{
|
|
||||||
ActionDictionary.Add(key, action);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Cannot add action with key '{0}' because key already exists in ActionDictionary.", key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Removes an action from the dictionary
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="key"></param>
|
|
||||||
public void RemoveAction(string key)
|
|
||||||
{
|
|
||||||
if (ActionDictionary.ContainsKey(key))
|
|
||||||
ActionDictionary.Remove(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="bridge"></param>
|
|
||||||
public void AddBridge(MobileControlBridgeBase bridge)
|
|
||||||
{
|
|
||||||
RoomBridges.Add(bridge);
|
|
||||||
var b = bridge as IDelayedConfiguration;
|
|
||||||
if (b != null)
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "Adding room bridge with delayed configuration");
|
|
||||||
b.ConfigurationIsReady += new EventHandler<EventArgs>(bridge_ConfigurationIsReady);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "Adding room bridge and sending configuration");
|
|
||||||
//SystemUuid = ConfigReader.ConfigObject.SystemUuid;
|
|
||||||
RegisterSystemToServer();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sender"></param>
|
|
||||||
/// <param name="e"></param>
|
|
||||||
void bridge_ConfigurationIsReady(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Bridge ready. Registering");
|
|
||||||
//SystemUuid = ConfigReader.ConfigObject.SystemUuid;
|
|
||||||
// send the configuration object to the server
|
|
||||||
RegisterSystemToServer();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="o"></param>
|
|
||||||
void ReconnectToServerTimerCallback(object o)
|
|
||||||
{
|
|
||||||
RegisterSystemToServer();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Verifies system connection with servers
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="command"></param>
|
|
||||||
void AuthorizeSystem(string code)
|
|
||||||
{
|
|
||||||
//SystemUuid = ConfigReader.ConfigObject.SystemUuid;
|
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(SystemUuid))
|
|
||||||
{
|
|
||||||
CrestronConsole.ConsoleCommandResponse("System does not have a UUID. Please ensure proper portal-format configuration is loaded and restart.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(code))
|
|
||||||
{
|
|
||||||
CrestronConsole.ConsoleCommandResponse("Please enter a user code to authorize a system");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var req = new HttpClientRequest();
|
|
||||||
string url = string.Format("http://{0}/api/system/grantcode/{1}/{2}", Config.ServerUrl, code, SystemUuid);
|
|
||||||
Debug.Console(0, this, "Authorizing to: {0}", url);
|
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(Config.ServerUrl))
|
|
||||||
{
|
|
||||||
CrestronConsole.ConsoleCommandResponse("Config URL address is not set. Check portal configuration");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
try
|
|
||||||
{
|
|
||||||
req.Url.Parse(url);
|
|
||||||
new HttpClient().DispatchAsync(req, (r, e) =>
|
|
||||||
{
|
|
||||||
CheckHttpDebug(r, e);
|
|
||||||
if (e == HTTP_CALLBACK_ERROR.COMPLETED)
|
|
||||||
{
|
|
||||||
if (r.Code == 200)
|
|
||||||
{
|
|
||||||
Debug.Console(0, "System authorized, sending config.");
|
|
||||||
#warning This registration may need to wait for config ready. Maybe.
|
|
||||||
RegisterSystemToServer();
|
|
||||||
}
|
|
||||||
else if (r.Code == 404)
|
|
||||||
{
|
|
||||||
if (r.ContentString.Contains("codeNotFound"))
|
|
||||||
{
|
|
||||||
Debug.Console(0, "Authorization failed, code not found for system UUID {0}", SystemUuid);
|
|
||||||
}
|
|
||||||
else if (r.ContentString.Contains("uuidNotFound"))
|
|
||||||
{
|
|
||||||
Debug.Console(0, "Authorization failed, uuid {0} not found. Check Essentials configuration is correct",
|
|
||||||
SystemUuid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Debug.Console(0, this, "Error {0} in authorizing system", e);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "Error in authorizing: {0}", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Dumps info in response to console command.
|
|
||||||
/// </summary>
|
|
||||||
void ShowInfo()
|
|
||||||
{
|
|
||||||
var url = Config != null ? Config.ServerUrl : "No config";
|
|
||||||
string name;
|
|
||||||
string code;
|
|
||||||
if (RoomBridges != null && RoomBridges.Count > 0)
|
|
||||||
{
|
|
||||||
name = RoomBridges[0].RoomName;
|
|
||||||
code = RoomBridges[0].UserCode;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
name = "No config";
|
|
||||||
code = "Not available";
|
|
||||||
}
|
|
||||||
var conn = WSClient == null ? "No client" : (WSClient.Connected ? "Yes" : "No");
|
|
||||||
var secSinceLastAck = DateTime.Now - LastAckMessage;
|
|
||||||
|
|
||||||
|
|
||||||
CrestronConsole.ConsoleCommandResponse(@"Mobile Control Information:
|
|
||||||
Server address: {0}
|
|
||||||
System Name: {1}
|
|
||||||
System URL: {2}
|
|
||||||
System UUID: {3}
|
|
||||||
System User code: {4}
|
|
||||||
Connected?: {5}
|
|
||||||
Seconds Since Last Ack: {6}"
|
|
||||||
, url, name, ConfigReader.ConfigObject.SystemUrl, SystemUuid,
|
|
||||||
code, conn, secSinceLastAck.Seconds);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Registers the room with the server
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="url">URL of the server, including the port number, if not 80. Format: "serverUrlOrIp:port"</param>
|
|
||||||
void RegisterSystemToServer()
|
|
||||||
{
|
|
||||||
ConnectWebsocketClient();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Connects the Websocket Client
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="o"></param>
|
|
||||||
void ConnectWebsocketClient()
|
|
||||||
{
|
|
||||||
|
|
||||||
Debug.Console(1, this, "Initializing Stream client to server.");
|
|
||||||
|
|
||||||
if (WSClient != null)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Cleaning up previous socket");
|
|
||||||
CleanUpWebsocketClient();
|
|
||||||
}
|
|
||||||
|
|
||||||
WSClient = new WebSocketClient();
|
|
||||||
WSClient.URL = string.Format("wss://{0}/system/join/{1}", Config.ServerUrl, this.SystemUuid);
|
|
||||||
WSClient.ConnectionCallBack = Websocket_ConnectCallback;
|
|
||||||
WSClient.ConnectAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="code"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
int Websocket_ConnectCallback(WebSocketClient.WEBSOCKET_RESULT_CODES code)
|
|
||||||
{
|
|
||||||
if (code == WebSocketClient.WEBSOCKET_RESULT_CODES.WEBSOCKET_CLIENT_SUCCESS)
|
|
||||||
{
|
|
||||||
StopServerReconnectTimer();
|
|
||||||
Debug.Console(1, this, "Websocket connected");
|
|
||||||
WSClient.DisconnectCallBack = Websocket_DisconnectCallback;
|
|
||||||
WSClient.SendCallBack = Websocket_SendCallback;
|
|
||||||
WSClient.ReceiveCallBack = Websocket_ReceiveCallback;
|
|
||||||
WSClient.ReceiveAsync();
|
|
||||||
SendMessageObjectToServer(new
|
|
||||||
{
|
|
||||||
type = "hello"
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (code == WebSocketClient.WEBSOCKET_RESULT_CODES.WEBSOCKET_CLIENT_HTTP_HANDSHAKE_TOKEN_ERROR)
|
|
||||||
{
|
|
||||||
// This is the case when app server is running behind a websever and app server is down
|
|
||||||
Debug.Console(1, this, Debug.ErrorLogLevel.Warning, "Web socket connection failed. Check that app server is running behind web server");
|
|
||||||
}
|
|
||||||
else if (code == WebSocketClient.WEBSOCKET_RESULT_CODES.WEBSOCKET_CLIENT_SOCKET_CONNECTION_FAILED)
|
|
||||||
{
|
|
||||||
// this will be the case when webserver is unreachable
|
|
||||||
Debug.Console(1, this, Debug.ErrorLogLevel.Warning, "Web socket connection failed");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, Debug.ErrorLogLevel.Warning, "Web socket connection failure: {0}", code);
|
|
||||||
}
|
|
||||||
StartServerReconnectTimer();
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// After a "hello" from the server, sends config and stuff
|
|
||||||
/// </summary>
|
|
||||||
void SendInitialMessage()
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Sending initial join message");
|
|
||||||
var confObject = ConfigReader.ConfigObject;
|
|
||||||
confObject.Info.RuntimeInfo.AppName = Assembly.GetExecutingAssembly().GetName().Name;
|
|
||||||
var version = Assembly.GetExecutingAssembly().GetName().Version;
|
|
||||||
confObject.Info.RuntimeInfo.AssemblyVersion = string.Format("{0}.{1}.{2}", version.Major, version.Minor, version.Build);
|
|
||||||
|
|
||||||
var msg = new
|
|
||||||
{
|
|
||||||
type = "join",
|
|
||||||
content = new
|
|
||||||
{
|
|
||||||
config = confObject
|
|
||||||
}
|
|
||||||
};
|
|
||||||
SendMessageObjectToServer(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Sends any object type to server
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="o"></param>
|
|
||||||
public void SendMessageObjectToServer(object o)
|
|
||||||
{
|
|
||||||
SendMessageToServer(JObject.FromObject(o));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Sends a message to the server from a room
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="room">room from which the message originates</param>
|
|
||||||
/// <param name="o">object to be serialized and sent in post body</param>
|
|
||||||
public void SendMessageToServer(JObject o)
|
|
||||||
{
|
|
||||||
if (WSClient != null && WSClient.Connected)
|
|
||||||
{
|
|
||||||
string message = JsonConvert.SerializeObject(o, Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
|
|
||||||
|
|
||||||
if (!message.Contains("/system/heartbeat"))
|
|
||||||
Debug.Console(1, this, "Message TX: {0}", message);
|
|
||||||
//else
|
|
||||||
// Debug.Console(1, this, "TX messages contains /system/heartbeat");
|
|
||||||
|
|
||||||
var messageBytes = System.Text.Encoding.UTF8.GetBytes(message);
|
|
||||||
var result = WSClient.Send(messageBytes, (uint)messageBytes.Length, WebSocketClient.WEBSOCKET_PACKET_TYPES.LWS_WS_OPCODE_07__TEXT_FRAME);
|
|
||||||
if (result != WebSocketClient.WEBSOCKET_RESULT_CODES.WEBSOCKET_CLIENT_SUCCESS)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Socket send result error: {0}", result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (WSClient == null)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Cannot send. Not connected.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Disconnects the SSE Client and stops the heartbeat timer
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="command"></param>
|
|
||||||
void CleanUpWebsocketClient()
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Disconnecting websocket");
|
|
||||||
if (WSClient != null)
|
|
||||||
{
|
|
||||||
WSClient.SendCallBack = null;
|
|
||||||
WSClient.ReceiveCallBack = null;
|
|
||||||
WSClient.ConnectionCallBack = null;
|
|
||||||
WSClient.DisconnectCallBack = null;
|
|
||||||
if (WSClient.Connected)
|
|
||||||
{
|
|
||||||
WSClient.Disconnect();
|
|
||||||
}
|
|
||||||
WSClient = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="dueTime"></param>
|
|
||||||
/// <param name="repeatTime"></param>
|
|
||||||
void StartServerReconnectTimer()
|
|
||||||
{
|
|
||||||
StopServerReconnectTimer();
|
|
||||||
ServerReconnectTimer = new CTimer(ReconnectToServerTimerCallback, ServerReconnectInterval);
|
|
||||||
Debug.Console(1, this, "Reconnect Timer Started.");
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Does what it says
|
|
||||||
/// </summary>
|
|
||||||
void StopServerReconnectTimer()
|
|
||||||
{
|
|
||||||
if (ServerReconnectTimer != null)
|
|
||||||
{
|
|
||||||
ServerReconnectTimer.Stop();
|
|
||||||
ServerReconnectTimer = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Executes when we don't get a heartbeat message in time. Triggers reconnect.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="o">For CTimer callback. Not used</param>
|
|
||||||
void HeartbeatExpiredTimerCallback(object o)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Heartbeat Timer Expired.");
|
|
||||||
if (ServerHeartbeatCheckTimer != null)
|
|
||||||
{
|
|
||||||
ServerHeartbeatCheckTimer.Stop();
|
|
||||||
ServerHeartbeatCheckTimer = null;
|
|
||||||
}
|
|
||||||
CleanUpWebsocketClient();
|
|
||||||
StartServerReconnectTimer();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="dueTime"></param>
|
|
||||||
/// <param name="repeatTime"></param>
|
|
||||||
void ResetOrStartHearbeatTimer()
|
|
||||||
{
|
|
||||||
if (ServerHeartbeatCheckTimer == null)
|
|
||||||
{
|
|
||||||
ServerHeartbeatCheckTimer = new CTimer(HeartbeatExpiredTimerCallback, null, ServerHeartbeatInterval, ServerHeartbeatInterval);
|
|
||||||
Debug.Console(1, this, "Heartbeat Timer Started.");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ServerHeartbeatCheckTimer.Reset(ServerHeartbeatInterval, ServerHeartbeatInterval);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Waits two and goes again
|
|
||||||
/// </summary>
|
|
||||||
void ReconnectStreamClient()
|
|
||||||
{
|
|
||||||
new CTimer(o => ConnectWebsocketClient(), 2000);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="code"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
int Websocket_DisconnectCallback(WebSocketClient.WEBSOCKET_RESULT_CODES code, object o)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, Debug.ErrorLogLevel.Warning, "Websocket disconnected with code: {0}", code);
|
|
||||||
|
|
||||||
if (ServerHeartbeatCheckTimer != null)
|
|
||||||
ServerHeartbeatCheckTimer.Stop();
|
|
||||||
// Start the reconnect timer
|
|
||||||
StartServerReconnectTimer();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Resets reconnect timer and updates usercode
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="content"></param>
|
|
||||||
void HandleHeartBeat(JToken content)
|
|
||||||
{
|
|
||||||
SendMessageToServer(JObject.FromObject(new
|
|
||||||
{
|
|
||||||
type = "/system/heartbeatAck"
|
|
||||||
}));
|
|
||||||
|
|
||||||
var code = content["userCode"];
|
|
||||||
if(code != null)
|
|
||||||
{
|
|
||||||
foreach (var b in RoomBridges)
|
|
||||||
{
|
|
||||||
b.SetUserCode(code.Value<string>());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ResetOrStartHearbeatTimer();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Outputs debug info when enabled
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="req"></param>
|
|
||||||
/// <param name="r"></param>
|
|
||||||
/// <param name="e"></param>
|
|
||||||
void CheckHttpDebug(HttpClientResponse r, HTTP_CALLBACK_ERROR e)
|
|
||||||
{
|
|
||||||
if (HttpDebugEnabled)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "------ Begin HTTP Debug ---------------------------------------");
|
|
||||||
if (r != null)
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "HTTP Response URL: {0}", r.ResponseUrl != null ? r.ResponseUrl.ToString() : "NONE");
|
|
||||||
Debug.Console(0, this, "HTTP Response code: {0}", r.Code);
|
|
||||||
Debug.Console(0, this, "HTTP Response content: \r{0}", r.ContentString);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "No HTTP response");
|
|
||||||
}
|
|
||||||
Debug.Console(0, this, "HTTP Response 'error' {0}", e);
|
|
||||||
Debug.Console(0, this, "------ End HTTP Debug -----------------------------------------");
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "HttpDebugError: {0}", ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="data"></param>
|
|
||||||
/// <param name="length"></param>
|
|
||||||
/// <param name="opcode"></param>
|
|
||||||
/// <param name="err"></param>
|
|
||||||
int Websocket_ReceiveCallback(byte[] data, uint length, WebSocketClient.WEBSOCKET_PACKET_TYPES opcode,
|
|
||||||
WebSocketClient.WEBSOCKET_RESULT_CODES err)
|
|
||||||
{
|
|
||||||
if (opcode == WebSocketClient.WEBSOCKET_PACKET_TYPES.LWS_WS_OPCODE_07__TEXT_FRAME)
|
|
||||||
{
|
|
||||||
var rx = System.Text.Encoding.UTF8.GetString(data, 0, (int)length);
|
|
||||||
if (rx.Length > 0)
|
|
||||||
ParseStreamRx(rx);
|
|
||||||
WSClient.ReceiveAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (opcode == WebSocketClient.WEBSOCKET_PACKET_TYPES.LWS_WS_OPCODE_07__CLOSE)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Websocket disconnect received from remote");
|
|
||||||
CleanUpWebsocketClient();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "websocket rx opcode/err {0}/{1}", opcode, err);
|
|
||||||
WSClient.ReceiveAsync();
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Callback to catch possible errors in sending via the websocket
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="result"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
int Websocket_SendCallback(Crestron.SimplSharp.CrestronWebSocketClient.WebSocketClient.WEBSOCKET_RESULT_CODES result)
|
|
||||||
{
|
|
||||||
if(result != WebSocketClient.WEBSOCKET_RESULT_CODES.WEBSOCKET_CLIENT_SUCCESS)
|
|
||||||
Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "SendCallback questionable result: {0}", result);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sender"></param>
|
|
||||||
/// <param name="e"></param>
|
|
||||||
void ParseStreamRx(string message)
|
|
||||||
{
|
|
||||||
if(string.IsNullOrEmpty(message))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!message.Contains("/system/heartbeat"))
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Message RX: {0}", message);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LastAckMessage = DateTime.Now;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var messageObj = JObject.Parse(message);
|
|
||||||
|
|
||||||
var type = messageObj["type"].Value<string>();
|
|
||||||
|
|
||||||
if (type == "hello")
|
|
||||||
{
|
|
||||||
SendInitialMessage();
|
|
||||||
ResetOrStartHearbeatTimer();
|
|
||||||
}
|
|
||||||
else if (type == "/system/heartbeat")
|
|
||||||
{
|
|
||||||
HandleHeartBeat(messageObj["content"]);
|
|
||||||
}
|
|
||||||
else if (type == "raw")
|
|
||||||
{
|
|
||||||
var wrapper = messageObj["content"].ToObject<DeviceActionWrapper>();
|
|
||||||
DeviceJsonApi.DoDeviceAction(wrapper);
|
|
||||||
}
|
|
||||||
else if (type == "close")
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Received close message from server.");
|
|
||||||
// DisconnectWebsocketClient();
|
|
||||||
|
|
||||||
if (ServerHeartbeatCheckTimer != null)
|
|
||||||
ServerHeartbeatCheckTimer.Stop();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Check path against Action dictionary
|
|
||||||
if (ActionDictionary.ContainsKey(type))
|
|
||||||
{
|
|
||||||
var action = ActionDictionary[type];
|
|
||||||
|
|
||||||
if (action is Action)
|
|
||||||
{
|
|
||||||
(action as Action)();
|
|
||||||
}
|
|
||||||
else if (action is PressAndHoldAction)
|
|
||||||
{
|
|
||||||
var stateString = messageObj["content"]["state"].Value<string>();
|
|
||||||
|
|
||||||
// Look for a button press event
|
|
||||||
if (!string.IsNullOrEmpty(stateString))
|
|
||||||
{
|
|
||||||
switch (stateString)
|
|
||||||
{
|
|
||||||
case "true":
|
|
||||||
{
|
|
||||||
if (!PushedActions.ContainsKey(type))
|
|
||||||
{
|
|
||||||
PushedActions.Add(type, new CTimer(o =>
|
|
||||||
{
|
|
||||||
(action as PressAndHoldAction)(false);
|
|
||||||
PushedActions.Remove(type);
|
|
||||||
}, null, ButtonHeartbeatInterval, ButtonHeartbeatInterval));
|
|
||||||
}
|
|
||||||
// Maybe add an else to reset the timer
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "held":
|
|
||||||
{
|
|
||||||
if (PushedActions.ContainsKey(type))
|
|
||||||
{
|
|
||||||
PushedActions[type].Reset(ButtonHeartbeatInterval, ButtonHeartbeatInterval);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
case "false":
|
|
||||||
{
|
|
||||||
if (PushedActions.ContainsKey(type))
|
|
||||||
{
|
|
||||||
PushedActions[type].Stop();
|
|
||||||
PushedActions.Remove(type);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
(action as PressAndHoldAction)(stateString == "true");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (action is Action<bool>)
|
|
||||||
{
|
|
||||||
var stateString = messageObj["content"]["state"].Value<string>();
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(stateString))
|
|
||||||
{
|
|
||||||
(action as Action<bool>)(stateString == "true");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (action is Action<ushort>)
|
|
||||||
{
|
|
||||||
(action as Action<ushort>)(messageObj["content"]["value"].Value<ushort>());
|
|
||||||
}
|
|
||||||
else if (action is Action<string>)
|
|
||||||
{
|
|
||||||
(action as Action<string>)(messageObj["content"]["value"].Value<string>());
|
|
||||||
}
|
|
||||||
else if (action is Action<SourceSelectMessageContent>)
|
|
||||||
{
|
|
||||||
(action as Action<SourceSelectMessageContent>)(messageObj["content"]
|
|
||||||
.ToObject<SourceSelectMessageContent>());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "-- Warning: Incoming message has no registered handler");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception err)
|
|
||||||
{
|
|
||||||
//Debug.Console(1, "SseMessageLengthBeforeFailureCount: {0}", SseMessageLengthBeforeFailureCount);
|
|
||||||
//SseMessageLengthBeforeFailureCount = 0;
|
|
||||||
Debug.Console(1, this, "Unable to parse message: {0}", err);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void TestHttpRequest(string s)
|
|
||||||
{
|
|
||||||
{
|
|
||||||
s = s.Trim();
|
|
||||||
if (string.IsNullOrEmpty(s))
|
|
||||||
{
|
|
||||||
PrintTestHttpRequestUsage();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var tokens = s.Split(' ');
|
|
||||||
if (tokens.Length < 2)
|
|
||||||
{
|
|
||||||
CrestronConsole.ConsoleCommandResponse("Too few paramaters\r");
|
|
||||||
PrintTestHttpRequestUsage();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var url = tokens[1];
|
|
||||||
if (tokens[0].ToLower() == "get")
|
|
||||||
{
|
|
||||||
var resp = new HttpClient().Get(url);
|
|
||||||
CrestronConsole.ConsoleCommandResponse("RESPONSE:\r{0}\r\r", resp);
|
|
||||||
}
|
|
||||||
else if (tokens[0].ToLower() == "post")
|
|
||||||
{
|
|
||||||
var resp = new HttpClient().Post(url, new byte[] { });
|
|
||||||
CrestronConsole.ConsoleCommandResponse("RESPONSE:\r{0}\r\r", resp);
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CrestronConsole.ConsoleCommandResponse("Only get or post supported\r");
|
|
||||||
PrintTestHttpRequestUsage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (HttpException e)
|
|
||||||
{
|
|
||||||
CrestronConsole.ConsoleCommandResponse("Exception in request:\r");
|
|
||||||
CrestronConsole.ConsoleCommandResponse("Response URL: {0}\r", e.Response.ResponseUrl);
|
|
||||||
CrestronConsole.ConsoleCommandResponse("Response Error Code: {0}\r", e.Response.Code);
|
|
||||||
CrestronConsole.ConsoleCommandResponse("Response body: {0}\r", e.Response.ContentString);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void PrintTestHttpRequestUsage()
|
|
||||||
{
|
|
||||||
CrestronConsole.ConsoleCommandResponse("Usage: mobilehttprequest:N get/post url\r");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
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>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public abstract class MobileControlBridgeBase: Device
|
|
||||||
{
|
|
||||||
public MobileControlSystemController Parent { get; private set; }
|
|
||||||
|
|
||||||
public string UserCode { get; private set; }
|
|
||||||
|
|
||||||
public abstract string RoomName { get; }
|
|
||||||
|
|
||||||
public MobileControlBridgeBase(string key, string name)
|
|
||||||
: base(key, name)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Set the parent. Does nothing else. Override to add functionality such
|
|
||||||
/// as adding actions to parent
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="parent"></param>
|
|
||||||
public virtual void AddParent(MobileControlSystemController parent)
|
|
||||||
{
|
|
||||||
Parent = parent;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Sets the UserCode on the bridge object. Called from controller. A changed code will
|
|
||||||
/// fire method UserCodeChange. Override that to handle changes
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="code"></param>
|
|
||||||
public void SetUserCode(string code)
|
|
||||||
{
|
|
||||||
var changed = UserCode != code;
|
|
||||||
UserCode = code;
|
|
||||||
if (changed)
|
|
||||||
{
|
|
||||||
UserCodeChange();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Empty method in base class. Override this to add functionality
|
|
||||||
/// when code changes
|
|
||||||
/// </summary>
|
|
||||||
protected virtual void UserCodeChange()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,912 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharp.Reflection;
|
|
||||||
using Crestron.SimplSharpPro.EthernetCommunication;
|
|
||||||
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using Newtonsoft.Json.Linq;
|
|
||||||
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.AppServer.Messengers;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Core.Config;
|
|
||||||
using PepperDash.Essentials.Room.Config;
|
|
||||||
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Room.MobileControl
|
|
||||||
{
|
|
||||||
public class MobileControlDdvc01RoomBridge : MobileControlBridgeBase, IDelayedConfiguration
|
|
||||||
{
|
|
||||||
public class BoolJoin
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 301
|
|
||||||
/// </summary>
|
|
||||||
public const uint RoomIsOn = 301;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 12
|
|
||||||
/// </summary>
|
|
||||||
public const uint PrivacyMute = 12;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 41
|
|
||||||
/// </summary>
|
|
||||||
public const uint PromptForCode = 41;
|
|
||||||
/// <summary>
|
|
||||||
/// 42
|
|
||||||
/// </summary>
|
|
||||||
public const uint ClientJoined = 42;
|
|
||||||
/// <summary>
|
|
||||||
/// 51
|
|
||||||
/// </summary>
|
|
||||||
public const uint ActivityShare = 51;
|
|
||||||
/// <summary>
|
|
||||||
/// 52
|
|
||||||
/// </summary>
|
|
||||||
public const uint ActivityPhoneCall = 52;
|
|
||||||
/// <summary>
|
|
||||||
/// 53
|
|
||||||
/// </summary>
|
|
||||||
public const uint ActivityVideoCall = 53;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 1
|
|
||||||
/// </summary>
|
|
||||||
public const uint MasterVolumeIsMuted = 1;
|
|
||||||
/// <summary>
|
|
||||||
/// 1
|
|
||||||
/// </summary>
|
|
||||||
public const uint MasterVolumeMuteToggle = 1;
|
|
||||||
/// <summary>
|
|
||||||
/// 1
|
|
||||||
/// </summary>
|
|
||||||
public const uint VolumeMutesJoinStart = 1;
|
|
||||||
/// <summary>
|
|
||||||
/// 61
|
|
||||||
/// </summary>
|
|
||||||
public const uint ShutdownCancel = 61;
|
|
||||||
/// <summary>
|
|
||||||
/// 62
|
|
||||||
/// </summary>
|
|
||||||
public const uint ShutdownEnd = 62;
|
|
||||||
/// <summary>
|
|
||||||
/// 63
|
|
||||||
/// </summary>
|
|
||||||
public const uint ShutdownStart = 63;
|
|
||||||
/// <summary>
|
|
||||||
/// 72
|
|
||||||
/// </summary>
|
|
||||||
public const uint SourceHasChanged = 71;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 261 - The start of the range of speed dial visibles
|
|
||||||
/// </summary>
|
|
||||||
public const uint SpeedDialVisibleStartJoin = 261;
|
|
||||||
/// <summary>
|
|
||||||
/// 501
|
|
||||||
/// </summary>
|
|
||||||
public const uint ConfigIsReady = 501;
|
|
||||||
/// <summary>
|
|
||||||
/// 502
|
|
||||||
/// </summary>
|
|
||||||
public const uint HideVideoConfRecents = 502;
|
|
||||||
/// <summary>
|
|
||||||
/// 503
|
|
||||||
/// </summary>
|
|
||||||
public const uint ShowCameraWhenNotInCall = 503;
|
|
||||||
/// <summary>
|
|
||||||
/// 504
|
|
||||||
/// </summary>
|
|
||||||
public const uint UseSourceEnabled = 504;
|
|
||||||
/// <summary>
|
|
||||||
/// 601
|
|
||||||
/// </summary>
|
|
||||||
public const uint SourceShareDisableJoinStart = 601;
|
|
||||||
/// <summary>
|
|
||||||
/// 621
|
|
||||||
/// </summary>
|
|
||||||
public const uint SourceIsEnabledJoinStart = 621;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public class UshortJoin
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 1
|
|
||||||
/// </summary>
|
|
||||||
public const uint MasterVolumeLevel = 1;
|
|
||||||
/// <summary>
|
|
||||||
/// 1
|
|
||||||
/// </summary>
|
|
||||||
public const uint VolumeSlidersJoinStart = 1;
|
|
||||||
/// <summary>
|
|
||||||
/// 61
|
|
||||||
/// </summary>
|
|
||||||
public const uint ShutdownPromptDuration = 61;
|
|
||||||
/// <summary>
|
|
||||||
/// 101
|
|
||||||
/// </summary>
|
|
||||||
public const uint NumberOfAuxFaders = 101;
|
|
||||||
}
|
|
||||||
|
|
||||||
public class StringJoin
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 1
|
|
||||||
/// </summary>
|
|
||||||
public const uint VolumeSliderNamesJoinStart = 1;
|
|
||||||
/// <summary>
|
|
||||||
/// 71
|
|
||||||
/// </summary>
|
|
||||||
public const uint SelectedSourceKey = 71;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 241
|
|
||||||
/// </summary>
|
|
||||||
public const uint SpeedDialNameStartJoin = 241;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 251
|
|
||||||
/// </summary>
|
|
||||||
public const uint SpeedDialNumberStartJoin = 251;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 501
|
|
||||||
/// </summary>
|
|
||||||
public const uint ConfigRoomName = 501;
|
|
||||||
/// <summary>
|
|
||||||
/// 502
|
|
||||||
/// </summary>
|
|
||||||
public const uint ConfigHelpMessage = 502;
|
|
||||||
/// <summary>
|
|
||||||
/// 503
|
|
||||||
/// </summary>
|
|
||||||
public const uint ConfigHelpNumber = 503;
|
|
||||||
/// <summary>
|
|
||||||
/// 504
|
|
||||||
/// </summary>
|
|
||||||
public const uint ConfigRoomPhoneNumber = 504;
|
|
||||||
/// <summary>
|
|
||||||
/// 505
|
|
||||||
/// </summary>
|
|
||||||
public const uint ConfigRoomURI = 505;
|
|
||||||
/// <summary>
|
|
||||||
/// 401
|
|
||||||
/// </summary>
|
|
||||||
public const uint UserCodeToSystem = 401;
|
|
||||||
/// <summary>
|
|
||||||
/// 402
|
|
||||||
/// </summary>
|
|
||||||
public const uint ServerUrl = 402;
|
|
||||||
/// <summary>
|
|
||||||
/// 512
|
|
||||||
/// </summary>
|
|
||||||
public const uint RoomSpeedDialNamesJoinStart = 512;
|
|
||||||
/// <summary>
|
|
||||||
/// 516
|
|
||||||
/// </summary>
|
|
||||||
public const uint RoomSpeedDialNumberssJoinStart = 516;
|
|
||||||
/// <summary>
|
|
||||||
/// 601
|
|
||||||
/// </summary>
|
|
||||||
public const uint SourceNameJoinStart = 601;
|
|
||||||
/// <summary>
|
|
||||||
/// 621
|
|
||||||
/// </summary>
|
|
||||||
public const uint SourceIconJoinStart = 621;
|
|
||||||
/// <summary>
|
|
||||||
/// 641
|
|
||||||
/// </summary>
|
|
||||||
public const uint SourceKeyJoinStart = 641;
|
|
||||||
/// <summary>
|
|
||||||
/// 661
|
|
||||||
/// </summary>
|
|
||||||
public const uint SourceTypeJoinStart = 661;
|
|
||||||
/// <summary>
|
|
||||||
/// 761
|
|
||||||
/// </summary>
|
|
||||||
public const uint CameraNearNameStart = 761;
|
|
||||||
/// <summary>
|
|
||||||
/// 770 - presence of this name on the input will cause the camera to be added
|
|
||||||
/// </summary>
|
|
||||||
public const uint CameraFarName = 770;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Fires when config is ready to go
|
|
||||||
/// </summary>
|
|
||||||
public event EventHandler<EventArgs> ConfigurationIsReady;
|
|
||||||
|
|
||||||
public ThreeSeriesTcpIpEthernetIntersystemCommunications EISC { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public bool ConfigIsLoaded { get; private set; }
|
|
||||||
|
|
||||||
public override string RoomName
|
|
||||||
{
|
|
||||||
get {
|
|
||||||
var name = EISC.StringOutput[StringJoin.ConfigRoomName].StringValue;
|
|
||||||
return string.IsNullOrEmpty(name) ? "Not Loaded" : name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
MobileControlDdvc01DeviceBridge SourceBridge;
|
|
||||||
|
|
||||||
Ddvc01AtcMessenger AtcMessenger;
|
|
||||||
Ddvc01VtcMessenger VtcMessenger;
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="key"></param>
|
|
||||||
/// <param name="name"></param>
|
|
||||||
/// <param name="ipId"></param>
|
|
||||||
public MobileControlDdvc01RoomBridge(string key, string name, uint ipId)
|
|
||||||
: base(key, name)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
EISC = new ThreeSeriesTcpIpEthernetIntersystemCommunications(ipId, "127.0.0.2", Global.ControlSystem);
|
|
||||||
var reg = EISC.Register();
|
|
||||||
if (reg != Crestron.SimplSharpPro.eDeviceRegistrationUnRegistrationResponse.Success)
|
|
||||||
Debug.Console(0, this, "Cannot connect EISC at IPID {0}: \r{1}", ipId, reg);
|
|
||||||
|
|
||||||
SourceBridge = new MobileControlDdvc01DeviceBridge(key + "-sourceBridge", "DDVC01 source bridge", EISC);
|
|
||||||
DeviceManager.AddDevice(SourceBridge);
|
|
||||||
}
|
|
||||||
catch (Exception)
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Finish wiring up everything after all devices are created. The base class will hunt down the related
|
|
||||||
/// parent controller and link them up.
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
public override bool CustomActivate()
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "Final activation. Setting up actions and feedbacks");
|
|
||||||
SetupFunctions();
|
|
||||||
SetupFeedbacks();
|
|
||||||
|
|
||||||
var atcKey = string.Format("atc-{0}-{1}", this.Key, Parent.Key);
|
|
||||||
AtcMessenger = new Ddvc01AtcMessenger(atcKey, EISC, "/device/audioCodec");
|
|
||||||
AtcMessenger.RegisterWithAppServer(Parent);
|
|
||||||
|
|
||||||
var vtcKey = string.Format("atc-{0}-{1}", this.Key, Parent.Key);
|
|
||||||
VtcMessenger = new Ddvc01VtcMessenger(vtcKey, EISC, "/device/videoCodec");
|
|
||||||
VtcMessenger.RegisterWithAppServer(Parent);
|
|
||||||
|
|
||||||
EISC.SigChange += EISC_SigChange;
|
|
||||||
EISC.OnlineStatusChange += (o, a) =>
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "DDVC EISC online={0}. Config is ready={1}", a.DeviceOnLine, EISC.BooleanOutput[BoolJoin.ConfigIsReady].BoolValue);
|
|
||||||
if (a.DeviceOnLine && EISC.BooleanOutput[BoolJoin.ConfigIsReady].BoolValue)
|
|
||||||
LoadConfigValues();
|
|
||||||
};
|
|
||||||
// load config if it's already there
|
|
||||||
if (EISC.IsOnline && EISC.BooleanOutput[BoolJoin.ConfigIsReady].BoolValue) // || EISC.BooleanInput[BoolJoin.ConfigIsReady].BoolValue)
|
|
||||||
LoadConfigValues();
|
|
||||||
|
|
||||||
|
|
||||||
CrestronConsole.AddNewConsoleCommand(s =>
|
|
||||||
{
|
|
||||||
for (uint i = 1; i < 1000; i++)
|
|
||||||
{
|
|
||||||
if (s.ToLower().Equals("b"))
|
|
||||||
{
|
|
||||||
CrestronConsole.ConsoleCommandResponse("D{0,6} {1} - ", i, EISC.BooleanOutput[i].BoolValue);
|
|
||||||
}
|
|
||||||
else if (s.ToLower().Equals("u"))
|
|
||||||
{
|
|
||||||
CrestronConsole.ConsoleCommandResponse("U{0,6} {1,8} - ", i, EISC.UShortOutput[i].UShortValue);
|
|
||||||
}
|
|
||||||
else if (s.ToLower().Equals("s"))
|
|
||||||
{
|
|
||||||
var val = EISC.StringOutput[i].StringValue;
|
|
||||||
if(!string.IsNullOrEmpty(val))
|
|
||||||
CrestronConsole.ConsoleCommandResponse("S{0,6} {1}\r", i, EISC.StringOutput[i].StringValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}, "mobilebridgedump", "Dumps DDVC01 bridge EISC data b,u,s", ConsoleAccessLevelEnum.AccessOperator);
|
|
||||||
|
|
||||||
return base.CustomActivate();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Setup the actions to take place on various incoming API calls
|
|
||||||
/// </summary>
|
|
||||||
void SetupFunctions()
|
|
||||||
{
|
|
||||||
Parent.AddAction(@"/room/room1/promptForCode", new Action(() => EISC.PulseBool(BoolJoin.PromptForCode)));
|
|
||||||
Parent.AddAction(@"/room/room1/clientJoined", new Action(() => EISC.PulseBool(BoolJoin.ClientJoined)));
|
|
||||||
|
|
||||||
Parent.AddAction(@"/room/room1/status", new Action(SendFullStatus));
|
|
||||||
|
|
||||||
Parent.AddAction(@"/room/room1/source", new Action<SourceSelectMessageContent>(c =>
|
|
||||||
{
|
|
||||||
EISC.SetString(StringJoin.SelectedSourceKey, c.SourceListItem);
|
|
||||||
EISC.PulseBool(BoolJoin.SourceHasChanged);
|
|
||||||
}));
|
|
||||||
|
|
||||||
Parent.AddAction(@"/room/room1/defaultsource", new Action(() =>
|
|
||||||
EISC.PulseBool(BoolJoin.ActivityShare)));
|
|
||||||
Parent.AddAction(@"/room/room1/activityPhone", new Action(() =>
|
|
||||||
EISC.PulseBool(BoolJoin.ActivityPhoneCall)));
|
|
||||||
Parent.AddAction(@"/room/room1/activityVideo", new Action(() =>
|
|
||||||
EISC.PulseBool(BoolJoin.ActivityVideoCall)));
|
|
||||||
|
|
||||||
Parent.AddAction(@"/room/room1/volumes/master/level", new Action<ushort>(u =>
|
|
||||||
EISC.SetUshort(UshortJoin.MasterVolumeLevel, u)));
|
|
||||||
Parent.AddAction(@"/room/room1/volumes/master/muteToggle", new Action(() =>
|
|
||||||
EISC.PulseBool(BoolJoin.MasterVolumeIsMuted)));
|
|
||||||
Parent.AddAction(@"/room/room1/volumes/master/privacyMuteToggle", new Action(() =>
|
|
||||||
EISC.PulseBool(BoolJoin.PrivacyMute)));
|
|
||||||
|
|
||||||
|
|
||||||
// /xyzxyz/volumes/master/muteToggle ---> BoolInput[1]
|
|
||||||
|
|
||||||
for (uint i = 2; i <= 7; i++)
|
|
||||||
{
|
|
||||||
var index = i;
|
|
||||||
Parent.AddAction(string.Format(@"/room/room1/volumes/level-{0}/level", index), new Action<ushort>(u =>
|
|
||||||
EISC.SetUshort(index, u)));
|
|
||||||
Parent.AddAction(string.Format(@"/room/room1/volumes/level-{0}/muteToggle", index), new Action(() =>
|
|
||||||
EISC.PulseBool(index)));
|
|
||||||
}
|
|
||||||
|
|
||||||
Parent.AddAction(@"/room/room1/shutdownStart", new Action(() =>
|
|
||||||
EISC.PulseBool(BoolJoin.ShutdownStart)));
|
|
||||||
Parent.AddAction(@"/room/room1/shutdownEnd", new Action(() =>
|
|
||||||
EISC.PulseBool(BoolJoin.ShutdownEnd)));
|
|
||||||
Parent.AddAction(@"/room/room1/shutdownCancel", new Action(() =>
|
|
||||||
EISC.PulseBool(BoolJoin.ShutdownCancel)));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="devKey"></param>
|
|
||||||
void SetupSourceFunctions(string devKey)
|
|
||||||
{
|
|
||||||
SourceDeviceMapDictionary sourceJoinMap = new SourceDeviceMapDictionary();
|
|
||||||
|
|
||||||
var prefix = string.Format("/device/{0}/", devKey);
|
|
||||||
|
|
||||||
foreach (var item in sourceJoinMap)
|
|
||||||
{
|
|
||||||
var join = item.Value;
|
|
||||||
Parent.AddAction(string.Format("{0}{1}", prefix, item.Key), new PressAndHoldAction(b => EISC.SetBool(join, b)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Links feedbacks to whatever is gonna happen!
|
|
||||||
/// </summary>
|
|
||||||
void SetupFeedbacks()
|
|
||||||
{
|
|
||||||
// Power
|
|
||||||
EISC.SetBoolSigAction(BoolJoin.RoomIsOn, b =>
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
isOn = b
|
|
||||||
}));
|
|
||||||
|
|
||||||
// Source change things
|
|
||||||
EISC.SetSigTrueAction(BoolJoin.SourceHasChanged, () =>
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
selectedSourceKey = EISC.StringOutput[StringJoin.SelectedSourceKey].StringValue
|
|
||||||
}));
|
|
||||||
|
|
||||||
// Volume things
|
|
||||||
EISC.SetUShortSigAction(UshortJoin.MasterVolumeLevel, u =>
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
volumes = new
|
|
||||||
{
|
|
||||||
master = new
|
|
||||||
{
|
|
||||||
level = u
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
// map MasterVolumeIsMuted join -> status/volumes/master/muted
|
|
||||||
//
|
|
||||||
|
|
||||||
EISC.SetBoolSigAction(BoolJoin.MasterVolumeIsMuted, b =>
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
volumes = new
|
|
||||||
{
|
|
||||||
master = new
|
|
||||||
{
|
|
||||||
muted = b
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
EISC.SetBoolSigAction(BoolJoin.PrivacyMute, b =>
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
volumes = new
|
|
||||||
{
|
|
||||||
master = new
|
|
||||||
{
|
|
||||||
privacyMuted = b
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
for (uint i = 2; i <= 7; i++)
|
|
||||||
{
|
|
||||||
var index = i; // local scope for lambdas
|
|
||||||
EISC.SetUShortSigAction(index, u => // start at join 2
|
|
||||||
{
|
|
||||||
// need a dict in order to create the level-n property on auxFaders
|
|
||||||
var dict = new Dictionary<string, object>();
|
|
||||||
dict.Add("level-" + index, new { level = u });
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
volumes = new
|
|
||||||
{
|
|
||||||
auxFaders = dict,
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
EISC.SetBoolSigAction(index, b =>
|
|
||||||
{
|
|
||||||
// need a dict in order to create the level-n property on auxFaders
|
|
||||||
var dict = new Dictionary<string, object>();
|
|
||||||
dict.Add("level-" + index, new { muted = b });
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
volumes = new
|
|
||||||
{
|
|
||||||
auxFaders = dict,
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
EISC.SetUShortSigAction(UshortJoin.NumberOfAuxFaders, u =>
|
|
||||||
PostStatusMessage(new {
|
|
||||||
volumes = new {
|
|
||||||
numberOfAuxFaders = u,
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
// shutdown things
|
|
||||||
EISC.SetSigTrueAction(BoolJoin.ShutdownCancel, new Action(() =>
|
|
||||||
PostMessage("/room/shutdown/", new
|
|
||||||
{
|
|
||||||
state = "wasCancelled"
|
|
||||||
})));
|
|
||||||
EISC.SetSigTrueAction(BoolJoin.ShutdownEnd, new Action(() =>
|
|
||||||
PostMessage("/room/shutdown/", new
|
|
||||||
{
|
|
||||||
state = "hasFinished"
|
|
||||||
})));
|
|
||||||
EISC.SetSigTrueAction(BoolJoin.ShutdownStart, new Action(() =>
|
|
||||||
PostMessage("/room/shutdown/", new
|
|
||||||
{
|
|
||||||
state = "hasStarted",
|
|
||||||
duration = EISC.UShortOutput[UshortJoin.ShutdownPromptDuration].UShortValue
|
|
||||||
})));
|
|
||||||
|
|
||||||
// Config things
|
|
||||||
EISC.SetSigTrueAction(BoolJoin.ConfigIsReady, LoadConfigValues);
|
|
||||||
|
|
||||||
// Activity modes
|
|
||||||
EISC.SetSigTrueAction(BoolJoin.ActivityShare, () => UpdateActivity(1));
|
|
||||||
EISC.SetSigTrueAction(BoolJoin.ActivityPhoneCall, () => UpdateActivity(2));
|
|
||||||
EISC.SetSigTrueAction(BoolJoin.ActivityVideoCall, () => UpdateActivity(3));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Updates activity states
|
|
||||||
/// </summary>
|
|
||||||
void UpdateActivity(int mode)
|
|
||||||
{
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
activityMode = mode,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Reads in config values when the Simpl program is ready
|
|
||||||
/// </summary>
|
|
||||||
void LoadConfigValues()
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Loading configuration from DDVC01 EISC bridge");
|
|
||||||
ConfigIsLoaded = false;
|
|
||||||
|
|
||||||
var co = ConfigReader.ConfigObject;
|
|
||||||
|
|
||||||
co.Info.RuntimeInfo.AppName = Assembly.GetExecutingAssembly().GetName().Name;
|
|
||||||
var version = Assembly.GetExecutingAssembly().GetName().Version;
|
|
||||||
co.Info.RuntimeInfo.AssemblyVersion = string.Format("{0}.{1}.{2}", version.Major, version.Minor, version.Build);
|
|
||||||
|
|
||||||
//Room
|
|
||||||
//if (co.Rooms == null)
|
|
||||||
// always start fresh in case simpl changed
|
|
||||||
co.Rooms = new List<DeviceConfig>();
|
|
||||||
var rm = new DeviceConfig();
|
|
||||||
if (co.Rooms.Count == 0)
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "Adding room to config");
|
|
||||||
co.Rooms.Add(rm);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "Replacing Room[0] in config");
|
|
||||||
co.Rooms[0] = rm;
|
|
||||||
}
|
|
||||||
rm.Name = EISC.StringOutput[StringJoin.ConfigRoomName].StringValue;
|
|
||||||
rm.Key = "room1";
|
|
||||||
rm.Type = "ddvc01";
|
|
||||||
|
|
||||||
DDVC01RoomPropertiesConfig rmProps;
|
|
||||||
if (rm.Properties == null)
|
|
||||||
rmProps = new DDVC01RoomPropertiesConfig();
|
|
||||||
else
|
|
||||||
rmProps = JsonConvert.DeserializeObject<DDVC01RoomPropertiesConfig>(rm.Properties.ToString());
|
|
||||||
|
|
||||||
rmProps.Help = new EssentialsHelpPropertiesConfig();
|
|
||||||
rmProps.Help.CallButtonText = EISC.StringOutput[StringJoin.ConfigHelpNumber].StringValue;
|
|
||||||
rmProps.Help.Message = EISC.StringOutput[StringJoin.ConfigHelpMessage].StringValue;
|
|
||||||
|
|
||||||
rmProps.Environment = new EssentialsEnvironmentPropertiesConfig(); // enabled defaults to false
|
|
||||||
|
|
||||||
rmProps.RoomPhoneNumber = EISC.StringOutput[StringJoin.ConfigRoomPhoneNumber].StringValue;
|
|
||||||
rmProps.RoomURI = EISC.StringOutput[StringJoin.ConfigRoomURI].StringValue;
|
|
||||||
rmProps.SpeedDials = new List<DDVC01SpeedDial>();
|
|
||||||
|
|
||||||
// This MAY need a check
|
|
||||||
rmProps.AudioCodecKey = "audioCodec";
|
|
||||||
rmProps.VideoCodecKey = "videoCodec";
|
|
||||||
|
|
||||||
// volume control names
|
|
||||||
var volCount = EISC.UShortOutput[UshortJoin.NumberOfAuxFaders].UShortValue;
|
|
||||||
|
|
||||||
//// use Volumes object or?
|
|
||||||
//rmProps.VolumeSliderNames = new List<string>();
|
|
||||||
//for(uint i = 701; i <= 700 + volCount; i++)
|
|
||||||
//{
|
|
||||||
// rmProps.VolumeSliderNames.Add(EISC.StringInput[i].StringValue);
|
|
||||||
//}
|
|
||||||
|
|
||||||
// There should be Mobile Control devices in here, I think...
|
|
||||||
if(co.Devices == null)
|
|
||||||
co.Devices = new List<DeviceConfig>();
|
|
||||||
|
|
||||||
// clear out previous DDVC devices
|
|
||||||
co.Devices.RemoveAll(d =>
|
|
||||||
d.Key.StartsWith("source-", StringComparison.OrdinalIgnoreCase)
|
|
||||||
|| d.Key.Equals("audioCodec", StringComparison.OrdinalIgnoreCase)
|
|
||||||
|| d.Key.Equals("videoCodec", StringComparison.OrdinalIgnoreCase));
|
|
||||||
|
|
||||||
rmProps.SourceListKey = "default";
|
|
||||||
rm.Properties = JToken.FromObject(rmProps);
|
|
||||||
|
|
||||||
// Source list! This might be brutal!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
||||||
|
|
||||||
var groupMap = GetSourceGroupDictionary();
|
|
||||||
|
|
||||||
co.SourceLists = new Dictionary<string,Dictionary<string,SourceListItem>>();
|
|
||||||
var newSl = new Dictionary<string, SourceListItem>();
|
|
||||||
// add "none" source if VTC present
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(rmProps.VideoCodecKey))
|
|
||||||
{
|
|
||||||
var codecOsd = new SourceListItem()
|
|
||||||
{
|
|
||||||
Name = "None",
|
|
||||||
IncludeInSourceList = true,
|
|
||||||
Order = 1,
|
|
||||||
Type = eSourceListItemType.Route,
|
|
||||||
SourceKey = ""
|
|
||||||
};
|
|
||||||
newSl.Add("Source-None", codecOsd);
|
|
||||||
}
|
|
||||||
// add sources...
|
|
||||||
for (uint i = 0; i <= 19; i++)
|
|
||||||
{
|
|
||||||
var name = EISC.StringOutput[StringJoin.SourceNameJoinStart + i].StringValue;
|
|
||||||
if (EISC.BooleanOutput[BoolJoin.UseSourceEnabled].BoolValue
|
|
||||||
&& !EISC.BooleanOutput[BoolJoin.SourceIsEnabledJoinStart + i].BoolValue)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if(!EISC.BooleanOutput[BoolJoin.UseSourceEnabled].BoolValue && string.IsNullOrEmpty(name))
|
|
||||||
break;
|
|
||||||
var icon = EISC.StringOutput[StringJoin.SourceIconJoinStart + i].StringValue;
|
|
||||||
var key = EISC.StringOutput[StringJoin.SourceKeyJoinStart + i].StringValue;
|
|
||||||
var type = EISC.StringOutput[StringJoin.SourceTypeJoinStart + i].StringValue;
|
|
||||||
var disableShare = EISC.BooleanOutput[BoolJoin.SourceShareDisableJoinStart + i].BoolValue;
|
|
||||||
|
|
||||||
Debug.Console(0, this, "Adding source {0} '{1}'", key, name);
|
|
||||||
var newSLI = new SourceListItem{
|
|
||||||
Icon = icon,
|
|
||||||
Name = name,
|
|
||||||
Order = (int)i + 10,
|
|
||||||
SourceKey = key,
|
|
||||||
Type = eSourceListItemType.Route,
|
|
||||||
DisableCodecSharing = disableShare,
|
|
||||||
};
|
|
||||||
newSl.Add(key, newSLI);
|
|
||||||
|
|
||||||
string group = "genericsource";
|
|
||||||
if (groupMap.ContainsKey(type))
|
|
||||||
{
|
|
||||||
group = groupMap[type];
|
|
||||||
}
|
|
||||||
|
|
||||||
// add dev to devices list
|
|
||||||
var devConf = new DeviceConfig {
|
|
||||||
Group = group,
|
|
||||||
Key = key,
|
|
||||||
Name = name,
|
|
||||||
Type = type
|
|
||||||
};
|
|
||||||
co.Devices.Add(devConf);
|
|
||||||
|
|
||||||
if (group.ToLower().StartsWith("settopbox")) // Add others here as needed
|
|
||||||
{
|
|
||||||
SetupSourceFunctions(key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
co.SourceLists.Add("default", newSl);
|
|
||||||
|
|
||||||
// Build "audioCodec" config if we need
|
|
||||||
if (!string.IsNullOrEmpty(rmProps.AudioCodecKey))
|
|
||||||
{
|
|
||||||
var acFavs = new List<PepperDash.Essentials.Devices.Common.Codec.CodecActiveCallItem>();
|
|
||||||
for (uint i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
if (!EISC.GetBool(BoolJoin.SpeedDialVisibleStartJoin + i))
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
acFavs.Add(new PepperDash.Essentials.Devices.Common.Codec.CodecActiveCallItem()
|
|
||||||
{
|
|
||||||
Name = EISC.GetString(StringJoin.SpeedDialNameStartJoin + i),
|
|
||||||
Number = EISC.GetString(StringJoin.SpeedDialNumberStartJoin + i),
|
|
||||||
Type = PepperDash.Essentials.Devices.Common.Codec.eCodecCallType.Audio
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
var acProps = new
|
|
||||||
{
|
|
||||||
favorites = acFavs
|
|
||||||
};
|
|
||||||
|
|
||||||
var acStr = "audioCodec";
|
|
||||||
var acConf = new DeviceConfig()
|
|
||||||
{
|
|
||||||
Group = acStr,
|
|
||||||
Key = acStr,
|
|
||||||
Name = acStr,
|
|
||||||
Type = acStr,
|
|
||||||
Properties = JToken.FromObject(acProps)
|
|
||||||
};
|
|
||||||
co.Devices.Add(acConf);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Build Video codec config
|
|
||||||
if (!string.IsNullOrEmpty(rmProps.VideoCodecKey))
|
|
||||||
{
|
|
||||||
// No favorites, for now?
|
|
||||||
var favs = new List<PepperDash.Essentials.Devices.Common.Codec.CodecActiveCallItem>();
|
|
||||||
|
|
||||||
// cameras
|
|
||||||
var camsProps = new List<object>();
|
|
||||||
for (uint i = 0; i < 9; i++)
|
|
||||||
{
|
|
||||||
var name = EISC.GetString(i + StringJoin.CameraNearNameStart);
|
|
||||||
if (!string.IsNullOrEmpty(name))
|
|
||||||
{
|
|
||||||
camsProps.Add(new
|
|
||||||
{
|
|
||||||
name = name,
|
|
||||||
selector = "camera" + (i + 1),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var farName = EISC.GetString(StringJoin.CameraFarName);
|
|
||||||
if (!string.IsNullOrEmpty(farName))
|
|
||||||
{
|
|
||||||
camsProps.Add(new
|
|
||||||
{
|
|
||||||
name = farName,
|
|
||||||
selector = "cameraFar",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
var props = new
|
|
||||||
{
|
|
||||||
favorites = favs,
|
|
||||||
cameras = camsProps,
|
|
||||||
};
|
|
||||||
var str = "videoCodec";
|
|
||||||
var conf = new DeviceConfig()
|
|
||||||
{
|
|
||||||
Group = str,
|
|
||||||
Key = str,
|
|
||||||
Name = str,
|
|
||||||
Type = str,
|
|
||||||
Properties = JToken.FromObject(props)
|
|
||||||
};
|
|
||||||
co.Devices.Add(conf);
|
|
||||||
}
|
|
||||||
|
|
||||||
Debug.Console(0, this, "******* CONFIG FROM DDVC: \r{0}", JsonConvert.SerializeObject(ConfigReader.ConfigObject, Formatting.Indented));
|
|
||||||
|
|
||||||
var handler = ConfigurationIsReady;
|
|
||||||
if (handler != null)
|
|
||||||
{
|
|
||||||
handler(this, new EventArgs());
|
|
||||||
}
|
|
||||||
|
|
||||||
ConfigIsLoaded = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
void SendFullStatus()
|
|
||||||
{
|
|
||||||
if (ConfigIsLoaded)
|
|
||||||
{
|
|
||||||
var count = EISC.UShortOutput[UshortJoin.NumberOfAuxFaders].UShortValue;
|
|
||||||
|
|
||||||
Debug.Console(1, this, "The Fader Count is : {0}", count);
|
|
||||||
|
|
||||||
// build volumes object, serialize and put in content of method below
|
|
||||||
|
|
||||||
// Create auxFaders
|
|
||||||
var auxFaderDict = new Dictionary<string, Volume>();
|
|
||||||
for (uint i = 2; i <= count; i++)
|
|
||||||
{
|
|
||||||
auxFaderDict.Add("level-" + i,
|
|
||||||
new Volume("level-" + i,
|
|
||||||
EISC.UShortOutput[i].UShortValue,
|
|
||||||
EISC.BooleanOutput[i].BoolValue,
|
|
||||||
EISC.StringOutput[i].StringValue,
|
|
||||||
true,
|
|
||||||
"someting.png"));
|
|
||||||
}
|
|
||||||
|
|
||||||
var volumes = new Volumes();
|
|
||||||
|
|
||||||
volumes.Master = new Volume("master",
|
|
||||||
EISC.UShortOutput[UshortJoin.MasterVolumeLevel].UShortValue,
|
|
||||||
EISC.BooleanOutput[BoolJoin.MasterVolumeIsMuted].BoolValue,
|
|
||||||
EISC.StringOutput[1].StringValue,
|
|
||||||
true,
|
|
||||||
"something.png");
|
|
||||||
volumes.Master.HasPrivacyMute = true;
|
|
||||||
volumes.Master.PrivacyMuted = EISC.BooleanOutput[BoolJoin.PrivacyMute].BoolValue;
|
|
||||||
|
|
||||||
volumes.AuxFaders = auxFaderDict;
|
|
||||||
volumes.NumberOfAuxFaders = EISC.UShortInput[UshortJoin.NumberOfAuxFaders].UShortValue;
|
|
||||||
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
activityMode = GetActivityMode(),
|
|
||||||
isOn = EISC.BooleanOutput[BoolJoin.RoomIsOn].BoolValue,
|
|
||||||
selectedSourceKey = EISC.StringOutput[StringJoin.SelectedSourceKey].StringValue,
|
|
||||||
volumes = volumes
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
error = "systemNotReady"
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns the activity mode int
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
int GetActivityMode()
|
|
||||||
{
|
|
||||||
if (EISC.BooleanOutput[BoolJoin.ActivityPhoneCall].BoolValue) return 2;
|
|
||||||
else if (EISC.BooleanOutput[BoolJoin.ActivityShare].BoolValue) return 1;
|
|
||||||
else if (EISC.BooleanOutput[BoolJoin.ActivityVideoCall].BoolValue) return 3;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Helper for posting status message
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="contentObject">The contents of the content object</param>
|
|
||||||
void PostStatusMessage(object contentObject)
|
|
||||||
{
|
|
||||||
Parent.SendMessageToServer(JObject.FromObject(new
|
|
||||||
{
|
|
||||||
type = "/room/status/",
|
|
||||||
content = contentObject
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="messageType"></param>
|
|
||||||
/// <param name="contentObject"></param>
|
|
||||||
void PostMessage(string messageType, object contentObject)
|
|
||||||
{
|
|
||||||
Parent.SendMessageToServer(JObject.FromObject(new
|
|
||||||
{
|
|
||||||
type = messageType,
|
|
||||||
content = contentObject
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="currentDevice"></param>
|
|
||||||
/// <param name="args"></param>
|
|
||||||
void EISC_SigChange(object currentDevice, Crestron.SimplSharpPro.SigEventArgs args)
|
|
||||||
{
|
|
||||||
if (Debug.Level >= 1)
|
|
||||||
Debug.Console(1, this, "DDVC EISC change: {0} {1}={2}", args.Sig.Type, args.Sig.Number, args.Sig.StringValue);
|
|
||||||
var uo = args.Sig.UserObject;
|
|
||||||
if (uo is Action<bool>)
|
|
||||||
(uo as Action<bool>)(args.Sig.BoolValue);
|
|
||||||
else if (uo is Action<ushort>)
|
|
||||||
(uo as Action<ushort>)(args.Sig.UShortValue);
|
|
||||||
else if (uo is Action<string>)
|
|
||||||
(uo as Action<string>)(args.Sig.StringValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns the mapping of types to groups, for setting up devices.
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
Dictionary<string, string> GetSourceGroupDictionary()
|
|
||||||
{
|
|
||||||
//type, group
|
|
||||||
var d = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
|
|
||||||
{
|
|
||||||
{ "laptop", "pc" },
|
|
||||||
{ "pc", "pc" },
|
|
||||||
{ "wireless", "genericsource" },
|
|
||||||
{ "iptv", "settopbox" }
|
|
||||||
|
|
||||||
};
|
|
||||||
return d;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// updates the usercode from server
|
|
||||||
/// </summary>
|
|
||||||
protected override void UserCodeChange()
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Server user code changed: {0}", UserCode);
|
|
||||||
EISC.StringInput[StringJoin.UserCodeToSystem].StringValue = UserCode;
|
|
||||||
EISC.StringInput[StringJoin.ServerUrl].StringValue = Parent.Config.ClientAppUrl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,441 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using Newtonsoft.Json.Linq;
|
|
||||||
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.AppServer.Messengers;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Room.MobileControl;
|
|
||||||
using PepperDash.Essentials.Devices.Common.Codec;
|
|
||||||
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
|
||||||
using PepperDash.Essentials.Devices.Common.AudioCodec;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials
|
|
||||||
{
|
|
||||||
public class MobileConrolEssentialsHuddleSpaceRoomBridge : MobileControlBridgeBase
|
|
||||||
{
|
|
||||||
|
|
||||||
public EssentialsRoomBase Room { get; private set; }
|
|
||||||
|
|
||||||
public VideoCodecBaseMessenger VCMessenger { get; private set; }
|
|
||||||
|
|
||||||
public AudioCodecBaseMessenger ACMessenger { get; private set; }
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public override string RoomName
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return Room.Name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="parent"></param>
|
|
||||||
/// <param name="room"></param>
|
|
||||||
public MobileConrolEssentialsHuddleSpaceRoomBridge(EssentialsRoomBase room):
|
|
||||||
base("mobileControlBridge-essentialsHuddle", "Essentials Mobile Control Bridge-Huddle")
|
|
||||||
{
|
|
||||||
Room = room;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Override of base: calls base to add parent and then registers actions and events.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="parent"></param>
|
|
||||||
public override void AddParent(MobileControlSystemController parent)
|
|
||||||
{
|
|
||||||
base.AddParent(parent);
|
|
||||||
|
|
||||||
// we add actions to the messaging system with a path, and a related action. Custom action
|
|
||||||
// content objects can be handled in the controller's LineReceived method - and perhaps other
|
|
||||||
// sub-controller parsing could be attached to these classes, so that the systemController
|
|
||||||
// doesn't need to know about everything.
|
|
||||||
|
|
||||||
// Source Changes and room off
|
|
||||||
Parent.AddAction(string.Format(@"/room/{0}/status", Room.Key), new Action(() => SendFullStatus(Room)));
|
|
||||||
|
|
||||||
var routeRoom = Room as IRunRouteAction;
|
|
||||||
if(routeRoom != null)
|
|
||||||
Parent.AddAction(string.Format(@"/room/{0}/source", Room.Key), new Action<SourceSelectMessageContent>(c =>
|
|
||||||
routeRoom.RunRouteAction(c.SourceListItem)));
|
|
||||||
|
|
||||||
var defaultRoom = Room as IRunDefaultPresentRoute;
|
|
||||||
if(defaultRoom != null)
|
|
||||||
Parent.AddAction(string.Format(@"/room/{0}/defaultsource", Room.Key), new Action(() => defaultRoom.RunDefaultPresentRoute()));
|
|
||||||
|
|
||||||
var volumeRoom = Room as IHasCurrentVolumeControls;
|
|
||||||
if (volumeRoom != null)
|
|
||||||
{
|
|
||||||
Parent.AddAction(string.Format(@"/room/{0}/volumes/master/level", Room.Key), new Action<ushort>(u =>
|
|
||||||
(volumeRoom.CurrentVolumeControls as IBasicVolumeWithFeedback).SetVolume(u)));
|
|
||||||
Parent.AddAction(string.Format(@"/room/{0}/volumes/master/muteToggle", Room.Key), new Action(() =>
|
|
||||||
volumeRoom.CurrentVolumeControls.MuteToggle()));
|
|
||||||
volumeRoom.CurrentVolumeDeviceChange += new EventHandler<VolumeDeviceChangeEventArgs>(Room_CurrentVolumeDeviceChange);
|
|
||||||
|
|
||||||
// Registers for initial volume events, if possible
|
|
||||||
var currentVolumeDevice = volumeRoom.CurrentVolumeControls as IBasicVolumeWithFeedback;
|
|
||||||
if (currentVolumeDevice != null)
|
|
||||||
{
|
|
||||||
currentVolumeDevice.MuteFeedback.OutputChange += MuteFeedback_OutputChange;
|
|
||||||
currentVolumeDevice.VolumeLevelFeedback.OutputChange += VolumeLevelFeedback_OutputChange;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var sscRoom = Room as IHasCurrentSourceInfoChange;
|
|
||||||
if(sscRoom != null)
|
|
||||||
sscRoom.CurrentSourceChange += new SourceInfoChangeHandler(Room_CurrentSingleSourceChange);
|
|
||||||
|
|
||||||
var vcRoom = Room as IHasVideoCodec;
|
|
||||||
if (vcRoom != null && vcRoom.VideoCodec != null)
|
|
||||||
{
|
|
||||||
var codec = vcRoom.VideoCodec;
|
|
||||||
var key = vcRoom.VideoCodec.Key + "-" + parent.Key;
|
|
||||||
VCMessenger = new VideoCodecBaseMessenger(key, vcRoom.VideoCodec, "/device/videoCodec");
|
|
||||||
VCMessenger.RegisterWithAppServer(Parent);
|
|
||||||
|
|
||||||
vcRoom.IsSharingFeedback.OutputChange += new EventHandler<FeedbackEventArgs>(IsSharingFeedback_OutputChange);
|
|
||||||
}
|
|
||||||
|
|
||||||
var acRoom = Room as IHasAudioCodec;
|
|
||||||
if (acRoom != null && acRoom.AudioCodec != null)
|
|
||||||
{
|
|
||||||
var codec = acRoom.AudioCodec;
|
|
||||||
var key = acRoom.AudioCodec.Key + "-" + parent.Key;
|
|
||||||
ACMessenger = new AudioCodecBaseMessenger(key, acRoom.AudioCodec, "/device/audioCodec");
|
|
||||||
ACMessenger.RegisterWithAppServer(Parent);
|
|
||||||
}
|
|
||||||
|
|
||||||
var defCallRm = Room as IRunDefaultCallRoute;
|
|
||||||
if (defCallRm != null)
|
|
||||||
{
|
|
||||||
Parent.AddAction(string.Format(@"/room/{0}/activityVideo", Room.Key), new Action(()=>defCallRm.RunDefaultCallRoute()));
|
|
||||||
}
|
|
||||||
|
|
||||||
Parent.AddAction(string.Format(@"/room/{0}/shutdownStart", Room.Key), new Action(() => Room.StartShutdown(eShutdownType.Manual)));
|
|
||||||
Parent.AddAction(string.Format(@"/room/{0}/shutdownEnd", Room.Key), new Action(() => Room.ShutdownPromptTimer.Finish()));
|
|
||||||
Parent.AddAction(string.Format(@"/room/{0}/shutdownCancel", Room.Key), new Action(() => Room.ShutdownPromptTimer.Cancel()));
|
|
||||||
|
|
||||||
Room.OnFeedback.OutputChange += OnFeedback_OutputChange;
|
|
||||||
Room.IsCoolingDownFeedback.OutputChange += IsCoolingDownFeedback_OutputChange;
|
|
||||||
Room.IsWarmingUpFeedback.OutputChange += IsWarmingUpFeedback_OutputChange;
|
|
||||||
|
|
||||||
Room.ShutdownPromptTimer.HasStarted += ShutdownPromptTimer_HasStarted;
|
|
||||||
Room.ShutdownPromptTimer.HasFinished += ShutdownPromptTimer_HasFinished;
|
|
||||||
Room.ShutdownPromptTimer.WasCancelled += ShutdownPromptTimer_WasCancelled;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sender"></param>
|
|
||||||
/// <param name="e"></param>
|
|
||||||
void IsSharingFeedback_OutputChange(object sender, FeedbackEventArgs e)
|
|
||||||
{
|
|
||||||
// sharing source
|
|
||||||
string shareText;
|
|
||||||
bool isSharing;
|
|
||||||
#warning This share update needs to happen on source change as well!
|
|
||||||
var vcRoom = Room as IHasVideoCodec;
|
|
||||||
var srcInfoRoom = Room as IHasCurrentSourceInfoChange;
|
|
||||||
if (vcRoom.VideoCodec.SharingContentIsOnFeedback.BoolValue && srcInfoRoom.CurrentSourceInfo != null)
|
|
||||||
{
|
|
||||||
|
|
||||||
shareText = srcInfoRoom.CurrentSourceInfo.PreferredName;
|
|
||||||
isSharing = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
shareText = "None";
|
|
||||||
isSharing = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
share = new
|
|
||||||
{
|
|
||||||
currentShareText = shareText,
|
|
||||||
isSharing = isSharing
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Helper for posting status message
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="contentObject">The contents of the content object</param>
|
|
||||||
void PostStatusMessage(object contentObject)
|
|
||||||
{
|
|
||||||
Parent.SendMessageToServer(JObject.FromObject(new
|
|
||||||
{
|
|
||||||
type = "/room/status/",
|
|
||||||
content = contentObject
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handler for cancelled shutdown
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sender"></param>
|
|
||||||
/// <param name="e"></param>
|
|
||||||
void ShutdownPromptTimer_WasCancelled(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
JObject roomStatus = new JObject();
|
|
||||||
roomStatus.Add("state", "wasCancelled");
|
|
||||||
JObject message = new JObject();
|
|
||||||
message.Add("type", "/room/shutdown/");
|
|
||||||
message.Add("content", roomStatus);
|
|
||||||
Parent.SendMessageToServer(message);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handler for when shutdown finishes
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sender"></param>
|
|
||||||
/// <param name="e"></param>
|
|
||||||
void ShutdownPromptTimer_HasFinished(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
JObject roomStatus = new JObject();
|
|
||||||
roomStatus.Add("state", "hasFinished");
|
|
||||||
JObject message = new JObject();
|
|
||||||
message.Add("type", "/room/shutdown/");
|
|
||||||
message.Add("content", roomStatus);
|
|
||||||
Parent.SendMessageToServer(message);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handler for when shutdown starts
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sender"></param>
|
|
||||||
/// <param name="e"></param>
|
|
||||||
void ShutdownPromptTimer_HasStarted(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
JObject roomStatus = new JObject();
|
|
||||||
roomStatus.Add("state", "hasStarted");
|
|
||||||
roomStatus.Add("duration", Room.ShutdownPromptTimer.SecondsToCount);
|
|
||||||
JObject message = new JObject();
|
|
||||||
message.Add("type", "/room/shutdown/");
|
|
||||||
message.Add("content", roomStatus);
|
|
||||||
Parent.SendMessageToServer(message);
|
|
||||||
// equivalent JS message:
|
|
||||||
// Post( { type: '/room/status/', content: { shutdown: 'hasStarted', duration: Room.ShutdownPromptTimer.SecondsToCount })
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sender"></param>
|
|
||||||
/// <param name="e"></param>
|
|
||||||
void IsWarmingUpFeedback_OutputChange(object sender, FeedbackEventArgs e)
|
|
||||||
{
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
isWarmingUp = e.BoolValue
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sender"></param>
|
|
||||||
/// <param name="e"></param>
|
|
||||||
void IsCoolingDownFeedback_OutputChange(object sender, FeedbackEventArgs e)
|
|
||||||
{
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
isCoolingDown = e.BoolValue
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sender"></param>
|
|
||||||
/// <param name="e"></param>
|
|
||||||
void OnFeedback_OutputChange(object sender, FeedbackEventArgs e)
|
|
||||||
{
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
isOn = e.BoolValue
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void Room_CurrentVolumeDeviceChange(object sender, VolumeDeviceChangeEventArgs e)
|
|
||||||
{
|
|
||||||
if (e.OldDev is IBasicVolumeWithFeedback)
|
|
||||||
{
|
|
||||||
var oldDev = e.OldDev as IBasicVolumeWithFeedback;
|
|
||||||
oldDev.MuteFeedback.OutputChange -= MuteFeedback_OutputChange;
|
|
||||||
oldDev.VolumeLevelFeedback.OutputChange -= VolumeLevelFeedback_OutputChange;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (e.NewDev is IBasicVolumeWithFeedback)
|
|
||||||
{
|
|
||||||
var newDev = e.NewDev as IBasicVolumeWithFeedback;
|
|
||||||
newDev.MuteFeedback.OutputChange += MuteFeedback_OutputChange;
|
|
||||||
newDev.VolumeLevelFeedback.OutputChange += VolumeLevelFeedback_OutputChange;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Event handler for mute changes
|
|
||||||
/// </summary>
|
|
||||||
void MuteFeedback_OutputChange(object sender, FeedbackEventArgs e)
|
|
||||||
{
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
volumes = new
|
|
||||||
{
|
|
||||||
master = new
|
|
||||||
{
|
|
||||||
muted = e.BoolValue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles Volume changes on room
|
|
||||||
/// </summary>
|
|
||||||
void VolumeLevelFeedback_OutputChange(object sender, FeedbackEventArgs e)
|
|
||||||
{
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
volumes = new
|
|
||||||
{
|
|
||||||
master = new
|
|
||||||
{
|
|
||||||
level = e.IntValue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Room_CurrentSingleSourceChange(PepperDash.Essentials.Core.SourceListItem info, ChangeType type)
|
|
||||||
{
|
|
||||||
/* Example message
|
|
||||||
* {
|
|
||||||
"type":"/room/status",
|
|
||||||
"content": {
|
|
||||||
"selectedSourceKey": "off",
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
if (type == ChangeType.WillChange)
|
|
||||||
{
|
|
||||||
// Disconnect from previous source
|
|
||||||
|
|
||||||
if (info != null)
|
|
||||||
{
|
|
||||||
var previousDev = info.SourceDevice;
|
|
||||||
|
|
||||||
// device type interfaces
|
|
||||||
if (previousDev is ISetTopBoxControls)
|
|
||||||
(previousDev as ISetTopBoxControls).UnlinkActions(Parent);
|
|
||||||
// common interfaces
|
|
||||||
if (previousDev is IChannel)
|
|
||||||
(previousDev as IChannel).UnlinkActions(Parent);
|
|
||||||
if (previousDev is IColor)
|
|
||||||
(previousDev as IColor).UnlinkActions(Parent);
|
|
||||||
if (previousDev is IDPad)
|
|
||||||
(previousDev as IDPad).UnlinkActions(Parent);
|
|
||||||
if (previousDev is IDvr)
|
|
||||||
(previousDev as IDvr).UnlinkActions(Parent);
|
|
||||||
if (previousDev is INumericKeypad)
|
|
||||||
(previousDev as INumericKeypad).UnlinkActions(Parent);
|
|
||||||
if (previousDev is IPower)
|
|
||||||
(previousDev as IPower).UnlinkActions(Parent);
|
|
||||||
if (previousDev is ITransport)
|
|
||||||
(previousDev as ITransport).UnlinkActions(Parent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else // did change
|
|
||||||
{
|
|
||||||
if (info != null)
|
|
||||||
{
|
|
||||||
var dev = info.SourceDevice;
|
|
||||||
|
|
||||||
if (dev is ISetTopBoxControls)
|
|
||||||
(dev as ISetTopBoxControls).LinkActions(Parent);
|
|
||||||
if (dev is IChannel)
|
|
||||||
(dev as IChannel).LinkActions(Parent);
|
|
||||||
if (dev is IColor)
|
|
||||||
(dev as IColor).LinkActions(Parent);
|
|
||||||
if (dev is IDPad)
|
|
||||||
(dev as IDPad).LinkActions(Parent);
|
|
||||||
if (dev is IDvr)
|
|
||||||
(dev as IDvr).LinkActions(Parent);
|
|
||||||
if (dev is INumericKeypad)
|
|
||||||
(dev as INumericKeypad).LinkActions(Parent);
|
|
||||||
if (dev is IPower)
|
|
||||||
(dev as IPower).LinkActions(Parent);
|
|
||||||
if (dev is ITransport)
|
|
||||||
(dev as ITransport).LinkActions(Parent);
|
|
||||||
|
|
||||||
var srcRm = Room as IHasCurrentSourceInfoChange;
|
|
||||||
if (srcRm != null)
|
|
||||||
{
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
selectedSourceKey = srcRm.CurrentSourceInfoKey
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Posts the full status of the room to the server
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="room"></param>
|
|
||||||
void SendFullStatus(EssentialsRoomBase room)
|
|
||||||
{
|
|
||||||
var sourceKey = room is IHasCurrentSourceInfoChange ? (room as IHasCurrentSourceInfoChange).CurrentSourceInfoKey : null;
|
|
||||||
|
|
||||||
var rmVc = room as IHasCurrentVolumeControls;
|
|
||||||
var volumes = new Volumes();
|
|
||||||
if (rmVc != null)
|
|
||||||
{
|
|
||||||
var vc = rmVc.CurrentVolumeControls as IBasicVolumeWithFeedback;
|
|
||||||
if (vc != null)
|
|
||||||
{
|
|
||||||
volumes.Master = new Volume("master", vc.VolumeLevelFeedback.UShortValue, vc.MuteFeedback.BoolValue, "Volume", true, "");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PostStatusMessage(new
|
|
||||||
{
|
|
||||||
//calls = GetCallsMessageObject(),
|
|
||||||
isOn = room.OnFeedback.BoolValue,
|
|
||||||
selectedSourceKey = sourceKey,
|
|
||||||
//vtc = GetVtcCallsMessageObject(),
|
|
||||||
volumes = volumes
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public class SourceSelectMessageContent
|
|
||||||
{
|
|
||||||
public string SourceListItem { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="b"></param>
|
|
||||||
public delegate void PressAndHoldAction(bool b);
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,104 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Room.MobileControl
|
|
||||||
{
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Contains all of the default joins that map to API funtions
|
|
||||||
/// </summary>
|
|
||||||
public class SourceDeviceMapDictionary : Dictionary<string, uint>
|
|
||||||
{
|
|
||||||
|
|
||||||
public SourceDeviceMapDictionary(): base()
|
|
||||||
{
|
|
||||||
var dictionary = new Dictionary<string, uint>
|
|
||||||
{
|
|
||||||
{"preset01", 101},
|
|
||||||
{"preset02", 102},
|
|
||||||
{"preset03", 103},
|
|
||||||
{"preset04", 104},
|
|
||||||
{"preset05", 105},
|
|
||||||
{"preset06", 106},
|
|
||||||
{"preset07", 107},
|
|
||||||
{"preset08", 108},
|
|
||||||
{"preset09", 109},
|
|
||||||
{"preset10", 110},
|
|
||||||
{"preset11", 111},
|
|
||||||
{"preset12", 112},
|
|
||||||
{"preset13", 113},
|
|
||||||
{"preset14", 114},
|
|
||||||
{"preset15", 115},
|
|
||||||
{"preset16", 116},
|
|
||||||
{"preset17", 117},
|
|
||||||
{"preset18", 118},
|
|
||||||
{"preset19", 119},
|
|
||||||
{"preset20", 120},
|
|
||||||
{"preset21", 121},
|
|
||||||
{"preset22", 122},
|
|
||||||
{"preset23", 123},
|
|
||||||
{"preset24", 124},
|
|
||||||
|
|
||||||
{"num0", 130},
|
|
||||||
{"num1", 131},
|
|
||||||
{"num2", 132},
|
|
||||||
{"num3", 133},
|
|
||||||
{"num4", 134},
|
|
||||||
{"num5", 135},
|
|
||||||
{"num6", 136},
|
|
||||||
{"num7", 137},
|
|
||||||
{"num8", 138},
|
|
||||||
{"num9", 139},
|
|
||||||
{"numDash", 140},
|
|
||||||
{"numEnter", 141},
|
|
||||||
{"chanUp", 142},
|
|
||||||
{"chanDown", 143},
|
|
||||||
{"lastChan", 144},
|
|
||||||
{"exit", 145},
|
|
||||||
{"powerToggle", 146},
|
|
||||||
{"red", 147},
|
|
||||||
{"green", 148},
|
|
||||||
{"yellow", 149},
|
|
||||||
{"blue", 150},
|
|
||||||
{"video", 151},
|
|
||||||
{"previous", 152},
|
|
||||||
{"next", 153},
|
|
||||||
{"rewind", 154},
|
|
||||||
{"ffwd", 155},
|
|
||||||
{"closedCaption", 156},
|
|
||||||
{"stop", 157},
|
|
||||||
{"pause", 158},
|
|
||||||
{"up", 159},
|
|
||||||
{"down", 160},
|
|
||||||
{"left", 161},
|
|
||||||
{"right", 162},
|
|
||||||
{"settings", 163},
|
|
||||||
{"info", 164},
|
|
||||||
{"return", 165},
|
|
||||||
{"guide", 166},
|
|
||||||
{"reboot", 167},
|
|
||||||
{"dvrList", 168},
|
|
||||||
{"replay", 169},
|
|
||||||
{"play", 170},
|
|
||||||
{"select", 171},
|
|
||||||
{"record", 172},
|
|
||||||
{"menu", 173},
|
|
||||||
{"topMenu", 174},
|
|
||||||
{"prevTrack", 175},
|
|
||||||
{"nextTrack", 176},
|
|
||||||
{"powerOn", 177},
|
|
||||||
{"powerOff", 178},
|
|
||||||
{"dot", 179}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
foreach (var item in dictionary)
|
|
||||||
{
|
|
||||||
this.Add(item.Key, item.Value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Room.MobileControl
|
|
||||||
{
|
|
||||||
public class Volumes
|
|
||||||
{
|
|
||||||
[JsonProperty("master")]
|
|
||||||
public Volume Master { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("auxFaders")]
|
|
||||||
public Dictionary<string, Volume> AuxFaders { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("numberOfAuxFaders")]
|
|
||||||
public int NumberOfAuxFaders { get; set; }
|
|
||||||
|
|
||||||
public Volumes()
|
|
||||||
{
|
|
||||||
AuxFaders = new Dictionary<string, Volume>();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class Volume
|
|
||||||
{
|
|
||||||
[JsonProperty("key")]
|
|
||||||
public string Key { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("level")]
|
|
||||||
public ushort Level { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("muted")]
|
|
||||||
public bool Muted { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("label")]
|
|
||||||
public string Label { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("hasMute")]
|
|
||||||
public bool HasMute { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("hasPrivacyMute")]
|
|
||||||
public bool HasPrivacyMute { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("privacyMuted")]
|
|
||||||
public bool PrivacyMuted { get; set; }
|
|
||||||
|
|
||||||
|
|
||||||
[JsonProperty("muteIcon")]
|
|
||||||
public string MuteIcon { get; set; }
|
|
||||||
|
|
||||||
public Volume(string key, ushort level, bool muted, string label, bool hasMute, string muteIcon)
|
|
||||||
{
|
|
||||||
Key = key;
|
|
||||||
Level = level;
|
|
||||||
Muted = muted;
|
|
||||||
Label = label;
|
|
||||||
HasMute = hasMute;
|
|
||||||
MuteIcon = muteIcon;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -11,7 +11,7 @@ using PepperDash.Essentials.DM.AirMedia;
|
|||||||
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Core.Bridges
|
||||||
{
|
{
|
||||||
public static class AirMediaControllerApiExtensions
|
public static class AirMediaControllerApiExtensions
|
||||||
{
|
{
|
||||||
@@ -19,7 +19,7 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
{
|
{
|
||||||
AirMediaControllerJoinMap joinMap = new AirMediaControllerJoinMap();
|
AirMediaControllerJoinMap joinMap = new AirMediaControllerJoinMap();
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetJoinMapForDevice(joinMapKey);
|
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(joinMapSerialized))
|
if (!string.IsNullOrEmpty(joinMapSerialized))
|
||||||
joinMap = JsonConvert.DeserializeObject<AirMediaControllerJoinMap>(joinMapSerialized);
|
joinMap = JsonConvert.DeserializeObject<AirMediaControllerJoinMap>(joinMapSerialized);
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ using PepperDash.Essentials.Devices.Common;
|
|||||||
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Core.Bridges
|
||||||
{
|
{
|
||||||
public static class AppleTvApiExtensions
|
public static class AppleTvApiExtensions
|
||||||
{
|
{
|
||||||
@@ -19,7 +19,7 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
{
|
{
|
||||||
AppleTvJoinMap joinMap = new AppleTvJoinMap();
|
AppleTvJoinMap joinMap = new AppleTvJoinMap();
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetJoinMapForDevice(joinMapKey);
|
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
||||||
|
|
||||||
if(!string.IsNullOrEmpty(joinMapSerialized))
|
if(!string.IsNullOrEmpty(joinMapSerialized))
|
||||||
joinMap = JsonConvert.DeserializeObject<AppleTvJoinMap>(joinMapSerialized);
|
joinMap = JsonConvert.DeserializeObject<AppleTvJoinMap>(joinMapSerialized);
|
||||||
|
|||||||
@@ -1,300 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharpPro.EthernetCommunication;
|
|
||||||
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Core.Lighting;
|
|
||||||
using PepperDash.Essentials.Core.Devices;
|
|
||||||
using PepperDash.Essentials.Devices.Common;
|
|
||||||
using PepperDash.Essentials.Devices.Common.Cameras;
|
|
||||||
using PepperDash.Essentials.Core.Config;
|
|
||||||
using PepperDash.Essentials.Core.CrestronIO;
|
|
||||||
using PepperDash.Essentials.DM;
|
|
||||||
//using PepperDash.Essentials.Devices.Common.Cameras;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Base class for all bridge class variants
|
|
||||||
/// </summary>
|
|
||||||
public class BridgeBase : Device
|
|
||||||
{
|
|
||||||
public BridgeApi Api { get; private set; }
|
|
||||||
|
|
||||||
public BridgeBase(string key) :
|
|
||||||
base(key)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Base class for bridge API variants
|
|
||||||
/// </summary>
|
|
||||||
public abstract class BridgeApi : Device
|
|
||||||
{
|
|
||||||
public BridgeApi(string key) :
|
|
||||||
base(key)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Bridge API using EISC
|
|
||||||
/// </summary>
|
|
||||||
public class EiscApi : BridgeApi
|
|
||||||
{
|
|
||||||
public EiscApiPropertiesConfig PropertiesConfig { get; private set; }
|
|
||||||
|
|
||||||
public ThreeSeriesTcpIpEthernetIntersystemCommunications Eisc { get; private set; }
|
|
||||||
|
|
||||||
public EiscApi(DeviceConfig dc) :
|
|
||||||
base(dc.Key)
|
|
||||||
{
|
|
||||||
PropertiesConfig = JsonConvert.DeserializeObject<EiscApiPropertiesConfig>(dc.Properties.ToString());
|
|
||||||
|
|
||||||
Eisc = new ThreeSeriesTcpIpEthernetIntersystemCommunications(PropertiesConfig.Control.IpIdInt, PropertiesConfig.Control.TcpSshProperties.Address, Global.ControlSystem);
|
|
||||||
|
|
||||||
Eisc.SigChange += new Crestron.SimplSharpPro.DeviceSupport.SigEventHandler(Eisc_SigChange);
|
|
||||||
|
|
||||||
Eisc.Register();
|
|
||||||
|
|
||||||
AddPostActivationAction( () =>
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Linking Devices...");
|
|
||||||
|
|
||||||
foreach (var d in PropertiesConfig.Devices)
|
|
||||||
{
|
|
||||||
var device = DeviceManager.GetDeviceForKey(d.DeviceKey);
|
|
||||||
|
|
||||||
if (device != null)
|
|
||||||
{
|
|
||||||
if (device is IBridge) // Check for this first to allow bridges in plugins to override existing bridges that apply to the same type.
|
|
||||||
{
|
|
||||||
(device as IBridge).LinkToApi(Eisc, d.JoinStart, d.JoinMapKey);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if (device is PepperDash.Essentials.Core.Monitoring.SystemMonitorController)
|
|
||||||
{
|
|
||||||
(device as PepperDash.Essentials.Core.Monitoring.SystemMonitorController).LinkToApi(Eisc, d.JoinStart, d.JoinMapKey);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if (device is GenericComm)
|
|
||||||
{
|
|
||||||
(device as GenericComm).LinkToApi(Eisc, d.JoinStart, d.JoinMapKey);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if (device is CameraBase)
|
|
||||||
{
|
|
||||||
(device as CameraBase).LinkToApi(Eisc, d.JoinStart, d.JoinMapKey);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if (device is PepperDash.Essentials.Core.DisplayBase)
|
|
||||||
{
|
|
||||||
(device as DisplayBase).LinkToApi(Eisc, d.JoinStart, d.JoinMapKey);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if (device is DmChassisController) {
|
|
||||||
(device as DmChassisController).LinkToApi(Eisc, d.JoinStart, d.JoinMapKey);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if (device is DmBladeChassisController) {
|
|
||||||
(device as DmBladeChassisController).LinkToApi(Eisc, d.JoinStart, d.JoinMapKey);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if (device is DmpsRoutingController)
|
|
||||||
{
|
|
||||||
(device as DmpsRoutingController).LinkToApi(Eisc, d.JoinStart, d.JoinMapKey);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if (device is DmpsAudioOutputController)
|
|
||||||
{
|
|
||||||
(device as DmpsAudioOutputController).LinkToApi(Eisc, d.JoinStart, d.JoinMapKey);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if (device is DmTxControllerBase)
|
|
||||||
{
|
|
||||||
(device as DmTxControllerBase).LinkToApi(Eisc, d.JoinStart, d.JoinMapKey);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if (device is DmRmcControllerBase)
|
|
||||||
{
|
|
||||||
(device as DmRmcControllerBase).LinkToApi(Eisc, d.JoinStart, d.JoinMapKey);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if (device is GenericRelayDevice)
|
|
||||||
{
|
|
||||||
(device as GenericRelayDevice).LinkToApi(Eisc, d.JoinStart, d.JoinMapKey);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if (device is IDigitalInput)
|
|
||||||
{
|
|
||||||
(device as IDigitalInput).LinkToApi(Eisc, d.JoinStart, d.JoinMapKey);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if (device is AppleTV)
|
|
||||||
{
|
|
||||||
(device as AppleTV).LinkToApi(Eisc, d.JoinStart, d.JoinMapKey);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if (device is HdMdxxxCEController)
|
|
||||||
{
|
|
||||||
(device as HdMdxxxCEController).LinkToApi(Eisc, d.JoinStart, d.JoinMapKey);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if (device is LightingBase)
|
|
||||||
{
|
|
||||||
(device as LightingBase).LinkToApi(Eisc, d.JoinStart, d.JoinMapKey);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if (device is DigitalLogger)
|
|
||||||
{
|
|
||||||
(device as DigitalLogger).LinkToApi(Eisc, d.JoinStart, d.JoinMapKey);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if (device is PepperDash.Essentials.Devices.Common.Occupancy.GlsOccupancySensorBaseController)
|
|
||||||
{
|
|
||||||
(device as PepperDash.Essentials.Devices.Common.Occupancy.GlsOccupancySensorBaseController).LinkToApi(Eisc, d.JoinStart, d.JoinMapKey);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if (device is StatusSignController)
|
|
||||||
{
|
|
||||||
(device as StatusSignController).LinkToApi(Eisc, d.JoinStart, d.JoinMapKey);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if (device is C2nRthsController)
|
|
||||||
{
|
|
||||||
(device as C2nRthsController).LinkToApi(Eisc, d.JoinStart, d.JoinMapKey);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Debug.Console(1, this, "Devices Linked.");
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Used for debugging to trigger an action based on a join number and type
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="join"></param>
|
|
||||||
/// <param name="type"></param>
|
|
||||||
public void ExecuteJoinAction(uint join, string type, object state)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
switch (type.ToLower())
|
|
||||||
{
|
|
||||||
case "digital":
|
|
||||||
{
|
|
||||||
var uo = Eisc.BooleanOutput[join].UserObject as Action<bool>;
|
|
||||||
if (uo != null)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Executing Action: {0}", uo.ToString());
|
|
||||||
uo(Convert.ToBoolean(state));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Debug.Console(1, this, "User Action is null. Nothing to Execute");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "analog":
|
|
||||||
{
|
|
||||||
var uo = Eisc.BooleanOutput[join].UserObject as Action<ushort>;
|
|
||||||
if (uo != null)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Executing Action: {0}", uo.ToString());
|
|
||||||
uo(Convert.ToUInt16(state));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Debug.Console(1, this, "User Action is null. Nothing to Execute"); break;
|
|
||||||
}
|
|
||||||
case "serial":
|
|
||||||
{
|
|
||||||
var uo = Eisc.BooleanOutput[join].UserObject as Action<string>;
|
|
||||||
if (uo != null)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Executing Action: {0}", uo.ToString());
|
|
||||||
uo(Convert.ToString(state));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Debug.Console(1, this, "User Action is null. Nothing to Execute");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
Debug.Console(1, "Unknown join type. Use digital/serial/analog");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Error: {0}", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles incoming sig changes
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="currentDevice"></param>
|
|
||||||
/// <param name="args"></param>
|
|
||||||
void Eisc_SigChange(object currentDevice, Crestron.SimplSharpPro.SigEventArgs args)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (Debug.Level >= 1)
|
|
||||||
Debug.Console(1, this, "EiscApi change: {0} {1}={2}", args.Sig.Type, args.Sig.Number, args.Sig.StringValue);
|
|
||||||
var uo = args.Sig.UserObject;
|
|
||||||
if (uo != null)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Executing Action: {0}", uo.ToString());
|
|
||||||
if (uo is Action<bool>)
|
|
||||||
(uo as Action<bool>)(args.Sig.BoolValue);
|
|
||||||
else if (uo is Action<ushort>)
|
|
||||||
(uo as Action<ushort>)(args.Sig.UShortValue);
|
|
||||||
else if (uo is Action<string>)
|
|
||||||
(uo as Action<string>)(args.Sig.StringValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Debug.Console(2, this, "Error in Eisc_SigChange handler: {0}", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class EiscApiPropertiesConfig
|
|
||||||
{
|
|
||||||
[JsonProperty("control")]
|
|
||||||
public EssentialsControlPropertiesConfig Control { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("devices")]
|
|
||||||
public List<ApiDevice> Devices { get; set; }
|
|
||||||
|
|
||||||
|
|
||||||
public class ApiDevice
|
|
||||||
{
|
|
||||||
[JsonProperty("deviceKey")]
|
|
||||||
public string DeviceKey { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("joinStart")]
|
|
||||||
public uint JoinStart { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("joinMapKey")]
|
|
||||||
public string JoinMapKey { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -6,6 +6,7 @@ using Crestron.SimplSharp;
|
|||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
|
using PepperDash.Essentials.Core.Bridges;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core.Routing;
|
using PepperDash.Essentials.Core.Routing;
|
||||||
@@ -15,32 +16,21 @@ using Crestron.SimplSharpPro.EthernetCommunication;
|
|||||||
|
|
||||||
namespace PepperDash.Essentials
|
namespace PepperDash.Essentials
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Responsible for loading all of the device types for this library
|
||||||
|
/// </summary>
|
||||||
public class BridgeFactory
|
public class BridgeFactory
|
||||||
{
|
{
|
||||||
public static IKeyed GetDevice(DeviceConfig dc)
|
public BridgeFactory()
|
||||||
{
|
{
|
||||||
// ? why is this static JTA 2018-06-13?
|
var eiscApiAdvancedFactory = new EiscApiAdvancedFactory() as IDeviceFactory;
|
||||||
|
eiscApiAdvancedFactory.LoadTypeFactories();
|
||||||
|
|
||||||
var key = dc.Key;
|
var eiscApiFactory = new EiscApiFactory() as IDeviceFactory;
|
||||||
var name = dc.Name;
|
eiscApiFactory.LoadTypeFactories();
|
||||||
var type = dc.Type;
|
|
||||||
var properties = dc.Properties;
|
|
||||||
var propAnon = new { };
|
|
||||||
|
|
||||||
var typeName = dc.Type.ToLower();
|
|
||||||
var groupName = dc.Group.ToLower();
|
|
||||||
|
|
||||||
//Debug.Console(2, "Name {0}, Key {1}, Type {2}, Properties {3}", name, key, type, properties.ToString());
|
|
||||||
|
|
||||||
if (typeName == "eiscapi")
|
|
||||||
{
|
|
||||||
return new EiscApi(dc);
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public class CommBridge : Device
|
public class CommBridge : Device
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ using PepperDash.Core;
|
|||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using PepperDash.Essentials.Core.CrestronIO;
|
using PepperDash.Essentials.Core.CrestronIO;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Core.Bridges
|
||||||
{
|
{
|
||||||
public static class C2nRthsControllerApiExtensions
|
public static class C2nRthsControllerApiExtensions
|
||||||
{
|
{
|
||||||
@@ -13,7 +13,7 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
{
|
{
|
||||||
var joinMap = new C2nRthsControllerJoinMap();
|
var joinMap = new C2nRthsControllerJoinMap();
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetJoinMapForDevice(joinMapKey);
|
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(joinMapSerialized))
|
if (!string.IsNullOrEmpty(joinMapSerialized))
|
||||||
joinMap = JsonConvert.DeserializeObject<C2nRthsControllerJoinMap>(joinMapSerialized);
|
joinMap = JsonConvert.DeserializeObject<C2nRthsControllerJoinMap>(joinMapSerialized);
|
||||||
|
|||||||
@@ -11,33 +11,35 @@ using PepperDash.Essentials.Devices.Common.Cameras;
|
|||||||
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Core.Bridges
|
||||||
{
|
{
|
||||||
public static class CameraControllerApiExtensions
|
public static class CameraControllerApiExtensions
|
||||||
{
|
{
|
||||||
|
public static void LinkToApi(this PepperDash.Essentials.Devices.Common.Cameras.CameraBase cameraDevice, BasicTriList trilist, uint joinStart, string joinMapKey, EiscApi bridge)
|
||||||
public static void LinkToApi(this PepperDash.Essentials.Devices.Common.Cameras.CameraBase cameraDevice, BasicTriList trilist, uint joinStart, string joinMapKey)
|
|
||||||
{
|
{
|
||||||
CameraControllerJoinMap joinMap = new CameraControllerJoinMap();
|
CameraControllerJoinMap joinMap = new CameraControllerJoinMap(joinStart);
|
||||||
|
|
||||||
|
// Adds the join map to the bridge
|
||||||
|
bridge.AddJoinMap(cameraDevice.Key, joinMap);
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetJoinMapForDevice(joinMapKey);
|
var customJoins = JoinMapHelper.TryGetJoinMapAdvancedForDevice(joinMapKey);
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(joinMapSerialized))
|
if (customJoins != null)
|
||||||
joinMap = JsonConvert.DeserializeObject<CameraControllerJoinMap>(joinMapSerialized);
|
{
|
||||||
|
joinMap.SetCustomJoinData(customJoins);
|
||||||
joinMap.OffsetJoinNumbers(joinStart);
|
}
|
||||||
|
|
||||||
Debug.Console(1, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
|
Debug.Console(1, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
|
||||||
Debug.Console(0, "Linking to Bridge Type {0}", cameraDevice.GetType().Name.ToString());
|
Debug.Console(0, "Linking to Bridge Type {0}", cameraDevice.GetType().Name.ToString());
|
||||||
|
|
||||||
var commMonitor = cameraDevice as ICommunicationMonitor;
|
var commMonitor = cameraDevice as ICommunicationMonitor;
|
||||||
commMonitor.CommunicationMonitor.IsOnlineFeedback.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline]);
|
commMonitor.CommunicationMonitor.IsOnlineFeedback.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline.JoinNumber]);
|
||||||
|
|
||||||
var ptzCamera = cameraDevice as IHasCameraPtzControl;
|
var ptzCamera = cameraDevice as IHasCameraPtzControl;
|
||||||
|
|
||||||
if (ptzCamera != null)
|
if (ptzCamera != null)
|
||||||
{
|
{
|
||||||
trilist.SetBoolSigAction(joinMap.Left, (b) =>
|
trilist.SetBoolSigAction(joinMap.PanLeft.JoinNumber, (b) =>
|
||||||
{
|
{
|
||||||
if (b)
|
if (b)
|
||||||
{
|
{
|
||||||
@@ -48,7 +50,7 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
ptzCamera.PanStop();
|
ptzCamera.PanStop();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
trilist.SetBoolSigAction(joinMap.Right, (b) =>
|
trilist.SetBoolSigAction(joinMap.PanRight.JoinNumber, (b) =>
|
||||||
{
|
{
|
||||||
if (b)
|
if (b)
|
||||||
{
|
{
|
||||||
@@ -60,7 +62,7 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
trilist.SetBoolSigAction(joinMap.Up, (b) =>
|
trilist.SetBoolSigAction(joinMap.TiltUp.JoinNumber, (b) =>
|
||||||
{
|
{
|
||||||
if (b)
|
if (b)
|
||||||
{
|
{
|
||||||
@@ -71,7 +73,7 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
ptzCamera.TiltStop();
|
ptzCamera.TiltStop();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
trilist.SetBoolSigAction(joinMap.Down, (b) =>
|
trilist.SetBoolSigAction(joinMap.TiltDown.JoinNumber, (b) =>
|
||||||
{
|
{
|
||||||
if (b)
|
if (b)
|
||||||
{
|
{
|
||||||
@@ -83,7 +85,7 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
trilist.SetBoolSigAction(joinMap.ZoomIn, (b) =>
|
trilist.SetBoolSigAction(joinMap.ZoomIn.JoinNumber, (b) =>
|
||||||
{
|
{
|
||||||
if (b)
|
if (b)
|
||||||
{
|
{
|
||||||
@@ -95,7 +97,7 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
trilist.SetBoolSigAction(joinMap.ZoomOut, (b) =>
|
trilist.SetBoolSigAction(joinMap.ZoomOut.JoinNumber, (b) =>
|
||||||
{
|
{
|
||||||
if (b)
|
if (b)
|
||||||
{
|
{
|
||||||
@@ -108,27 +110,57 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cameraDevice.GetType().Name.ToString().ToLower() == "cameravisca")
|
if (cameraDevice is IPower)
|
||||||
{
|
{
|
||||||
var viscaCamera = cameraDevice as PepperDash.Essentials.Devices.Common.Cameras.CameraVisca;
|
var powerCamera = cameraDevice as IPower;
|
||||||
trilist.SetSigTrueAction(joinMap.PowerOn, () => viscaCamera.PowerOn());
|
trilist.SetSigTrueAction(joinMap.PowerOn.JoinNumber, () => powerCamera.PowerOn());
|
||||||
trilist.SetSigTrueAction(joinMap.PowerOff, () => viscaCamera.PowerOff());
|
trilist.SetSigTrueAction(joinMap.PowerOff.JoinNumber, () => powerCamera.PowerOff());
|
||||||
|
|
||||||
|
powerCamera.PowerIsOnFeedback.LinkInputSig(trilist.BooleanInput[joinMap.PowerOn.JoinNumber]);
|
||||||
|
powerCamera.PowerIsOnFeedback.LinkComplementInputSig(trilist.BooleanInput[joinMap.PowerOff.JoinNumber]);
|
||||||
|
}
|
||||||
|
|
||||||
viscaCamera.PowerIsOnFeedback.LinkInputSig(trilist.BooleanInput[joinMap.PowerOn]);
|
if (cameraDevice is ICommunicationMonitor)
|
||||||
viscaCamera.PowerIsOnFeedback.LinkComplementInputSig(trilist.BooleanInput[joinMap.PowerOff]);
|
{
|
||||||
|
var monitoredCamera = cameraDevice as ICommunicationMonitor;
|
||||||
|
monitoredCamera.CommunicationMonitor.IsOnlineFeedback.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline.JoinNumber]);
|
||||||
|
}
|
||||||
|
|
||||||
viscaCamera.CommunicationMonitor.IsOnlineFeedback.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline]);
|
if (cameraDevice is IHasCameraPresets)
|
||||||
for (int i = 0; i < joinMap.NumberOfPresets; i++)
|
{
|
||||||
|
// Set the preset lables when they change
|
||||||
|
var presetsCamera = cameraDevice as IHasCameraPresets;
|
||||||
|
presetsCamera.PresetsListHasChanged += new EventHandler<EventArgs>((o, a) =>
|
||||||
|
{
|
||||||
|
for (int i = 1; i <= joinMap.NumberOfPresets.JoinNumber; i++)
|
||||||
|
{
|
||||||
|
int tempNum = i - 1;
|
||||||
|
|
||||||
|
string label = "" ;
|
||||||
|
|
||||||
|
var preset = presetsCamera.Presets.FirstOrDefault(p => p.ID.Equals(i));
|
||||||
|
|
||||||
|
if (preset != null)
|
||||||
|
label = preset.Description;
|
||||||
|
|
||||||
|
trilist.SetString((ushort)(joinMap.PresetLabelStart.JoinNumber + tempNum), label);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
for (int i = 0; i < joinMap.NumberOfPresets.JoinNumber; i++)
|
||||||
{
|
{
|
||||||
int tempNum = i;
|
int tempNum = i;
|
||||||
trilist.SetSigTrueAction((ushort)(joinMap.PresetRecallOffset + tempNum), () =>
|
|
||||||
|
trilist.SetSigTrueAction((ushort)(joinMap.PresetRecallStart.JoinNumber + tempNum), () =>
|
||||||
{
|
{
|
||||||
viscaCamera.RecallPreset(tempNum);
|
presetsCamera.PresetSelect(tempNum);
|
||||||
|
});
|
||||||
|
trilist.SetSigTrueAction((ushort)(joinMap.PresetSaveStart.JoinNumber + tempNum), () =>
|
||||||
|
{
|
||||||
|
var label = trilist.GetString((ushort)(joinMap.PresetLabelStart.JoinNumber + tempNum));
|
||||||
|
|
||||||
|
presetsCamera.PresetStore(tempNum, label);
|
||||||
});
|
});
|
||||||
trilist.SetSigTrueAction((ushort)(joinMap.PresetSaveOffset + tempNum), () =>
|
|
||||||
{
|
|
||||||
viscaCamera.SavePreset(tempNum);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Devices.Common;
|
|
||||||
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
|
||||||
{
|
|
||||||
public static class DigitalLoggerApiExtensions
|
|
||||||
{
|
|
||||||
public static void LinkToApi(this DigitalLogger DigitalLogger, BasicTriList trilist, uint joinStart, string joinMapKey)
|
|
||||||
{
|
|
||||||
DigitalLoggerJoinMap joinMap = new DigitalLoggerJoinMap();
|
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetJoinMapForDevice(joinMapKey);
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(joinMapSerialized))
|
|
||||||
joinMap = JsonConvert.DeserializeObject<DigitalLoggerJoinMap>(joinMapSerialized);
|
|
||||||
|
|
||||||
joinMap.OffsetJoinNumbers(joinStart);
|
|
||||||
|
|
||||||
Debug.Console(1, DigitalLogger, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
|
|
||||||
for (uint i = 1; i <= DigitalLogger.CircuitCount; i++)
|
|
||||||
{
|
|
||||||
var circuit = i;
|
|
||||||
DigitalLogger.CircuitNameFeedbacks[circuit - 1].LinkInputSig(trilist.StringInput[joinMap.CircuitNames + circuit]);
|
|
||||||
DigitalLogger.CircuitIsCritical[circuit - 1].LinkInputSig(trilist.BooleanInput[joinMap.CircuitIsCritical + circuit]);
|
|
||||||
DigitalLogger.CircuitState[circuit - 1].LinkInputSig(trilist.BooleanInput[joinMap.CircuitState + circuit]);
|
|
||||||
trilist.SetSigTrueAction(joinMap.CircuitCycle + circuit, () => DigitalLogger.CycleCircuit(circuit - 1));
|
|
||||||
trilist.SetSigTrueAction(joinMap.CircuitOnCmd + circuit, () => DigitalLogger.TurnOnCircuit(circuit - 1));
|
|
||||||
trilist.SetSigTrueAction(joinMap.CircuitOffCmd + circuit, () => DigitalLogger.TurnOffCircuit(circuit - 1));
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,153 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Devices.Common;
|
|
||||||
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
|
||||||
{
|
|
||||||
public static class DisplayControllerApiExtensions
|
|
||||||
{
|
|
||||||
public static void LinkToApi(this PepperDash.Essentials.Core.DisplayBase displayDevice, BasicTriList trilist, uint joinStart, string joinMapKey)
|
|
||||||
{
|
|
||||||
int inputNumber = 0;
|
|
||||||
IntFeedback inputNumberFeedback;
|
|
||||||
List<string> inputKeys = new List<string>();
|
|
||||||
|
|
||||||
DisplayControllerJoinMap joinMap = new DisplayControllerJoinMap();
|
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetJoinMapForDevice(joinMapKey);
|
|
||||||
|
|
||||||
if(!string.IsNullOrEmpty(joinMapSerialized))
|
|
||||||
joinMap = JsonConvert.DeserializeObject<DisplayControllerJoinMap>(joinMapSerialized);
|
|
||||||
|
|
||||||
joinMap.OffsetJoinNumbers(joinStart);
|
|
||||||
|
|
||||||
Debug.Console(1, "Linking to Trilist '{0}'",trilist.ID.ToString("X"));
|
|
||||||
Debug.Console(0, "Linking to Display: {0}", displayDevice.Name);
|
|
||||||
|
|
||||||
trilist.StringInput[joinMap.Name].StringValue = displayDevice.Name;
|
|
||||||
|
|
||||||
var commMonitor = displayDevice as ICommunicationMonitor;
|
|
||||||
if (commMonitor != null)
|
|
||||||
{
|
|
||||||
commMonitor.CommunicationMonitor.IsOnlineFeedback.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline]);
|
|
||||||
}
|
|
||||||
|
|
||||||
inputNumberFeedback = new IntFeedback(() => { return inputNumber; });
|
|
||||||
|
|
||||||
// Two way feedbacks
|
|
||||||
var twoWayDisplay = displayDevice as PepperDash.Essentials.Core.TwoWayDisplayBase;
|
|
||||||
if (twoWayDisplay != null)
|
|
||||||
{
|
|
||||||
trilist.SetBool(joinMap.IsTwoWayDisplay, true);
|
|
||||||
|
|
||||||
twoWayDisplay.CurrentInputFeedback.OutputChange += new EventHandler<FeedbackEventArgs>(CurrentInputFeedback_OutputChange);
|
|
||||||
|
|
||||||
|
|
||||||
inputNumberFeedback.LinkInputSig(trilist.UShortInput[joinMap.InputSelect]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Power Off
|
|
||||||
trilist.SetSigTrueAction(joinMap.PowerOff, () =>
|
|
||||||
{
|
|
||||||
inputNumber = 102;
|
|
||||||
inputNumberFeedback.FireUpdate();
|
|
||||||
displayDevice.PowerOff();
|
|
||||||
});
|
|
||||||
|
|
||||||
displayDevice.PowerIsOnFeedback.OutputChange += new EventHandler<FeedbackEventArgs>( (o,a) => {
|
|
||||||
if (!a.BoolValue)
|
|
||||||
{
|
|
||||||
inputNumber = 102;
|
|
||||||
inputNumberFeedback.FireUpdate();
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
inputNumber = 0;
|
|
||||||
inputNumberFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
displayDevice.PowerIsOnFeedback.LinkComplementInputSig(trilist.BooleanInput[joinMap.PowerOff]);
|
|
||||||
|
|
||||||
// PowerOn
|
|
||||||
trilist.SetSigTrueAction(joinMap.PowerOn, () =>
|
|
||||||
{
|
|
||||||
inputNumber = 0;
|
|
||||||
inputNumberFeedback.FireUpdate();
|
|
||||||
displayDevice.PowerOn();
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
displayDevice.PowerIsOnFeedback.LinkInputSig(trilist.BooleanInput[joinMap.PowerOn]);
|
|
||||||
|
|
||||||
int count = 1;
|
|
||||||
foreach (var input in displayDevice.InputPorts)
|
|
||||||
{
|
|
||||||
inputKeys.Add(input.Key.ToString());
|
|
||||||
var tempKey = inputKeys.ElementAt(count - 1);
|
|
||||||
trilist.SetSigTrueAction((ushort)(joinMap.InputSelectOffset + count), () => { displayDevice.ExecuteSwitch(displayDevice.InputPorts[tempKey].Selector); });
|
|
||||||
Debug.Console(2, displayDevice, "Setting Input Select Action on Digital Join {0} to Input: {1}", joinMap.InputSelectOffset + count, displayDevice.InputPorts[tempKey].Key.ToString());
|
|
||||||
trilist.StringInput[(ushort)(joinMap.InputNamesOffset + count)].StringValue = input.Key.ToString();
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
Debug.Console(2, displayDevice, "Setting Input Select Action on Analog Join {0}", joinMap.InputSelect);
|
|
||||||
trilist.SetUShortSigAction(joinMap.InputSelect, (a) =>
|
|
||||||
{
|
|
||||||
if (a == 0)
|
|
||||||
{
|
|
||||||
displayDevice.PowerOff();
|
|
||||||
inputNumber = 0;
|
|
||||||
}
|
|
||||||
else if (a > 0 && a < displayDevice.InputPorts.Count && a != inputNumber)
|
|
||||||
{
|
|
||||||
displayDevice.ExecuteSwitch(displayDevice.InputPorts.ElementAt(a - 1).Selector);
|
|
||||||
inputNumber = a;
|
|
||||||
}
|
|
||||||
else if (a == 102)
|
|
||||||
{
|
|
||||||
displayDevice.PowerToggle();
|
|
||||||
|
|
||||||
}
|
|
||||||
if (twoWayDisplay != null)
|
|
||||||
inputNumberFeedback.FireUpdate();
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
var volumeDisplay = displayDevice as IBasicVolumeControls;
|
|
||||||
if (volumeDisplay != null)
|
|
||||||
{
|
|
||||||
trilist.SetBoolSigAction(joinMap.VolumeUp, (b) => volumeDisplay.VolumeUp(b));
|
|
||||||
trilist.SetBoolSigAction(joinMap.VolumeDown, (b) => volumeDisplay.VolumeDown(b));
|
|
||||||
trilist.SetSigTrueAction(joinMap.VolumeMute, () => volumeDisplay.MuteToggle());
|
|
||||||
|
|
||||||
var volumeDisplayWithFeedback = volumeDisplay as IBasicVolumeWithFeedback;
|
|
||||||
if(volumeDisplayWithFeedback != null)
|
|
||||||
{
|
|
||||||
trilist.SetUShortSigAction(joinMap.VolumeLevel, new Action<ushort>((u) => volumeDisplayWithFeedback.SetVolume(u)));
|
|
||||||
volumeDisplayWithFeedback.VolumeLevelFeedback.LinkInputSig(trilist.UShortInput[joinMap.VolumeLevel]);
|
|
||||||
volumeDisplayWithFeedback.MuteFeedback.LinkInputSig(trilist.BooleanInput[joinMap.VolumeMute]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void CurrentInputFeedback_OutputChange(object sender, FeedbackEventArgs e)
|
|
||||||
{
|
|
||||||
|
|
||||||
Debug.Console(0, "CurrentInputFeedback_OutputChange {0}", e.StringValue);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,222 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints.Transmitters;
|
|
||||||
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.DM;
|
|
||||||
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges {
|
|
||||||
public static class DmBladeChassisControllerApiExtentions {
|
|
||||||
public static void LinkToApi(this DmBladeChassisController dmChassis, BasicTriList trilist, uint joinStart, string joinMapKey) {
|
|
||||||
DmBladeChassisControllerJoinMap joinMap = new DmBladeChassisControllerJoinMap();
|
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetJoinMapForDevice(joinMapKey);
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(joinMapSerialized))
|
|
||||||
joinMap = JsonConvert.DeserializeObject<DmBladeChassisControllerJoinMap>(joinMapSerialized);
|
|
||||||
|
|
||||||
|
|
||||||
joinMap.OffsetJoinNumbers(joinStart);
|
|
||||||
|
|
||||||
Debug.Console(1, dmChassis, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
|
|
||||||
|
|
||||||
var chassis = dmChassis.Chassis as BladeSwitch;
|
|
||||||
|
|
||||||
dmChassis.IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline]);
|
|
||||||
|
|
||||||
|
|
||||||
// Link up outputs
|
|
||||||
for (uint i = 1; i <= dmChassis.Chassis.NumberOfOutputs; i++) {
|
|
||||||
var ioSlot = i;
|
|
||||||
|
|
||||||
// Control
|
|
||||||
trilist.SetUShortSigAction(joinMap.OutputVideo + ioSlot, new Action<ushort>(o => dmChassis.ExecuteSwitch(o, ioSlot, eRoutingSignalType.Video)));
|
|
||||||
|
|
||||||
if (dmChassis.TxDictionary.ContainsKey(ioSlot)) {
|
|
||||||
Debug.Console(2, "Creating Tx Feedbacks {0}", ioSlot);
|
|
||||||
var txKey = dmChassis.TxDictionary[ioSlot];
|
|
||||||
var basicTxDevice = DeviceManager.GetDeviceForKey(txKey) as BasicDmTxControllerBase;
|
|
||||||
|
|
||||||
var advancedTxDevice = basicTxDevice as DmTxControllerBase;
|
|
||||||
|
|
||||||
if (dmChassis.Chassis is DmMd128x128 || dmChassis.Chassis is DmMd64x64) {
|
|
||||||
dmChassis.InputEndpointOnlineFeedbacks[ioSlot].LinkInputSig(trilist.BooleanInput[joinMap.InputEndpointOnline + ioSlot]);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (advancedTxDevice != null) {
|
|
||||||
advancedTxDevice.IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.InputEndpointOnline + ioSlot]);
|
|
||||||
Debug.Console(2, "Linking Tx Online Feedback from Advanced Transmitter at input {0}", ioSlot);
|
|
||||||
}
|
|
||||||
else if (dmChassis.InputEndpointOnlineFeedbacks[ioSlot] != null) {
|
|
||||||
Debug.Console(2, "Linking Tx Online Feedback from Input Card {0}", ioSlot);
|
|
||||||
dmChassis.InputEndpointOnlineFeedbacks[ioSlot].LinkInputSig(trilist.BooleanInput[joinMap.InputEndpointOnline + ioSlot]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (basicTxDevice != null && advancedTxDevice == null)
|
|
||||||
trilist.BooleanInput[joinMap.TxAdvancedIsPresent + ioSlot].BoolValue = true;
|
|
||||||
|
|
||||||
if (advancedTxDevice != null) {
|
|
||||||
advancedTxDevice.AnyVideoInput.VideoStatus.VideoSyncFeedback.LinkInputSig(trilist.BooleanInput[joinMap.VideoSyncStatus + ioSlot]);
|
|
||||||
}
|
|
||||||
else if (advancedTxDevice == null || basicTxDevice != null) {
|
|
||||||
Debug.Console(1, "Setting up actions and feedbacks on input card {0}", ioSlot);
|
|
||||||
dmChassis.VideoInputSyncFeedbacks[ioSlot].LinkInputSig(trilist.BooleanInput[joinMap.VideoSyncStatus + ioSlot]);
|
|
||||||
|
|
||||||
var inputPort = dmChassis.InputPorts[string.Format("inputCard{0}--hdmiIn", ioSlot)];
|
|
||||||
if (inputPort != null) {
|
|
||||||
Debug.Console(1, "Port value for input card {0} is set", ioSlot);
|
|
||||||
var port = inputPort.Port;
|
|
||||||
|
|
||||||
if (port != null) {
|
|
||||||
if (port is HdmiInputWithCEC) {
|
|
||||||
Debug.Console(1, "Port is HdmiInputWithCec");
|
|
||||||
|
|
||||||
var hdmiInPortWCec = port as HdmiInputWithCEC;
|
|
||||||
|
|
||||||
if (hdmiInPortWCec.HdcpSupportedLevel != eHdcpSupportedLevel.Unknown) {
|
|
||||||
SetHdcpStateAction(true, hdmiInPortWCec, joinMap.HdcpSupportState + ioSlot, trilist);
|
|
||||||
}
|
|
||||||
|
|
||||||
dmChassis.InputCardHdcpCapabilityFeedbacks[ioSlot].LinkInputSig(trilist.UShortInput[joinMap.HdcpSupportState + ioSlot]);
|
|
||||||
|
|
||||||
if (dmChassis.InputCardHdcpCapabilityTypes.ContainsKey(ioSlot))
|
|
||||||
trilist.UShortInput[joinMap.HdcpSupportCapability + ioSlot].UShortValue = (ushort)dmChassis.InputCardHdcpCapabilityTypes[ioSlot];
|
|
||||||
else
|
|
||||||
trilist.UShortInput[joinMap.HdcpSupportCapability + ioSlot].UShortValue = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
inputPort = dmChassis.InputPorts[string.Format("inputCard{0}--dmIn", ioSlot)];
|
|
||||||
|
|
||||||
if (inputPort != null) {
|
|
||||||
var port = inputPort.Port;
|
|
||||||
|
|
||||||
if (port is DMInputPortWithCec) {
|
|
||||||
Debug.Console(1, "Port is DMInputPortWithCec");
|
|
||||||
|
|
||||||
var dmInPortWCec = port as DMInputPortWithCec;
|
|
||||||
|
|
||||||
if (dmInPortWCec != null) {
|
|
||||||
SetHdcpStateAction(dmChassis.PropertiesConfig.InputSlotSupportsHdcp2[ioSlot], dmInPortWCec, joinMap.HdcpSupportState + ioSlot, trilist);
|
|
||||||
}
|
|
||||||
|
|
||||||
dmChassis.InputCardHdcpCapabilityFeedbacks[ioSlot].LinkInputSig(trilist.UShortInput[joinMap.HdcpSupportState + ioSlot]);
|
|
||||||
|
|
||||||
if (dmChassis.InputCardHdcpCapabilityTypes.ContainsKey(ioSlot))
|
|
||||||
trilist.UShortInput[joinMap.HdcpSupportCapability + ioSlot].UShortValue = (ushort)dmChassis.InputCardHdcpCapabilityTypes[ioSlot];
|
|
||||||
else
|
|
||||||
trilist.UShortInput[joinMap.HdcpSupportCapability + ioSlot].UShortValue = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
dmChassis.VideoInputSyncFeedbacks[ioSlot].LinkInputSig(trilist.BooleanInput[joinMap.VideoSyncStatus + ioSlot]);
|
|
||||||
|
|
||||||
var inputPort = dmChassis.InputPorts[string.Format("inputCard{0}--hdmiIn", ioSlot)];
|
|
||||||
if (inputPort != null) {
|
|
||||||
var hdmiPort = inputPort.Port as EndpointHdmiInput;
|
|
||||||
|
|
||||||
if (hdmiPort != null) {
|
|
||||||
SetHdcpStateAction(true, hdmiPort, joinMap.HdcpSupportState + ioSlot, trilist);
|
|
||||||
dmChassis.InputCardHdcpCapabilityFeedbacks[ioSlot].LinkInputSig(trilist.UShortInput[joinMap.HdcpSupportState + ioSlot]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (dmChassis.RxDictionary.ContainsKey(ioSlot)) {
|
|
||||||
Debug.Console(2, "Creating Rx Feedbacks {0}", ioSlot);
|
|
||||||
//var rxKey = dmChassis.RxDictionary[ioSlot];
|
|
||||||
//var rxDevice = DeviceManager.GetDeviceForKey(rxKey) as DmRmcControllerBase;
|
|
||||||
//var hdBaseTDevice = DeviceManager.GetDeviceForKey(rxKey) as DmHdBaseTControllerBase;
|
|
||||||
//if (hdBaseTDevice != null) {
|
|
||||||
dmChassis.OutputEndpointOnlineFeedbacks[ioSlot].LinkInputSig(trilist.BooleanInput[joinMap.OutputEndpointOnline + ioSlot]);
|
|
||||||
//}
|
|
||||||
//else if (rxDevice != null) {
|
|
||||||
// rxDevice.IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.OutputEndpointOnline + ioSlot]);
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Feedback
|
|
||||||
dmChassis.VideoOutputFeedbacks[ioSlot].LinkInputSig(trilist.UShortInput[joinMap.OutputVideo + ioSlot]);
|
|
||||||
|
|
||||||
|
|
||||||
dmChassis.OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputNames + ioSlot]);
|
|
||||||
dmChassis.InputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.InputNames + ioSlot]);
|
|
||||||
dmChassis.OutputVideoRouteNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputCurrentVideoInputNames + ioSlot]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void SetHdcpStateAction(bool hdcpTypeSimple, HdmiInputWithCEC port, uint join, BasicTriList trilist) {
|
|
||||||
if (hdcpTypeSimple) {
|
|
||||||
trilist.SetUShortSigAction(join,
|
|
||||||
new Action<ushort>(s => {
|
|
||||||
if (s == 0) {
|
|
||||||
port.HdcpSupportOff();
|
|
||||||
}
|
|
||||||
else if (s > 0) {
|
|
||||||
port.HdcpSupportOn();
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
trilist.SetUShortSigAction(join,
|
|
||||||
new Action<ushort>(u => {
|
|
||||||
port.HdcpReceiveCapability = (eHdcpCapabilityType)u;
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void SetHdcpStateAction(bool hdcpTypeSimple, EndpointHdmiInput port, uint join, BasicTriList trilist) {
|
|
||||||
if (hdcpTypeSimple) {
|
|
||||||
trilist.SetUShortSigAction(join,
|
|
||||||
new Action<ushort>(s => {
|
|
||||||
if (s == 0) {
|
|
||||||
port.HdcpSupportOff();
|
|
||||||
}
|
|
||||||
else if (s > 0) {
|
|
||||||
port.HdcpSupportOn();
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
trilist.SetUShortSigAction(join,
|
|
||||||
new Action<ushort>(u => {
|
|
||||||
port.HdcpCapability = (eHdcpCapabilityType)u;
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void SetHdcpStateAction(bool supportsHdcp2, DMInputPortWithCec port, uint join, BasicTriList trilist) {
|
|
||||||
if (!supportsHdcp2) {
|
|
||||||
trilist.SetUShortSigAction(join,
|
|
||||||
new Action<ushort>(s => {
|
|
||||||
if (s == 0) {
|
|
||||||
port.HdcpSupportOff();
|
|
||||||
}
|
|
||||||
else if (s > 0) {
|
|
||||||
port.HdcpSupportOn();
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
trilist.SetUShortSigAction(join,
|
|
||||||
new Action<ushort>(u => {
|
|
||||||
port.HdcpReceiveCapability = (eHdcpCapabilityType)u;
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,284 +1,288 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
using System;
|
||||||
using System.Linq;
|
using System.Collections.Generic;
|
||||||
using System.Text;
|
using System.Linq;
|
||||||
using Crestron.SimplSharp;
|
using System.Text;
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
using Crestron.SimplSharp;
|
||||||
using Crestron.SimplSharpPro.DM;
|
using Crestron.SimplSharpPro.DeviceSupport;
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints;
|
using Crestron.SimplSharpPro.DM;
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints.Transmitters;
|
using Crestron.SimplSharpPro.DM.Endpoints;
|
||||||
|
using Crestron.SimplSharpPro.DM.Endpoints.Transmitters;
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.DM;
|
using PepperDash.Essentials.Core;
|
||||||
|
using PepperDash.Essentials.DM;
|
||||||
using Newtonsoft.Json;
|
|
||||||
|
using Newtonsoft.Json;
|
||||||
namespace PepperDash.Essentials.Bridges
|
|
||||||
{
|
namespace PepperDash.Essentials.Core.Bridges
|
||||||
public static class DmChassisControllerApiExtensions
|
{
|
||||||
{
|
public static class DmChassisControllerApiExtentions
|
||||||
public static void LinkToApi(this DmChassisController dmChassis, BasicTriList trilist, uint joinStart, string joinMapKey)
|
{
|
||||||
{
|
public static void LinkToApi(this DmChassisController dmChassis, BasicTriList trilist, uint joinStart, string joinMapKey)
|
||||||
DmChassisControllerJoinMap joinMap = new DmChassisControllerJoinMap();
|
{
|
||||||
|
DmChassisControllerJoinMap joinMap = new DmChassisControllerJoinMap();
|
||||||
var joinMapSerialized = JoinMapHelper.GetJoinMapForDevice(joinMapKey);
|
|
||||||
|
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
||||||
if (!string.IsNullOrEmpty(joinMapSerialized))
|
|
||||||
joinMap = JsonConvert.DeserializeObject<DmChassisControllerJoinMap>(joinMapSerialized);
|
if (!string.IsNullOrEmpty(joinMapSerialized))
|
||||||
|
joinMap = JsonConvert.DeserializeObject<DmChassisControllerJoinMap>(joinMapSerialized);
|
||||||
|
|
||||||
joinMap.OffsetJoinNumbers(joinStart);
|
|
||||||
|
joinMap.OffsetJoinNumbers(joinStart);
|
||||||
Debug.Console(1, dmChassis, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
|
|
||||||
|
Debug.Console(1, dmChassis, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
|
||||||
var chassis = dmChassis.Chassis as DmMDMnxn;
|
|
||||||
|
var chassis = dmChassis.Chassis as DmMDMnxn;
|
||||||
dmChassis.IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline]);
|
|
||||||
|
dmChassis.IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline]);
|
||||||
trilist.SetUShortSigAction(joinMap.SystemId, new Action<ushort>(o => chassis.SystemId.UShortValue = o));
|
|
||||||
trilist.SetSigTrueAction(joinMap.SystemId, new Action(() => chassis.ApplySystemId()));
|
trilist.SetUShortSigAction(joinMap.SystemId, new Action<ushort>(o => chassis.SystemId.UShortValue = o));
|
||||||
|
trilist.SetSigTrueAction(joinMap.SystemId, new Action(() => chassis.ApplySystemId()));
|
||||||
dmChassis.SystemIdFeebdack.LinkInputSig(trilist.UShortInput[joinMap.SystemId]);
|
|
||||||
dmChassis.SystemIdBusyFeedback.LinkInputSig(trilist.BooleanInput[joinMap.SystemId]);
|
dmChassis.SystemIdFeebdack.LinkInputSig(trilist.UShortInput[joinMap.SystemId]);
|
||||||
|
dmChassis.SystemIdBusyFeedback.LinkInputSig(trilist.BooleanInput[joinMap.SystemId]);
|
||||||
// Link up outputs
|
|
||||||
for (uint i = 1; i <= dmChassis.Chassis.NumberOfOutputs; i++)
|
// Link up outputs
|
||||||
{
|
for (uint i = 1; i <= dmChassis.Chassis.NumberOfOutputs; i++)
|
||||||
var ioSlot = i;
|
{
|
||||||
|
var ioSlot = i;
|
||||||
// Control
|
|
||||||
trilist.SetUShortSigAction(joinMap.OutputVideo + ioSlot, new Action<ushort>(o => dmChassis.ExecuteSwitch(o, ioSlot, eRoutingSignalType.Video)));
|
// Control
|
||||||
trilist.SetUShortSigAction(joinMap.OutputAudio + ioSlot, new Action<ushort>(o => dmChassis.ExecuteSwitch(o, ioSlot, eRoutingSignalType.Audio)));
|
trilist.SetUShortSigAction(joinMap.OutputVideo + ioSlot, new Action<ushort>(o => dmChassis.ExecuteSwitch(o, ioSlot, eRoutingSignalType.Video)));
|
||||||
trilist.SetUShortSigAction(joinMap.OutputUsb + ioSlot, new Action<ushort>(o => dmChassis.ExecuteSwitch(o, ioSlot, eRoutingSignalType.UsbOutput)));
|
trilist.SetUShortSigAction(joinMap.OutputAudio + ioSlot, new Action<ushort>(o => dmChassis.ExecuteSwitch(o, ioSlot, eRoutingSignalType.Audio)));
|
||||||
trilist.SetUShortSigAction(joinMap.InputUsb + ioSlot, new Action<ushort>(o => dmChassis.ExecuteSwitch(o, ioSlot, eRoutingSignalType.UsbInput)));
|
trilist.SetUShortSigAction(joinMap.OutputUsb + ioSlot, new Action<ushort>(o => dmChassis.ExecuteSwitch(o, ioSlot, eRoutingSignalType.UsbOutput)));
|
||||||
|
trilist.SetUShortSigAction(joinMap.InputUsb + ioSlot, new Action<ushort>(o => dmChassis.ExecuteSwitch(o, ioSlot, eRoutingSignalType.UsbInput)));
|
||||||
if (dmChassis.TxDictionary.ContainsKey(ioSlot))
|
|
||||||
{
|
if (dmChassis.TxDictionary.ContainsKey(ioSlot))
|
||||||
Debug.Console(2, "Creating Tx Feedbacks {0}", ioSlot);
|
{
|
||||||
var txKey = dmChassis.TxDictionary[ioSlot];
|
Debug.Console(2, "Creating Tx Feedbacks {0}", ioSlot);
|
||||||
var basicTxDevice = DeviceManager.GetDeviceForKey(txKey) as BasicDmTxControllerBase;
|
var txKey = dmChassis.TxDictionary[ioSlot];
|
||||||
|
var basicTxDevice = DeviceManager.GetDeviceForKey(txKey) as BasicDmTxControllerBase;
|
||||||
var advancedTxDevice = basicTxDevice as DmTxControllerBase;
|
|
||||||
|
var advancedTxDevice = basicTxDevice as DmTxControllerBase;
|
||||||
if (dmChassis.Chassis is DmMd8x8Cpu3 || dmChassis.Chassis is DmMd8x8Cpu3rps
|
|
||||||
|| dmChassis.Chassis is DmMd16x16Cpu3 || dmChassis.Chassis is DmMd16x16Cpu3rps
|
if (dmChassis.Chassis is DmMd8x8Cpu3 || dmChassis.Chassis is DmMd8x8Cpu3rps
|
||||||
|| dmChassis.Chassis is DmMd32x32Cpu3 || dmChassis.Chassis is DmMd32x32Cpu3rps)
|
|| dmChassis.Chassis is DmMd16x16Cpu3 || dmChassis.Chassis is DmMd16x16Cpu3rps
|
||||||
{
|
|| dmChassis.Chassis is DmMd32x32Cpu3 || dmChassis.Chassis is DmMd32x32Cpu3rps)
|
||||||
dmChassis.InputEndpointOnlineFeedbacks[ioSlot].LinkInputSig(trilist.BooleanInput[joinMap.InputEndpointOnline + ioSlot]);
|
{
|
||||||
}
|
dmChassis.InputEndpointOnlineFeedbacks[ioSlot].LinkInputSig(trilist.BooleanInput[joinMap.InputEndpointOnline + ioSlot]);
|
||||||
else
|
}
|
||||||
{
|
else
|
||||||
if (advancedTxDevice != null)
|
{
|
||||||
{
|
if (advancedTxDevice != null)
|
||||||
advancedTxDevice.IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.InputEndpointOnline + ioSlot]);
|
{
|
||||||
Debug.Console(2, "Linking Tx Online Feedback from Advanced Transmitter at input {0}", ioSlot);
|
advancedTxDevice.IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.InputEndpointOnline + ioSlot]);
|
||||||
}
|
Debug.Console(2, "Linking Tx Online Feedback from Advanced Transmitter at input {0}", ioSlot);
|
||||||
else if (dmChassis.InputEndpointOnlineFeedbacks[ioSlot] != null)
|
}
|
||||||
{
|
else if (dmChassis.InputEndpointOnlineFeedbacks[ioSlot] != null)
|
||||||
Debug.Console(2, "Linking Tx Online Feedback from Input Card {0}", ioSlot);
|
{
|
||||||
dmChassis.InputEndpointOnlineFeedbacks[ioSlot].LinkInputSig(trilist.BooleanInput[joinMap.InputEndpointOnline + ioSlot]);
|
Debug.Console(2, "Linking Tx Online Feedback from Input Card {0}", ioSlot);
|
||||||
}
|
dmChassis.InputEndpointOnlineFeedbacks[ioSlot].LinkInputSig(trilist.BooleanInput[joinMap.InputEndpointOnline + ioSlot]);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (advancedTxDevice != null) // Advanced TX device
|
|
||||||
{
|
if (basicTxDevice != null && advancedTxDevice == null)
|
||||||
advancedTxDevice.AnyVideoInput.VideoStatus.VideoSyncFeedback.LinkInputSig(trilist.BooleanInput[joinMap.VideoSyncStatus + ioSlot]);
|
trilist.BooleanInput[joinMap.TxAdvancedIsPresent + ioSlot].BoolValue = true;
|
||||||
|
|
||||||
// Flag if the TX is an advanced endpoint type
|
if (advancedTxDevice != null)
|
||||||
trilist.BooleanInput[joinMap.TxAdvancedIsPresent + ioSlot].BoolValue = true;
|
{
|
||||||
}
|
advancedTxDevice.AnyVideoInput.VideoStatus.VideoSyncFeedback.LinkInputSig(trilist.BooleanInput[joinMap.VideoSyncStatus + ioSlot]);
|
||||||
else if(advancedTxDevice == null || basicTxDevice != null) // Basic TX device
|
}
|
||||||
{
|
else if(advancedTxDevice == null || basicTxDevice != null)
|
||||||
Debug.Console(1, "Setting up actions and feedbacks on input card {0}", ioSlot);
|
{
|
||||||
dmChassis.VideoInputSyncFeedbacks[ioSlot].LinkInputSig(trilist.BooleanInput[joinMap.VideoSyncStatus + ioSlot]);
|
Debug.Console(1, "Setting up actions and feedbacks on input card {0}", ioSlot);
|
||||||
|
dmChassis.VideoInputSyncFeedbacks[ioSlot].LinkInputSig(trilist.BooleanInput[joinMap.VideoSyncStatus + ioSlot]);
|
||||||
var inputPort = dmChassis.InputPorts[string.Format("inputCard{0}--hdmiIn", ioSlot)];
|
|
||||||
if (inputPort != null)
|
var inputPort = dmChassis.InputPorts[string.Format("inputCard{0}--hdmiIn", ioSlot)];
|
||||||
{
|
if (inputPort != null)
|
||||||
Debug.Console(1, "Port value for input card {0} is set", ioSlot);
|
{
|
||||||
var port = inputPort.Port;
|
Debug.Console(1, "Port value for input card {0} is set", ioSlot);
|
||||||
|
var port = inputPort.Port;
|
||||||
if (port != null)
|
|
||||||
{
|
if (port != null)
|
||||||
if (port is HdmiInputWithCEC)
|
{
|
||||||
{
|
if (port is HdmiInputWithCEC)
|
||||||
Debug.Console(1, "Port is HdmiInputWithCec");
|
{
|
||||||
|
Debug.Console(1, "Port is HdmiInputWithCec");
|
||||||
var hdmiInPortWCec = port as HdmiInputWithCEC;
|
|
||||||
|
var hdmiInPortWCec = port as HdmiInputWithCEC;
|
||||||
if (hdmiInPortWCec.HdcpSupportedLevel != eHdcpSupportedLevel.Unknown)
|
|
||||||
{
|
if (hdmiInPortWCec.HdcpSupportedLevel != eHdcpSupportedLevel.Unknown)
|
||||||
SetHdcpStateAction(true, hdmiInPortWCec, joinMap.HdcpSupportState + ioSlot, trilist);
|
{
|
||||||
}
|
SetHdcpStateAction(true, hdmiInPortWCec, joinMap.HdcpSupportState + ioSlot, trilist);
|
||||||
|
}
|
||||||
dmChassis.InputCardHdcpCapabilityFeedbacks[ioSlot].LinkInputSig(trilist.UShortInput[joinMap.HdcpSupportState + ioSlot]);
|
|
||||||
|
dmChassis.InputCardHdcpCapabilityFeedbacks[ioSlot].LinkInputSig(trilist.UShortInput[joinMap.HdcpSupportState + ioSlot]);
|
||||||
if(dmChassis.InputCardHdcpCapabilityTypes.ContainsKey(ioSlot))
|
|
||||||
trilist.UShortInput[joinMap.HdcpSupportCapability + ioSlot].UShortValue = (ushort)dmChassis.InputCardHdcpCapabilityTypes[ioSlot];
|
if(dmChassis.InputCardHdcpCapabilityTypes.ContainsKey(ioSlot))
|
||||||
else
|
trilist.UShortInput[joinMap.HdcpSupportCapability + ioSlot].UShortValue = (ushort)dmChassis.InputCardHdcpCapabilityTypes[ioSlot];
|
||||||
trilist.UShortInput[joinMap.HdcpSupportCapability + ioSlot].UShortValue = 1;
|
else
|
||||||
}
|
trilist.UShortInput[joinMap.HdcpSupportCapability + ioSlot].UShortValue = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
}
|
||||||
{
|
else
|
||||||
inputPort = dmChassis.InputPorts[string.Format("inputCard{0}--dmIn", ioSlot)];
|
{
|
||||||
|
inputPort = dmChassis.InputPorts[string.Format("inputCard{0}--dmIn", ioSlot)];
|
||||||
if(inputPort != null)
|
|
||||||
{
|
if(inputPort != null)
|
||||||
var port = inputPort.Port;
|
{
|
||||||
|
var port = inputPort.Port;
|
||||||
if (port is DMInputPortWithCec)
|
|
||||||
{
|
if (port is DMInputPortWithCec)
|
||||||
Debug.Console(1, "Port is DMInputPortWithCec");
|
{
|
||||||
|
Debug.Console(1, "Port is DMInputPortWithCec");
|
||||||
var dmInPortWCec = port as DMInputPortWithCec;
|
|
||||||
|
var dmInPortWCec = port as DMInputPortWithCec;
|
||||||
if (dmInPortWCec != null)
|
|
||||||
{
|
if (dmInPortWCec != null)
|
||||||
SetHdcpStateAction(dmChassis.PropertiesConfig.InputSlotSupportsHdcp2[ioSlot], dmInPortWCec, joinMap.HdcpSupportState + ioSlot, trilist);
|
{
|
||||||
}
|
SetHdcpStateAction(dmChassis.PropertiesConfig.InputSlotSupportsHdcp2[ioSlot], dmInPortWCec, joinMap.HdcpSupportState + ioSlot, trilist);
|
||||||
|
}
|
||||||
dmChassis.InputCardHdcpCapabilityFeedbacks[ioSlot].LinkInputSig(trilist.UShortInput[joinMap.HdcpSupportState + ioSlot]);
|
|
||||||
|
dmChassis.InputCardHdcpCapabilityFeedbacks[ioSlot].LinkInputSig(trilist.UShortInput[joinMap.HdcpSupportState + ioSlot]);
|
||||||
if (dmChassis.InputCardHdcpCapabilityTypes.ContainsKey(ioSlot))
|
|
||||||
trilist.UShortInput[joinMap.HdcpSupportCapability + ioSlot].UShortValue = (ushort)dmChassis.InputCardHdcpCapabilityTypes[ioSlot];
|
if (dmChassis.InputCardHdcpCapabilityTypes.ContainsKey(ioSlot))
|
||||||
else
|
trilist.UShortInput[joinMap.HdcpSupportCapability + ioSlot].UShortValue = (ushort)dmChassis.InputCardHdcpCapabilityTypes[ioSlot];
|
||||||
trilist.UShortInput[joinMap.HdcpSupportCapability + ioSlot].UShortValue = 1;
|
else
|
||||||
}
|
trilist.UShortInput[joinMap.HdcpSupportCapability + ioSlot].UShortValue = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
}
|
||||||
{
|
else
|
||||||
dmChassis.VideoInputSyncFeedbacks[ioSlot].LinkInputSig(trilist.BooleanInput[joinMap.VideoSyncStatus + ioSlot]);
|
{
|
||||||
|
dmChassis.VideoInputSyncFeedbacks[ioSlot].LinkInputSig(trilist.BooleanInput[joinMap.VideoSyncStatus + ioSlot]);
|
||||||
var inputPort = dmChassis.InputPorts[string.Format("inputCard{0}--hdmiIn", ioSlot)];
|
|
||||||
if (inputPort != null)
|
var inputPort = dmChassis.InputPorts[string.Format("inputCard{0}--hdmiIn", ioSlot)];
|
||||||
{
|
if (inputPort != null)
|
||||||
var hdmiPort = inputPort.Port as EndpointHdmiInput;
|
{
|
||||||
|
var hdmiPort = inputPort.Port as EndpointHdmiInput;
|
||||||
if (hdmiPort != null)
|
|
||||||
{
|
if (hdmiPort != null)
|
||||||
SetHdcpStateAction(true, hdmiPort, joinMap.HdcpSupportState + ioSlot, trilist);
|
{
|
||||||
dmChassis.InputCardHdcpCapabilityFeedbacks[ioSlot].LinkInputSig(trilist.UShortInput[joinMap.HdcpSupportState + ioSlot]);
|
SetHdcpStateAction(true, hdmiPort, joinMap.HdcpSupportState + ioSlot, trilist);
|
||||||
}
|
dmChassis.InputCardHdcpCapabilityFeedbacks[ioSlot].LinkInputSig(trilist.UShortInput[joinMap.HdcpSupportState + ioSlot]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (dmChassis.RxDictionary.ContainsKey(ioSlot))
|
}
|
||||||
{
|
|
||||||
Debug.Console(2, "Creating Rx Feedbacks {0}", ioSlot);
|
if (dmChassis.RxDictionary.ContainsKey(ioSlot))
|
||||||
var rxKey = dmChassis.RxDictionary[ioSlot];
|
{
|
||||||
var rxDevice = DeviceManager.GetDeviceForKey(rxKey) as DmRmcControllerBase;
|
Debug.Console(2, "Creating Rx Feedbacks {0}", ioSlot);
|
||||||
var hdBaseTDevice = DeviceManager.GetDeviceForKey(rxKey) as DmHdBaseTControllerBase;
|
var rxKey = dmChassis.RxDictionary[ioSlot];
|
||||||
if (dmChassis.Chassis is DmMd8x8Cpu3 || dmChassis.Chassis is DmMd8x8Cpu3rps
|
var rxDevice = DeviceManager.GetDeviceForKey(rxKey) as DmRmcControllerBase;
|
||||||
|| dmChassis.Chassis is DmMd16x16Cpu3 || dmChassis.Chassis is DmMd16x16Cpu3rps
|
var hdBaseTDevice = DeviceManager.GetDeviceForKey(rxKey) as DmHdBaseTControllerBase;
|
||||||
|| dmChassis.Chassis is DmMd32x32Cpu3 || dmChassis.Chassis is DmMd32x32Cpu3rps || hdBaseTDevice != null)
|
if (dmChassis.Chassis is DmMd8x8Cpu3 || dmChassis.Chassis is DmMd8x8Cpu3rps
|
||||||
{
|
|| dmChassis.Chassis is DmMd16x16Cpu3 || dmChassis.Chassis is DmMd16x16Cpu3rps
|
||||||
dmChassis.OutputEndpointOnlineFeedbacks[ioSlot].LinkInputSig(trilist.BooleanInput[joinMap.OutputEndpointOnline + ioSlot]);
|
|| dmChassis.Chassis is DmMd32x32Cpu3 || dmChassis.Chassis is DmMd32x32Cpu3rps || hdBaseTDevice != null)
|
||||||
}
|
{
|
||||||
else if (rxDevice != null)
|
dmChassis.OutputEndpointOnlineFeedbacks[ioSlot].LinkInputSig(trilist.BooleanInput[joinMap.OutputEndpointOnline + ioSlot]);
|
||||||
{
|
}
|
||||||
rxDevice.IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.OutputEndpointOnline + ioSlot]);
|
else if (rxDevice != null)
|
||||||
}
|
{
|
||||||
}
|
rxDevice.IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.OutputEndpointOnline + ioSlot]);
|
||||||
|
}
|
||||||
// Feedback
|
}
|
||||||
dmChassis.VideoOutputFeedbacks[ioSlot].LinkInputSig(trilist.UShortInput[joinMap.OutputVideo + ioSlot]);
|
|
||||||
dmChassis.AudioOutputFeedbacks[ioSlot].LinkInputSig(trilist.UShortInput[joinMap.OutputAudio + ioSlot]);
|
// Feedback
|
||||||
dmChassis.UsbOutputRoutedToFeebacks[ioSlot].LinkInputSig(trilist.UShortInput[joinMap.OutputUsb + ioSlot]);
|
dmChassis.VideoOutputFeedbacks[ioSlot].LinkInputSig(trilist.UShortInput[joinMap.OutputVideo + ioSlot]);
|
||||||
dmChassis.UsbInputRoutedToFeebacks[ioSlot].LinkInputSig(trilist.UShortInput[joinMap.InputUsb + ioSlot]);
|
dmChassis.AudioOutputFeedbacks[ioSlot].LinkInputSig(trilist.UShortInput[joinMap.OutputAudio + ioSlot]);
|
||||||
|
dmChassis.UsbOutputRoutedToFeebacks[ioSlot].LinkInputSig(trilist.UShortInput[joinMap.OutputUsb + ioSlot]);
|
||||||
|
dmChassis.UsbInputRoutedToFeebacks[ioSlot].LinkInputSig(trilist.UShortInput[joinMap.InputUsb + ioSlot]);
|
||||||
dmChassis.OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputNames + ioSlot]);
|
|
||||||
dmChassis.InputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.InputNames + ioSlot]);
|
dmChassis.OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputNames + ioSlot]);
|
||||||
dmChassis.OutputVideoRouteNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputCurrentVideoInputNames + ioSlot]);
|
dmChassis.InputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.InputNames + ioSlot]);
|
||||||
dmChassis.OutputAudioRouteNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputCurrentAudioInputNames + ioSlot]);
|
dmChassis.OutputVideoRouteNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputCurrentVideoInputNames + ioSlot]);
|
||||||
}
|
dmChassis.OutputAudioRouteNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputCurrentAudioInputNames + ioSlot]);
|
||||||
}
|
|
||||||
|
dmChassis.OutputDisabledByHdcpFeedbacks[ioSlot].LinkInputSig(trilist.BooleanInput[joinMap.OutputDisabledByHdcp + ioSlot]);
|
||||||
static void SetHdcpStateAction(bool hdcpTypeSimple, HdmiInputWithCEC port, uint join, BasicTriList trilist)
|
}
|
||||||
{
|
}
|
||||||
if (hdcpTypeSimple)
|
|
||||||
{
|
static void SetHdcpStateAction(bool hdcpTypeSimple, HdmiInputWithCEC port, uint join, BasicTriList trilist)
|
||||||
trilist.SetUShortSigAction(join,
|
{
|
||||||
new Action<ushort>(s =>
|
if (hdcpTypeSimple)
|
||||||
{
|
{
|
||||||
if (s == 0)
|
trilist.SetUShortSigAction(join,
|
||||||
{
|
new Action<ushort>(s =>
|
||||||
port.HdcpSupportOff();
|
{
|
||||||
}
|
if (s == 0)
|
||||||
else if (s > 0)
|
{
|
||||||
{
|
port.HdcpSupportOff();
|
||||||
port.HdcpSupportOn();
|
}
|
||||||
}
|
else if (s > 0)
|
||||||
}));
|
{
|
||||||
}
|
port.HdcpSupportOn();
|
||||||
else
|
}
|
||||||
{
|
}));
|
||||||
trilist.SetUShortSigAction(join,
|
}
|
||||||
new Action<ushort>(u =>
|
else
|
||||||
{
|
{
|
||||||
port.HdcpReceiveCapability = (eHdcpCapabilityType)u;
|
trilist.SetUShortSigAction(join,
|
||||||
}));
|
new Action<ushort>(u =>
|
||||||
}
|
{
|
||||||
}
|
port.HdcpReceiveCapability = (eHdcpCapabilityType)u;
|
||||||
|
}));
|
||||||
static void SetHdcpStateAction(bool hdcpTypeSimple, EndpointHdmiInput port, uint join, BasicTriList trilist)
|
}
|
||||||
{
|
}
|
||||||
if (hdcpTypeSimple)
|
|
||||||
{
|
static void SetHdcpStateAction(bool hdcpTypeSimple, EndpointHdmiInput port, uint join, BasicTriList trilist)
|
||||||
trilist.SetUShortSigAction(join,
|
{
|
||||||
new Action<ushort>(s =>
|
if (hdcpTypeSimple)
|
||||||
{
|
{
|
||||||
if (s == 0)
|
trilist.SetUShortSigAction(join,
|
||||||
{
|
new Action<ushort>(s =>
|
||||||
port.HdcpSupportOff();
|
{
|
||||||
}
|
if (s == 0)
|
||||||
else if (s > 0)
|
{
|
||||||
{
|
port.HdcpSupportOff();
|
||||||
port.HdcpSupportOn();
|
}
|
||||||
}
|
else if (s > 0)
|
||||||
}));
|
{
|
||||||
}
|
port.HdcpSupportOn();
|
||||||
else
|
}
|
||||||
{
|
}));
|
||||||
trilist.SetUShortSigAction(join,
|
}
|
||||||
new Action<ushort>(u =>
|
else
|
||||||
{
|
{
|
||||||
port.HdcpCapability = (eHdcpCapabilityType)u;
|
trilist.SetUShortSigAction(join,
|
||||||
}));
|
new Action<ushort>(u =>
|
||||||
}
|
{
|
||||||
}
|
port.HdcpCapability = (eHdcpCapabilityType)u;
|
||||||
|
}));
|
||||||
static void SetHdcpStateAction(bool supportsHdcp2, DMInputPortWithCec port, uint join, BasicTriList trilist)
|
}
|
||||||
{
|
}
|
||||||
if (!supportsHdcp2)
|
|
||||||
{
|
static void SetHdcpStateAction(bool supportsHdcp2, DMInputPortWithCec port, uint join, BasicTriList trilist)
|
||||||
trilist.SetUShortSigAction(join,
|
{
|
||||||
new Action<ushort>(s =>
|
if (!supportsHdcp2)
|
||||||
{
|
{
|
||||||
if (s == 0)
|
trilist.SetUShortSigAction(join,
|
||||||
{
|
new Action<ushort>(s =>
|
||||||
port.HdcpSupportOff();
|
{
|
||||||
}
|
if (s == 0)
|
||||||
else if (s > 0)
|
{
|
||||||
{
|
port.HdcpSupportOff();
|
||||||
port.HdcpSupportOn();
|
}
|
||||||
}
|
else if (s > 0)
|
||||||
}));
|
{
|
||||||
}
|
port.HdcpSupportOn();
|
||||||
else
|
}
|
||||||
{
|
}));
|
||||||
trilist.SetUShortSigAction(join,
|
}
|
||||||
new Action<ushort>(u =>
|
else
|
||||||
{
|
{
|
||||||
port.HdcpReceiveCapability = (eHdcpCapabilityType)u;
|
trilist.SetUShortSigAction(join,
|
||||||
}));
|
new Action<ushort>(u =>
|
||||||
}
|
{
|
||||||
}
|
port.HdcpReceiveCapability = (eHdcpCapabilityType)u;
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -11,7 +11,7 @@ using PepperDash.Essentials.DM;
|
|||||||
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Core.Bridges
|
||||||
{
|
{
|
||||||
public static class DmRmcControllerApiExtensions
|
public static class DmRmcControllerApiExtensions
|
||||||
{
|
{
|
||||||
@@ -19,7 +19,7 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
{
|
{
|
||||||
DmRmcControllerJoinMap joinMap = new DmRmcControllerJoinMap();
|
DmRmcControllerJoinMap joinMap = new DmRmcControllerJoinMap();
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetJoinMapForDevice(joinMapKey);
|
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(joinMapSerialized))
|
if (!string.IsNullOrEmpty(joinMapSerialized))
|
||||||
joinMap = JsonConvert.DeserializeObject<DmRmcControllerJoinMap>(joinMapSerialized);
|
joinMap = JsonConvert.DeserializeObject<DmRmcControllerJoinMap>(joinMapSerialized);
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ using PepperDash.Essentials.DM;
|
|||||||
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Core.Bridges
|
||||||
{
|
{
|
||||||
public static class DmTxControllerApiExtensions
|
public static class DmTxControllerApiExtensions
|
||||||
{
|
{
|
||||||
@@ -22,7 +22,7 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
{
|
{
|
||||||
DmTxControllerJoinMap joinMap = new DmTxControllerJoinMap();
|
DmTxControllerJoinMap joinMap = new DmTxControllerJoinMap();
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetJoinMapForDevice(joinMapKey);
|
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(joinMapSerialized))
|
if (!string.IsNullOrEmpty(joinMapSerialized))
|
||||||
joinMap = JsonConvert.DeserializeObject<DmTxControllerJoinMap>(joinMapSerialized);
|
joinMap = JsonConvert.DeserializeObject<DmTxControllerJoinMap>(joinMapSerialized);
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ using PepperDash.Essentials.DM;
|
|||||||
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Core.Bridges
|
||||||
{
|
{
|
||||||
public static class DmpsAudioOutputControllerApiExtensions
|
public static class DmpsAudioOutputControllerApiExtensions
|
||||||
{
|
{
|
||||||
@@ -20,7 +20,7 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
{
|
{
|
||||||
DmpsAudioOutputControllerJoinMap joinMap = new DmpsAudioOutputControllerJoinMap();
|
DmpsAudioOutputControllerJoinMap joinMap = new DmpsAudioOutputControllerJoinMap();
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetJoinMapForDevice(joinMapKey);
|
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(joinMapSerialized))
|
if (!string.IsNullOrEmpty(joinMapSerialized))
|
||||||
joinMap = JsonConvert.DeserializeObject<DmpsAudioOutputControllerJoinMap>(joinMapSerialized);
|
joinMap = JsonConvert.DeserializeObject<DmpsAudioOutputControllerJoinMap>(joinMapSerialized);
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ using PepperDash.Essentials.DM;
|
|||||||
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Core.Bridges
|
||||||
{
|
{
|
||||||
public static class DmpsRoutingControllerApiExtentions
|
public static class DmpsRoutingControllerApiExtentions
|
||||||
{
|
{
|
||||||
@@ -20,7 +20,7 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
{
|
{
|
||||||
DmpsRoutingControllerJoinMap joinMap = new DmpsRoutingControllerJoinMap();
|
DmpsRoutingControllerJoinMap joinMap = new DmpsRoutingControllerJoinMap();
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetJoinMapForDevice(joinMapKey);
|
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(joinMapSerialized))
|
if (!string.IsNullOrEmpty(joinMapSerialized))
|
||||||
joinMap = JsonConvert.DeserializeObject<DmpsRoutingControllerJoinMap>(joinMapSerialized);
|
joinMap = JsonConvert.DeserializeObject<DmpsRoutingControllerJoinMap>(joinMapSerialized);
|
||||||
|
|||||||
196
PepperDashEssentials/Bridges/EiscBridge.cs
Normal file
196
PepperDashEssentials/Bridges/EiscBridge.cs
Normal file
@@ -0,0 +1,196 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Crestron.SimplSharp.Reflection;
|
||||||
|
using Crestron.SimplSharpPro;
|
||||||
|
using Crestron.SimplSharpPro.EthernetCommunication;
|
||||||
|
using PepperDash.Core;
|
||||||
|
using PepperDash.Essentials.Core;
|
||||||
|
using PepperDash.Essentials.Core.Bridges;
|
||||||
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Bridges
|
||||||
|
{
|
||||||
|
[Obsolete("Please use 'eiscapiadvanced' in configurations going forward")]
|
||||||
|
public class EiscApi : BridgeApi
|
||||||
|
{
|
||||||
|
public EiscApiPropertiesConfig PropertiesConfig { get; private set; }
|
||||||
|
|
||||||
|
public ThreeSeriesTcpIpEthernetIntersystemCommunications Eisc { get; private set; }
|
||||||
|
|
||||||
|
public EiscApi(DeviceConfig dc) :
|
||||||
|
base(dc.Key)
|
||||||
|
{
|
||||||
|
PropertiesConfig = dc.Properties.ToObject<EiscApiPropertiesConfig>();
|
||||||
|
//PropertiesConfig = JsonConvert.DeserializeObject<EiscApiPropertiesConfig>(dc.Properties.ToString());
|
||||||
|
|
||||||
|
Eisc = new ThreeSeriesTcpIpEthernetIntersystemCommunications(PropertiesConfig.Control.IpIdInt, PropertiesConfig.Control.TcpSshProperties.Address, Global.ControlSystem);
|
||||||
|
|
||||||
|
Eisc.SigChange += Eisc_SigChange;
|
||||||
|
|
||||||
|
AddPostActivationAction(() =>
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Linking Devices...");
|
||||||
|
|
||||||
|
foreach (var d in PropertiesConfig.Devices)
|
||||||
|
{
|
||||||
|
var device = DeviceManager.GetDeviceForKey(d.DeviceKey);
|
||||||
|
|
||||||
|
if (device == null) continue;
|
||||||
|
|
||||||
|
Debug.Console(1, this, "Linking Device: '{0}'", device.Key);
|
||||||
|
if (typeof(IBridge).IsAssignableFrom(device.GetType().GetCType())) // Check for this first to allow bridges in plugins to override existing bridges that apply to the same type.
|
||||||
|
{
|
||||||
|
Debug.Console(2, this, "'{0}' is IBridge", device.Key);
|
||||||
|
|
||||||
|
var dev = device as IBridge;
|
||||||
|
|
||||||
|
if (dev == null)
|
||||||
|
{
|
||||||
|
Debug.Console(0, this, Debug.ErrorLogLevel.Error, "Cast to IBridge failed for {0}");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
dev.LinkToApi(Eisc, d.JoinStart, d.JoinMapKey);
|
||||||
|
}
|
||||||
|
if (!typeof(IBridgeAdvanced).IsAssignableFrom(device.GetType().GetCType())) continue;
|
||||||
|
Debug.Console(2, this, "'{0}' is IBridgeAdvanced", device.Key);
|
||||||
|
|
||||||
|
var advDev = device as IBridgeAdvanced;
|
||||||
|
|
||||||
|
if (advDev == null)
|
||||||
|
{
|
||||||
|
Debug.Console(0, this, Debug.ErrorLogLevel.Error, "Cast to IBridgeAdvanced failed for {0}");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
advDev.LinkToApi(Eisc, d.JoinStart, d.JoinMapKey, null);
|
||||||
|
}
|
||||||
|
catch (NullReferenceException)
|
||||||
|
{
|
||||||
|
Debug.ConsoleWithLog(0, this,
|
||||||
|
"Please update the bridge config to use EiscBridgeAdvanced with this device: {0}", device.Key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Debug.Console(1, this, "Devices Linked.");
|
||||||
|
|
||||||
|
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");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Used for debugging to trigger an action based on a join number and type
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="join"></param>
|
||||||
|
/// <param name="type"></param>
|
||||||
|
/// <param name="state"></param>
|
||||||
|
public void ExecuteJoinAction(uint join, string type, object state)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
switch (type.ToLower())
|
||||||
|
{
|
||||||
|
case "digital":
|
||||||
|
{
|
||||||
|
var uo = Eisc.BooleanOutput[join].UserObject as Action<bool>;
|
||||||
|
if (uo != null)
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Executing Action: {0}", uo.ToString());
|
||||||
|
uo(Convert.ToBoolean(state));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Debug.Console(1, this, "User Action is null. Nothing to Execute");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "analog":
|
||||||
|
{
|
||||||
|
var uo = Eisc.BooleanOutput[join].UserObject as Action<ushort>;
|
||||||
|
if (uo != null)
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Executing Action: {0}", uo.ToString());
|
||||||
|
uo(Convert.ToUInt16(state));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Debug.Console(1, this, "User Action is null. Nothing to Execute"); break;
|
||||||
|
}
|
||||||
|
case "serial":
|
||||||
|
{
|
||||||
|
var uo = Eisc.BooleanOutput[join].UserObject as Action<string>;
|
||||||
|
if (uo != null)
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Executing Action: {0}", uo.ToString());
|
||||||
|
uo(Convert.ToString(state));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Debug.Console(1, this, "User Action is null. Nothing to Execute");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
Debug.Console(1, "Unknown join type. Use digital/serial/analog");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Error: {0}", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Handles incoming sig changes
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="currentDevice"></param>
|
||||||
|
/// <param name="args"></param>
|
||||||
|
void Eisc_SigChange(object currentDevice, SigEventArgs args)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (Debug.Level >= 1)
|
||||||
|
Debug.Console(2, this, "EiscApi change: {0} {1}={2}", args.Sig.Type, args.Sig.Number, args.Sig.StringValue);
|
||||||
|
var uo = args.Sig.UserObject;
|
||||||
|
|
||||||
|
if (uo == null) return;
|
||||||
|
|
||||||
|
Debug.Console(2, this, "Executing Action: {0}", uo.ToString());
|
||||||
|
if (uo is Action<bool>)
|
||||||
|
(uo as Action<bool>)(args.Sig.BoolValue);
|
||||||
|
else if (uo is Action<ushort>)
|
||||||
|
(uo as Action<ushort>)(args.Sig.UShortValue);
|
||||||
|
else if (uo is Action<string>)
|
||||||
|
(uo as Action<string>)(args.Sig.StringValue);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Debug.Console(2, this, "Error in Eisc_SigChange handler: {0}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class EiscApiFactory : EssentialsDeviceFactory<EiscApiAdvanced>
|
||||||
|
{
|
||||||
|
public EiscApiFactory()
|
||||||
|
{
|
||||||
|
TypeNames = new List<string>() { "eiscapi" };
|
||||||
|
}
|
||||||
|
|
||||||
|
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
||||||
|
{
|
||||||
|
Debug.Console(1, "Factory Attempting to create new EiscApi Device");
|
||||||
|
|
||||||
|
return new EiscApi(dc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -10,7 +10,7 @@ using PepperDash.Essentials.Devices.Common;
|
|||||||
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Core.Bridges
|
||||||
{
|
{
|
||||||
public static class GenericLightingApiExtensions
|
public static class GenericLightingApiExtensions
|
||||||
{
|
{
|
||||||
@@ -18,7 +18,7 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
{
|
{
|
||||||
GenericLightingJoinMap joinMap = new GenericLightingJoinMap();
|
GenericLightingJoinMap joinMap = new GenericLightingJoinMap();
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetJoinMapForDevice(joinMapKey);
|
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(joinMapSerialized))
|
if (!string.IsNullOrEmpty(joinMapSerialized))
|
||||||
joinMap = JsonConvert.DeserializeObject<GenericLightingJoinMap>(joinMapSerialized);
|
joinMap = JsonConvert.DeserializeObject<GenericLightingJoinMap>(joinMapSerialized);
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ using PepperDash.Essentials.Core.CrestronIO;
|
|||||||
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Core.Bridges
|
||||||
{
|
{
|
||||||
public static class GenericRelayDeviceApiExtensions
|
public static class GenericRelayDeviceApiExtensions
|
||||||
{
|
{
|
||||||
@@ -19,7 +19,7 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
{
|
{
|
||||||
GenericRelayControllerJoinMap joinMap = new GenericRelayControllerJoinMap();
|
GenericRelayControllerJoinMap joinMap = new GenericRelayControllerJoinMap();
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetJoinMapForDevice(joinMapKey);
|
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(joinMapSerialized))
|
if (!string.IsNullOrEmpty(joinMapSerialized))
|
||||||
joinMap = JsonConvert.DeserializeObject<GenericRelayControllerJoinMap>(joinMapSerialized);
|
joinMap = JsonConvert.DeserializeObject<GenericRelayControllerJoinMap>(joinMapSerialized);
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ using PepperDash.Core;
|
|||||||
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Core.Bridges
|
||||||
{
|
{
|
||||||
public static class GlsOccupancySensorBaseControllerApiExtensions
|
public static class GlsOccupancySensorBaseControllerApiExtensions
|
||||||
{
|
{
|
||||||
@@ -20,7 +20,7 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
{
|
{
|
||||||
GlsOccupancySensorBaseJoinMap joinMap = new GlsOccupancySensorBaseJoinMap();
|
GlsOccupancySensorBaseJoinMap joinMap = new GlsOccupancySensorBaseJoinMap();
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetJoinMapForDevice(joinMapKey);
|
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(joinMapSerialized))
|
if (!string.IsNullOrEmpty(joinMapSerialized))
|
||||||
joinMap = JsonConvert.DeserializeObject<GlsOccupancySensorBaseJoinMap>(joinMapSerialized);
|
joinMap = JsonConvert.DeserializeObject<GlsOccupancySensorBaseJoinMap>(joinMapSerialized);
|
||||||
@@ -31,6 +31,16 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
|
|
||||||
#region Single and Dual Sensor Stuff
|
#region Single and Dual Sensor Stuff
|
||||||
occController.IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline]);
|
occController.IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline]);
|
||||||
|
trilist.StringInput[joinMap.Name].StringValue = occController.Name;
|
||||||
|
|
||||||
|
trilist.OnlineStatusChange += new Crestron.SimplSharpPro.OnlineStatusChangeEventHandler((d, args) =>
|
||||||
|
{
|
||||||
|
if (args.DeviceOnLine)
|
||||||
|
{
|
||||||
|
trilist.StringInput[joinMap.Name].StringValue = occController.Name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
// Occupied status
|
// Occupied status
|
||||||
trilist.SetSigTrueAction(joinMap.ForceOccupied, new Action(() => occController.ForceOccupied()));
|
trilist.SetSigTrueAction(joinMap.ForceOccupied, new Action(() => occController.ForceOccupied()));
|
||||||
@@ -38,6 +48,7 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
occController.RoomIsOccupiedFeedback.LinkInputSig(trilist.BooleanInput[joinMap.RoomOccupiedFeedback]);
|
occController.RoomIsOccupiedFeedback.LinkInputSig(trilist.BooleanInput[joinMap.RoomOccupiedFeedback]);
|
||||||
occController.RoomIsOccupiedFeedback.LinkComplementInputSig(trilist.BooleanInput[joinMap.RoomVacantFeedback]);
|
occController.RoomIsOccupiedFeedback.LinkComplementInputSig(trilist.BooleanInput[joinMap.RoomVacantFeedback]);
|
||||||
occController.RawOccupancyFeedback.LinkInputSig(trilist.BooleanInput[joinMap.RawOccupancyFeedback]);
|
occController.RawOccupancyFeedback.LinkInputSig(trilist.BooleanInput[joinMap.RawOccupancyFeedback]);
|
||||||
|
trilist.SetBoolSigAction(joinMap.EnableRawStates, new Action<bool>((b) => occController.EnableRawStates(b)));
|
||||||
|
|
||||||
// Timouts
|
// Timouts
|
||||||
trilist.SetUShortSigAction(joinMap.Timeout, new Action<ushort>((u) => occController.SetRemoteTimeout(u)));
|
trilist.SetUShortSigAction(joinMap.Timeout, new Action<ushort>((u) => occController.SetRemoteTimeout(u)));
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ using PepperDash.Essentials.DM;
|
|||||||
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Core.Bridges
|
||||||
{
|
{
|
||||||
public static class HdMdxxxCEControllerApiExtensions
|
public static class HdMdxxxCEControllerApiExtensions
|
||||||
{
|
{
|
||||||
@@ -22,7 +22,7 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
{
|
{
|
||||||
HdMdxxxCEControllerJoinMap joinMap = new HdMdxxxCEControllerJoinMap();
|
HdMdxxxCEControllerJoinMap joinMap = new HdMdxxxCEControllerJoinMap();
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetJoinMapForDevice(joinMapKey);
|
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(joinMapSerialized))
|
if (!string.IsNullOrEmpty(joinMapSerialized))
|
||||||
joinMap = JsonConvert.DeserializeObject<HdMdxxxCEControllerJoinMap>(joinMapSerialized);
|
joinMap = JsonConvert.DeserializeObject<HdMdxxxCEControllerJoinMap>(joinMapSerialized);
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ using PepperDash.Essentials.Core;
|
|||||||
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Core.Bridges
|
||||||
{
|
{
|
||||||
public static class IBasicCommunicationApiExtensions
|
public static class IBasicCommunicationApiExtensions
|
||||||
{
|
{
|
||||||
@@ -18,7 +18,7 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
{
|
{
|
||||||
IBasicCommunicationJoinMap joinMap = new IBasicCommunicationJoinMap();
|
IBasicCommunicationJoinMap joinMap = new IBasicCommunicationJoinMap();
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetJoinMapForDevice(joinMapKey);
|
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(joinMapSerialized))
|
if (!string.IsNullOrEmpty(joinMapSerialized))
|
||||||
joinMap = JsonConvert.DeserializeObject<IBasicCommunicationJoinMap>(joinMapSerialized);
|
joinMap = JsonConvert.DeserializeObject<IBasicCommunicationJoinMap>(joinMapSerialized);
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
using Crestron.SimplSharpPro.DeviceSupport;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Bridges
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Defines a device that uses the legacy JoinMapBase for its join map
|
||||||
|
/// </summary>
|
||||||
|
[Obsolete("IBridgeAdvanced should be used going forward with JoinMapBaseAdvanced")]
|
||||||
public interface IBridge
|
public interface IBridge
|
||||||
{
|
{
|
||||||
void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey);
|
void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey);
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ using PepperDash.Essentials.Core.CrestronIO;
|
|||||||
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Core.Bridges
|
||||||
{
|
{
|
||||||
public static class IDigitalInputApiExtenstions
|
public static class IDigitalInputApiExtenstions
|
||||||
{
|
{
|
||||||
@@ -19,7 +19,7 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
{
|
{
|
||||||
IDigitalInputJoinMap joinMap = new IDigitalInputJoinMap();
|
IDigitalInputJoinMap joinMap = new IDigitalInputJoinMap();
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetJoinMapForDevice(joinMapKey);
|
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(joinMapSerialized))
|
if (!string.IsNullOrEmpty(joinMapSerialized))
|
||||||
joinMap = JsonConvert.DeserializeObject<IDigitalInputJoinMap>(joinMapSerialized);
|
joinMap = JsonConvert.DeserializeObject<IDigitalInputJoinMap>(joinMapSerialized);
|
||||||
|
|||||||
128
PepperDashEssentials/Bridges/IRSetTopBoxBaseBridge.cs
Normal file
128
PepperDashEssentials/Bridges/IRSetTopBoxBaseBridge.cs
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using Crestron.SimplSharp;
|
||||||
|
using Crestron.SimplSharpPro.DeviceSupport;
|
||||||
|
using PepperDash.Core;
|
||||||
|
using PepperDash.Essentials.Core;
|
||||||
|
using PepperDash.Essentials.Devices.Common;
|
||||||
|
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core.Bridges
|
||||||
|
{
|
||||||
|
public static class IRSetTopBoxBaseApiExtensions
|
||||||
|
{
|
||||||
|
public static void LinkToApi(this PepperDash.Essentials.Devices.Common.IRSetTopBoxBase stbDevice, BasicTriList trilist, uint joinStart, string joinMapKey)
|
||||||
|
{
|
||||||
|
SetTopBoxControllerJoinMap joinMap = new SetTopBoxControllerJoinMap();
|
||||||
|
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(joinMapSerialized))
|
||||||
|
joinMap = JsonConvert.DeserializeObject<SetTopBoxControllerJoinMap>(joinMapSerialized);
|
||||||
|
|
||||||
|
joinMap.OffsetJoinNumbers(joinStart);
|
||||||
|
|
||||||
|
Debug.Console(1, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
|
||||||
|
Debug.Console(0, "Linking to Display: {0}", stbDevice.Name);
|
||||||
|
|
||||||
|
trilist.StringInput[joinMap.Name].StringValue = stbDevice.Name;
|
||||||
|
|
||||||
|
var stbBase = stbDevice as ISetTopBoxControls;
|
||||||
|
if (stbBase != null)
|
||||||
|
{
|
||||||
|
trilist.BooleanInput[joinMap.HasDpad].BoolValue = stbBase.HasDpad;
|
||||||
|
trilist.BooleanInput[joinMap.HasNumeric].BoolValue = stbBase.HasNumeric;
|
||||||
|
trilist.BooleanInput[joinMap.HasDvr].BoolValue = stbBase.HasDvr;
|
||||||
|
trilist.BooleanInput[joinMap.HasPresets].BoolValue = stbBase.HasPresets;
|
||||||
|
|
||||||
|
trilist.SetBoolSigAction(joinMap.DvrList, (b) => stbBase.DvrList(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.Replay, (b) => stbBase.Replay(b));
|
||||||
|
|
||||||
|
trilist.SetStringSigAction(joinMap.LoadPresets, (s) => stbBase.LoadPresets(s));
|
||||||
|
}
|
||||||
|
|
||||||
|
var stbPower = stbDevice as IPower;
|
||||||
|
if (stbPower != null)
|
||||||
|
{
|
||||||
|
trilist.SetSigTrueAction(joinMap.PowerOn, () => stbPower.PowerOn());
|
||||||
|
trilist.SetSigTrueAction(joinMap.PowerOff, () => stbPower.PowerOff());
|
||||||
|
trilist.SetSigTrueAction(joinMap.PowerToggle, () => stbPower.PowerToggle());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
var stbDPad = stbDevice as IDPad;
|
||||||
|
if (stbDPad != null)
|
||||||
|
{
|
||||||
|
trilist.SetBoolSigAction(joinMap.Up, (b) => stbDPad.Up(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.Down, (b) => stbDPad.Down(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.Left, (b) => stbDPad.Left(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.Right, (b) => stbDPad.Right(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.Select, (b) => stbDPad.Select(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.Menu, (b) => stbDPad.Menu(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.Exit, (b) => stbDPad.Exit(b));
|
||||||
|
}
|
||||||
|
|
||||||
|
var stbChannel = stbDevice as IChannel;
|
||||||
|
if (stbChannel != null)
|
||||||
|
{
|
||||||
|
trilist.SetBoolSigAction(joinMap.ChannelUp, (b) => stbChannel.ChannelUp(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.ChannelDown, (b) => stbChannel.ChannelDown(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.LastChannel, (b) => stbChannel.LastChannel(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.Guide, (b) => stbChannel.Guide(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.Info, (b) => stbChannel.Info(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.Exit, (b) => stbChannel.Exit(b));
|
||||||
|
}
|
||||||
|
|
||||||
|
var stbColor = stbDevice as IColor;
|
||||||
|
if (stbColor != null)
|
||||||
|
{
|
||||||
|
trilist.SetBoolSigAction(joinMap.Red, (b) => stbColor.Red(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.Green, (b) => stbColor.Green(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.Yellow, (b) => stbColor.Yellow(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.Blue, (b) => stbColor.Blue(b));
|
||||||
|
}
|
||||||
|
|
||||||
|
var stbKeypad = stbDevice as ISetTopBoxNumericKeypad;
|
||||||
|
if (stbKeypad != null)
|
||||||
|
{
|
||||||
|
trilist.StringInput[joinMap.KeypadAccessoryButton1Label].StringValue = stbKeypad.KeypadAccessoryButton1Label;
|
||||||
|
trilist.StringInput[joinMap.KeypadAccessoryButton2Label].StringValue = stbKeypad.KeypadAccessoryButton2Label;
|
||||||
|
|
||||||
|
trilist.BooleanInput[joinMap.HasKeypadAccessoryButton1].BoolValue = stbKeypad.HasKeypadAccessoryButton1;
|
||||||
|
trilist.BooleanInput[joinMap.HasKeypadAccessoryButton2].BoolValue = stbKeypad.HasKeypadAccessoryButton2;
|
||||||
|
|
||||||
|
trilist.SetBoolSigAction(joinMap.Digit0, (b) => stbKeypad.Digit0(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.Digit1, (b) => stbKeypad.Digit1(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.Digit2, (b) => stbKeypad.Digit2(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.Digit3, (b) => stbKeypad.Digit3(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.Digit4, (b) => stbKeypad.Digit4(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.Digit5, (b) => stbKeypad.Digit5(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.Digit6, (b) => stbKeypad.Digit6(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.Digit7, (b) => stbKeypad.Digit7(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.Digit8, (b) => stbKeypad.Digit8(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.Digit9, (b) => stbKeypad.Digit9(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.KeypadAccessoryButton1Press, (b) => stbKeypad.KeypadAccessoryButton1(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.KeypadAccessoryButton2Press, (b) => stbKeypad.KeypadAccessoryButton1(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.Dash, (b) => stbKeypad.Dash(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.KeypadEnter, (b) => stbKeypad.KeypadEnter(b));
|
||||||
|
}
|
||||||
|
|
||||||
|
var stbTransport = stbDevice as ITransport;
|
||||||
|
if (stbTransport != null)
|
||||||
|
{
|
||||||
|
trilist.SetBoolSigAction(joinMap.Play, (b) => stbTransport.Play(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.Pause, (b) => stbTransport.Pause(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.Rewind, (b) => stbTransport.Rewind(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.FFwd, (b) => stbTransport.FFwd(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.ChapMinus, (b) => stbTransport.ChapMinus(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.ChapPlus, (b) => stbTransport.ChapPlus(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.Stop, (b) => stbTransport.Stop(b));
|
||||||
|
trilist.SetBoolSigAction(joinMap.Record, (b) => stbTransport.Record(b));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,6 +7,7 @@ using PepperDash.Essentials.Core;
|
|||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Bridges
|
||||||
{
|
{
|
||||||
|
[Obsolete("Please use version PepperDash.Essentials.Core.Bridges")]
|
||||||
public class AirMediaControllerJoinMap : JoinMapBase
|
public class AirMediaControllerJoinMap : JoinMapBase
|
||||||
{
|
{
|
||||||
#region Digitals
|
#region Digitals
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ using PepperDash.Essentials.Core;
|
|||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Bridges
|
||||||
{
|
{
|
||||||
|
[Obsolete("Please use version PepperDash.Essentials.Core.Bridges")]
|
||||||
public class AppleTvJoinMap : JoinMapBase
|
public class AppleTvJoinMap : JoinMapBase
|
||||||
{
|
{
|
||||||
#region Digitals
|
#region Digitals
|
||||||
|
|||||||
@@ -1,43 +1,45 @@
|
|||||||
using System.Linq;
|
using System;
|
||||||
using Crestron.SimplSharp.Reflection;
|
using System.Linq;
|
||||||
using PepperDash.Essentials.Core;
|
using Crestron.SimplSharp.Reflection;
|
||||||
|
using PepperDash.Essentials.Core;
|
||||||
namespace PepperDash.Essentials.Bridges
|
|
||||||
{
|
namespace PepperDash.Essentials.Bridges
|
||||||
public class C2nRthsControllerJoinMap:JoinMapBase
|
{
|
||||||
{
|
[Obsolete("Please use version PepperDash.Essentials.Core.Bridges")]
|
||||||
public uint IsOnline { get; set; }
|
public class C2nRthsControllerJoinMap:JoinMapBase
|
||||||
public uint Name { get; set; }
|
{
|
||||||
public uint Temperature { get; set; }
|
public uint IsOnline { get; set; }
|
||||||
public uint Humidity { get; set; }
|
public uint Name { get; set; }
|
||||||
public uint TemperatureFormat { get; set; }
|
public uint Temperature { get; set; }
|
||||||
|
public uint Humidity { get; set; }
|
||||||
public C2nRthsControllerJoinMap()
|
public uint TemperatureFormat { get; set; }
|
||||||
{
|
|
||||||
//digital
|
public C2nRthsControllerJoinMap()
|
||||||
IsOnline = 1;
|
{
|
||||||
TemperatureFormat = 2;
|
//digital
|
||||||
|
IsOnline = 1;
|
||||||
//Analog
|
TemperatureFormat = 2;
|
||||||
Temperature = 2;
|
|
||||||
Humidity = 3;
|
//Analog
|
||||||
|
Temperature = 2;
|
||||||
//serial
|
Humidity = 3;
|
||||||
Name = 1;
|
|
||||||
|
//serial
|
||||||
|
Name = 1;
|
||||||
}
|
|
||||||
|
|
||||||
public override void OffsetJoinNumbers(uint joinStart)
|
}
|
||||||
{
|
|
||||||
var joinOffset = joinStart - 1;
|
public override void OffsetJoinNumbers(uint joinStart)
|
||||||
var properties =
|
{
|
||||||
GetType().GetCType().GetProperties().Where(p => p.PropertyType == typeof(uint)).ToList();
|
var joinOffset = joinStart - 1;
|
||||||
|
var properties =
|
||||||
foreach (var propertyInfo in properties)
|
GetType().GetCType().GetProperties().Where(p => p.PropertyType == typeof(uint)).ToList();
|
||||||
{
|
|
||||||
propertyInfo.SetValue(this, (uint)propertyInfo.GetValue(this, null) + joinOffset, null);
|
foreach (var propertyInfo in properties)
|
||||||
}
|
{
|
||||||
}
|
propertyInfo.SetValue(this, (uint)propertyInfo.GetValue(this, null) + joinOffset, null);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -8,54 +8,59 @@ using PepperDash.Essentials.Core;
|
|||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Bridges
|
||||||
{
|
{
|
||||||
public class CameraControllerJoinMap : JoinMapBase
|
/// <summary>
|
||||||
|
/// Join map for CameraBase devices
|
||||||
|
/// </summary>
|
||||||
|
///
|
||||||
|
[Obsolete("Please use version PepperDash.Essentials.Core.Bridges")]
|
||||||
|
public class CameraControllerJoinMap : JoinMapBaseAdvanced
|
||||||
{
|
{
|
||||||
public uint IsOnline { get; set; }
|
[JoinName("TiltUp")]
|
||||||
public uint PowerOff { get; set; }
|
public JoinDataComplete TiltUp = new JoinDataComplete(new JoinData() { JoinNumber = 1, JoinSpan = 1 }, new JoinMetadata() { Label = "Tilt Up", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
public uint PowerOn { get; set; }
|
[JoinName("TiltDown")]
|
||||||
public uint Up { get; set; }
|
public JoinDataComplete TiltDown = new JoinDataComplete(new JoinData() { JoinNumber = 2, JoinSpan = 1 }, new JoinMetadata() { Label = "Tilt Down", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
public uint Down { get; set; }
|
[JoinName("PanLeft")]
|
||||||
public uint Left { get; set; }
|
public JoinDataComplete PanLeft = new JoinDataComplete(new JoinData() { JoinNumber = 3, JoinSpan = 1 }, new JoinMetadata() { Label = "Pan Left", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
public uint Right { get; set; }
|
[JoinName("PanRight")]
|
||||||
public uint ZoomIn { get; set; }
|
public JoinDataComplete PanRight = new JoinDataComplete(new JoinData() { JoinNumber = 4, JoinSpan = 1 }, new JoinMetadata() { Label = "Pan Right", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
public uint ZoomOut { get; set; }
|
[JoinName("ZoomIn")]
|
||||||
public uint PresetRecallOffset { get; set; }
|
public JoinDataComplete ZoomIn = new JoinDataComplete(new JoinData() { JoinNumber = 5, JoinSpan = 1 }, new JoinMetadata() { Label = "Zoom In", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
public uint PresetSaveOffset { get; set; }
|
[JoinName("ZoomOut")]
|
||||||
public uint NumberOfPresets { get; set; }
|
public JoinDataComplete ZoomOut = new JoinDataComplete(new JoinData() { JoinNumber = 6, JoinSpan = 1 }, new JoinMetadata() { Label = "Zoom Out", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
public CameraControllerJoinMap()
|
[JoinName("IsOnline")]
|
||||||
|
public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData() { JoinNumber = 9, JoinSpan = 1 }, new JoinMetadata() { Label = "Is Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
[JoinName("PowerOn")]
|
||||||
|
public JoinDataComplete PowerOn = new JoinDataComplete(new JoinData() { JoinNumber = 7, JoinSpan = 1 }, new JoinMetadata() { Label = "Power On", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
[JoinName("PowerOff")]
|
||||||
|
public JoinDataComplete PowerOff = new JoinDataComplete(new JoinData() { JoinNumber = 8, JoinSpan = 1 }, new JoinMetadata() { Label = "Power Off", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("NumberOfPresets")]
|
||||||
|
public JoinDataComplete NumberOfPresets = new JoinDataComplete(new JoinData() { JoinNumber = 11, JoinSpan = 1 }, new JoinMetadata() { Label = "Tells Essentials the number of defined presets", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Analog });
|
||||||
|
[JoinName("PresetRecallStart")]
|
||||||
|
public JoinDataComplete PresetRecallStart = new JoinDataComplete(new JoinData() { JoinNumber = 11, JoinSpan = 20 }, new JoinMetadata() { Label = "Preset Recall Start", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
[JoinName("PresetLabelStart")]
|
||||||
|
public JoinDataComplete PresetLabelStart = new JoinDataComplete(new JoinData() { JoinNumber = 11, JoinSpan = 20 }, new JoinMetadata() { Label = "Preset Label Start", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Serial });
|
||||||
|
[JoinName("PresetSaveStart")]
|
||||||
|
public JoinDataComplete PresetSaveStart = new JoinDataComplete(new JoinData() { JoinNumber = 31, JoinSpan = 20 }, new JoinMetadata() { Label = "Preset Save Start", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("CameraModeAuto")]
|
||||||
|
public JoinDataComplete CameraModeAuto = new JoinDataComplete(new JoinData() { JoinNumber = 51, JoinSpan = 1 }, new JoinMetadata() { Label = "Camera Mode Auto", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
[JoinName("CameraModeManual")]
|
||||||
|
public JoinDataComplete CameraModeManual = new JoinDataComplete(new JoinData() { JoinNumber = 52, JoinSpan = 1 }, new JoinMetadata() { Label = "Camera Mode Manual", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
[JoinName("CameraModeOff")]
|
||||||
|
public JoinDataComplete CameraModeOff = new JoinDataComplete(new JoinData() { JoinNumber = 53, JoinSpan = 1 }, new JoinMetadata() { Label = "Camera Mode Off", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("SupportsCameraModeAuto")]
|
||||||
|
public JoinDataComplete SupportsCameraModeAuto = new JoinDataComplete(new JoinData() { JoinNumber = 55, JoinSpan = 1 }, new JoinMetadata() { Label = "Supports Camera Mode Auto", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
[JoinName("SupportsCameraModeOff")]
|
||||||
|
public JoinDataComplete SupportsCameraModeOff = new JoinDataComplete(new JoinData() { JoinNumber = 56, JoinSpan = 1 }, new JoinMetadata() { Label = "Supports Camera Mode Off", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
[JoinName("SupportsPresets")]
|
||||||
|
public JoinDataComplete SupportsPresets = new JoinDataComplete(new JoinData() { JoinNumber = 57, JoinSpan = 1 }, new JoinMetadata() { Label = "Supports Presets", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
public CameraControllerJoinMap(uint joinStart)
|
||||||
|
: base(joinStart, typeof(CameraControllerJoinMap))
|
||||||
{
|
{
|
||||||
// Digital
|
|
||||||
IsOnline = 9;
|
|
||||||
PowerOff = 8;
|
|
||||||
PowerOn = 7;
|
|
||||||
Up = 1;
|
|
||||||
Down = 2;
|
|
||||||
Left = 3;
|
|
||||||
Right = 4;
|
|
||||||
ZoomIn = 5;
|
|
||||||
ZoomOut = 6;
|
|
||||||
PresetRecallOffset = 10;
|
|
||||||
PresetSaveOffset = 30;
|
|
||||||
NumberOfPresets = 5;
|
|
||||||
// Analog
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void OffsetJoinNumbers(uint joinStart)
|
|
||||||
{
|
|
||||||
var joinOffset = joinStart - 1;
|
|
||||||
|
|
||||||
IsOnline = IsOnline + joinOffset;
|
|
||||||
PowerOff = PowerOff + joinOffset;
|
|
||||||
PowerOn = PowerOn + joinOffset;
|
|
||||||
Up = Up + joinOffset;
|
|
||||||
Down = Down + joinOffset;
|
|
||||||
Left = Left + joinOffset;
|
|
||||||
Right = Right + joinOffset;
|
|
||||||
ZoomIn = ZoomIn + joinOffset;
|
|
||||||
ZoomOut = ZoomOut + joinOffset;
|
|
||||||
PresetRecallOffset = PresetRecallOffset + joinOffset;
|
|
||||||
PresetSaveOffset = PresetSaveOffset + joinOffset;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8,6 +8,7 @@ using PepperDash.Essentials.Core;
|
|||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Bridges
|
||||||
{
|
{
|
||||||
|
[Obsolete("Please use version PepperDash.Essentials.Core.Bridges")]
|
||||||
public class DigitalLoggerJoinMap : JoinMapBase
|
public class DigitalLoggerJoinMap : JoinMapBase
|
||||||
{
|
{
|
||||||
public uint IsOnline { get; set; }
|
public uint IsOnline { get; set; }
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ using PepperDash.Essentials.Core;
|
|||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Bridges
|
||||||
{
|
{
|
||||||
|
[Obsolete("Please use version PepperDash.Essentials.Core.Bridges")]
|
||||||
public class DisplayControllerJoinMap : JoinMapBase
|
public class DisplayControllerJoinMap : JoinMapBase
|
||||||
{
|
{
|
||||||
#region Digitals
|
#region Digitals
|
||||||
|
|||||||
@@ -1,109 +1,110 @@
|
|||||||
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 PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges {
|
namespace PepperDash.Essentials.Bridges {
|
||||||
public class DmBladeChassisControllerJoinMap : JoinMapBase {
|
[Obsolete("Please use version PepperDash.Essentials.Core.Bridges")]
|
||||||
#region Digital/Analogs
|
public class DmBladeChassisControllerJoinMap : JoinMapBase {
|
||||||
#endregion
|
#region Digital/Analogs
|
||||||
|
#endregion
|
||||||
#region Digitals
|
|
||||||
/// <summary>
|
#region Digitals
|
||||||
/// High when device is online
|
/// <summary>
|
||||||
/// </summary>
|
/// High when device is online
|
||||||
public uint IsOnline { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint IsOnline { get; set; }
|
||||||
/// Range reports video sync feedback for each input
|
/// <summary>
|
||||||
/// </summary>
|
/// Range reports video sync feedback for each input
|
||||||
public uint VideoSyncStatus { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint VideoSyncStatus { get; set; }
|
||||||
/// Range reports high if corresponding input's endpoint is online
|
/// <summary>
|
||||||
/// </summary>
|
/// Range reports high if corresponding input's endpoint is online
|
||||||
public uint InputEndpointOnline { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint InputEndpointOnline { get; set; }
|
||||||
/// Range reports high if corresponding output's endpoint is online
|
/// <summary>
|
||||||
/// </summary>
|
/// Range reports high if corresponding output's endpoint is online
|
||||||
public uint OutputEndpointOnline { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint OutputEndpointOnline { get; set; }
|
||||||
/// Range reports high if corresponding input's transmitter supports bridging as a separate device for detailed AV switching, HDCP control, etc.
|
/// <summary>
|
||||||
/// </summary>
|
/// Range reports high if corresponding input's transmitter supports bridging as a separate device for detailed AV switching, HDCP control, etc.
|
||||||
public uint TxAdvancedIsPresent { get; set; } // indicates that there is an attached transmitter that should be bridged to be interacted with
|
/// </summary>
|
||||||
#endregion
|
public uint TxAdvancedIsPresent { get; set; } // indicates that there is an attached transmitter that should be bridged to be interacted with
|
||||||
|
#endregion
|
||||||
#region Analogs
|
|
||||||
/// <summary>
|
#region Analogs
|
||||||
/// Range sets and reports the current video source for the corresponding output
|
/// <summary>
|
||||||
/// </summary>
|
/// Range sets and reports the current video source for the corresponding output
|
||||||
public uint OutputVideo { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint OutputVideo { get; set; }
|
||||||
/// Range sets and reports the current HDCP state for the corresponding input card
|
/// <summary>
|
||||||
/// </summary>
|
/// Range sets and reports the current HDCP state for the corresponding input card
|
||||||
public uint HdcpSupportState { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint HdcpSupportState { get; set; }
|
||||||
/// Range reports the highest supported HDCP state level for the corresponding input card
|
/// <summary>
|
||||||
/// </summary>
|
/// Range reports the highest supported HDCP state level for the corresponding input card
|
||||||
public uint HdcpSupportCapability { get; set; }
|
/// </summary>
|
||||||
#endregion
|
public uint HdcpSupportCapability { get; set; }
|
||||||
|
#endregion
|
||||||
#region Serials
|
|
||||||
/// <summary>
|
#region Serials
|
||||||
/// Range sets and reports the name for the corresponding input card
|
/// <summary>
|
||||||
/// </summary>
|
/// Range sets and reports the name for the corresponding input card
|
||||||
public uint InputNames { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint InputNames { get; set; }
|
||||||
/// Range sets and reports the name for the corresponding output card
|
/// <summary>
|
||||||
/// </summary>
|
/// Range sets and reports the name for the corresponding output card
|
||||||
public uint OutputNames { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint OutputNames { get; set; }
|
||||||
/// Range reports the name of the current video source for the corresponding output card
|
/// <summary>
|
||||||
/// </summary>
|
/// Range reports the name of the current video source for the corresponding output card
|
||||||
public uint OutputCurrentVideoInputNames { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint OutputCurrentVideoInputNames { get; set; }
|
||||||
/// Range reports the current input resolution for each corresponding input card
|
/// <summary>
|
||||||
/// </summary>
|
/// Range reports the current input resolution for each corresponding input card
|
||||||
public uint InputCurrentResolution { get; set; }
|
/// </summary>
|
||||||
#endregion
|
public uint InputCurrentResolution { get; set; }
|
||||||
|
#endregion
|
||||||
public DmBladeChassisControllerJoinMap() {
|
|
||||||
//Digital/Analog
|
public DmBladeChassisControllerJoinMap() {
|
||||||
|
//Digital/Analog
|
||||||
//Digital
|
|
||||||
IsOnline = 11;
|
//Digital
|
||||||
VideoSyncStatus = 100; //101-299
|
IsOnline = 11;
|
||||||
InputEndpointOnline = 500; //501-699
|
VideoSyncStatus = 100; //101-299
|
||||||
OutputEndpointOnline = 700; //701-899
|
InputEndpointOnline = 500; //501-699
|
||||||
TxAdvancedIsPresent = 1000; //1001-1199
|
OutputEndpointOnline = 700; //701-899
|
||||||
|
TxAdvancedIsPresent = 1000; //1001-1199
|
||||||
//Analog
|
|
||||||
OutputVideo = 100; //101-299
|
//Analog
|
||||||
HdcpSupportState = 1000; //1001-1199
|
OutputVideo = 100; //101-299
|
||||||
HdcpSupportCapability = 1200; //1201-1399
|
HdcpSupportState = 1000; //1001-1199
|
||||||
|
HdcpSupportCapability = 1200; //1201-1399
|
||||||
|
|
||||||
//Serial
|
|
||||||
InputNames = 100; //101-299
|
//Serial
|
||||||
OutputNames = 300; //301-499
|
InputNames = 100; //101-299
|
||||||
OutputCurrentVideoInputNames = 2000; //2001-2199
|
OutputNames = 300; //301-499
|
||||||
InputCurrentResolution = 2400; // 2401-2599
|
OutputCurrentVideoInputNames = 2000; //2001-2199
|
||||||
}
|
InputCurrentResolution = 2400; // 2401-2599
|
||||||
|
}
|
||||||
public override void OffsetJoinNumbers(uint joinStart) {
|
|
||||||
var joinOffset = joinStart - 1;
|
public override void OffsetJoinNumbers(uint joinStart) {
|
||||||
|
var joinOffset = joinStart - 1;
|
||||||
IsOnline = IsOnline + joinOffset;
|
|
||||||
OutputVideo = OutputVideo + joinOffset;
|
IsOnline = IsOnline + joinOffset;
|
||||||
VideoSyncStatus = VideoSyncStatus + joinOffset;
|
OutputVideo = OutputVideo + joinOffset;
|
||||||
InputNames = InputNames + joinOffset;
|
VideoSyncStatus = VideoSyncStatus + joinOffset;
|
||||||
OutputNames = OutputNames + joinOffset;
|
InputNames = InputNames + joinOffset;
|
||||||
OutputCurrentVideoInputNames = OutputCurrentVideoInputNames + joinOffset;
|
OutputNames = OutputNames + joinOffset;
|
||||||
InputCurrentResolution = InputCurrentResolution + joinOffset;
|
OutputCurrentVideoInputNames = OutputCurrentVideoInputNames + joinOffset;
|
||||||
InputEndpointOnline = InputEndpointOnline + joinOffset;
|
InputCurrentResolution = InputCurrentResolution + joinOffset;
|
||||||
OutputEndpointOnline = OutputEndpointOnline + joinOffset;
|
InputEndpointOnline = InputEndpointOnline + joinOffset;
|
||||||
HdcpSupportState = HdcpSupportState + joinOffset;
|
OutputEndpointOnline = OutputEndpointOnline + joinOffset;
|
||||||
HdcpSupportCapability = HdcpSupportCapability + joinOffset;
|
HdcpSupportState = HdcpSupportState + joinOffset;
|
||||||
}
|
HdcpSupportCapability = HdcpSupportCapability + joinOffset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
@@ -7,6 +7,7 @@ using PepperDash.Essentials.Core;
|
|||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Bridges
|
||||||
{
|
{
|
||||||
|
[Obsolete("Please use version PepperDash.Essentials.Core.Bridges")]
|
||||||
public class DmChassisControllerJoinMap : JoinMapBase
|
public class DmChassisControllerJoinMap : JoinMapBase
|
||||||
{
|
{
|
||||||
#region Digital/Analogs
|
#region Digital/Analogs
|
||||||
@@ -38,6 +39,10 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
/// Range reports high if corresponding input's transmitter supports bridging as a separate device for detailed AV switching, HDCP control, etc.
|
/// Range reports high if corresponding input's transmitter supports bridging as a separate device for detailed AV switching, HDCP control, etc.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public uint TxAdvancedIsPresent { get; set; } // indicates that there is an attached transmitter that should be bridged to be interacted with
|
public uint TxAdvancedIsPresent { get; set; } // indicates that there is an attached transmitter that should be bridged to be interacted with
|
||||||
|
/// <summary>
|
||||||
|
/// Range reports high if corresponding output is disabled by HDCP.
|
||||||
|
/// </summary>
|
||||||
|
public uint OutputDisabledByHdcp { get; set; } // indicates that there is an attached transmitter that should be bridged to be interacted with
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Analogs
|
#region Analogs
|
||||||
@@ -101,6 +106,7 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
InputEndpointOnline = 500; //501-699
|
InputEndpointOnline = 500; //501-699
|
||||||
OutputEndpointOnline = 700; //701-899
|
OutputEndpointOnline = 700; //701-899
|
||||||
TxAdvancedIsPresent = 1000; //1001-1199
|
TxAdvancedIsPresent = 1000; //1001-1199
|
||||||
|
OutputDisabledByHdcp = 1200; //1201-1399
|
||||||
|
|
||||||
//Analog
|
//Analog
|
||||||
OutputVideo = 100; //101-299
|
OutputVideo = 100; //101-299
|
||||||
@@ -139,6 +145,7 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
OutputEndpointOnline = OutputEndpointOnline + joinOffset;
|
OutputEndpointOnline = OutputEndpointOnline + joinOffset;
|
||||||
HdcpSupportState = HdcpSupportState + joinOffset;
|
HdcpSupportState = HdcpSupportState + joinOffset;
|
||||||
HdcpSupportCapability = HdcpSupportCapability + joinOffset;
|
HdcpSupportCapability = HdcpSupportCapability + joinOffset;
|
||||||
|
OutputDisabledByHdcp = OutputDisabledByHdcp + joinOffset;
|
||||||
TxAdvancedIsPresent = TxAdvancedIsPresent + joinOffset;
|
TxAdvancedIsPresent = TxAdvancedIsPresent + joinOffset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ using PepperDash.Essentials.Core;
|
|||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Bridges
|
||||||
{
|
{
|
||||||
|
[Obsolete("Please use version PepperDash.Essentials.Core.Bridges")]
|
||||||
public class DmRmcControllerJoinMap : JoinMapBase
|
public class DmRmcControllerJoinMap : JoinMapBase
|
||||||
{
|
{
|
||||||
#region Digitals
|
#region Digitals
|
||||||
@@ -37,8 +38,12 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
/// Reports the EDID serial number value
|
/// Reports the EDID serial number value
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public uint EdidSerialNumber { get; set; }
|
public uint EdidSerialNumber { get; set; }
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region Analogs
|
||||||
|
public uint AudioVideoSource { get; set; }
|
||||||
|
#endregion
|
||||||
|
|
||||||
public DmRmcControllerJoinMap()
|
public DmRmcControllerJoinMap()
|
||||||
{
|
{
|
||||||
// Digital
|
// Digital
|
||||||
@@ -50,6 +55,9 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
EdidName = 3;
|
EdidName = 3;
|
||||||
EdidPrefferedTiming = 4;
|
EdidPrefferedTiming = 4;
|
||||||
EdidSerialNumber = 5;
|
EdidSerialNumber = 5;
|
||||||
|
|
||||||
|
//Analog
|
||||||
|
AudioVideoSource = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OffsetJoinNumbers(uint joinStart)
|
public override void OffsetJoinNumbers(uint joinStart)
|
||||||
@@ -61,7 +69,8 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
EdidManufacturer = EdidManufacturer + joinOffset;
|
EdidManufacturer = EdidManufacturer + joinOffset;
|
||||||
EdidName = EdidName + joinOffset;
|
EdidName = EdidName + joinOffset;
|
||||||
EdidPrefferedTiming = EdidPrefferedTiming + joinOffset;
|
EdidPrefferedTiming = EdidPrefferedTiming + joinOffset;
|
||||||
EdidSerialNumber = EdidSerialNumber + joinOffset;
|
EdidSerialNumber = EdidSerialNumber + joinOffset;
|
||||||
|
AudioVideoSource = AudioVideoSource + joinOffset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,12 +1,9 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Bridges
|
||||||
{
|
{
|
||||||
|
[Obsolete("Please use version PepperDash.Essentials.Core.Bridges")]
|
||||||
public class DmTxControllerJoinMap : JoinMapBase
|
public class DmTxControllerJoinMap : JoinMapBase
|
||||||
{
|
{
|
||||||
#region Digitals
|
#region Digitals
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ using PepperDash.Essentials.Core;
|
|||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Bridges
|
||||||
{
|
{
|
||||||
|
[Obsolete("Please use version PepperDash.Essentials.Core.Bridges")]
|
||||||
public class DmpsAudioOutputControllerJoinMap : JoinMapBase
|
public class DmpsAudioOutputControllerJoinMap : JoinMapBase
|
||||||
{
|
{
|
||||||
#region Digital/Analog
|
#region Digital/Analog
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ using PepperDash.Essentials.Core;
|
|||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Bridges
|
||||||
{
|
{
|
||||||
|
[Obsolete("Please use version PepperDash.Essentials.Core.Bridges")]
|
||||||
public class DmpsRoutingControllerJoinMap : JoinMapBase
|
public class DmpsRoutingControllerJoinMap : JoinMapBase
|
||||||
{
|
{
|
||||||
#region Digitals
|
#region Digitals
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ using PepperDash.Essentials.Core;
|
|||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Bridges
|
||||||
{
|
{
|
||||||
|
[Obsolete("Please use version PepperDash.Essentials.Core.Bridges")]
|
||||||
public class GenericLightingJoinMap : JoinMapBase
|
public class GenericLightingJoinMap : JoinMapBase
|
||||||
{
|
{
|
||||||
public uint IsOnline { get; set; }
|
public uint IsOnline { get; set; }
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ using PepperDash.Essentials.Core;
|
|||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Bridges
|
||||||
{
|
{
|
||||||
|
[Obsolete("Please use version PepperDash.Essentials.Core.Bridges")]
|
||||||
public class GenericRelayControllerJoinMap : JoinMapBase
|
public class GenericRelayControllerJoinMap : JoinMapBase
|
||||||
{
|
{
|
||||||
#region Digitals
|
#region Digitals
|
||||||
|
|||||||
@@ -1,230 +1,239 @@
|
|||||||
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 PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Bridges
|
||||||
{
|
{
|
||||||
public class GlsOccupancySensorBaseJoinMap : JoinMapBase
|
[Obsolete("Please use version PepperDash.Essentials.Core.Bridges")]
|
||||||
{
|
public class GlsOccupancySensorBaseJoinMap : JoinMapBase
|
||||||
#region Digitals
|
{
|
||||||
|
#region Digitals
|
||||||
/// <summary>
|
|
||||||
/// High when device is online
|
/// <summary>
|
||||||
/// </summary>
|
/// High when device is online
|
||||||
public uint IsOnline { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint IsOnline { get; set; }
|
||||||
/// Forces the device to report occupied status
|
/// <summary>
|
||||||
/// </summary>
|
/// Forces the device to report occupied status
|
||||||
public uint ForceOccupied { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint ForceOccupied { get; set; }
|
||||||
/// Forces the device to report vacant status
|
/// <summary>
|
||||||
/// </summary>
|
/// Forces the device to report vacant status
|
||||||
public uint ForceVacant { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint ForceVacant { get; set; }
|
||||||
/// Enables raw status reporting
|
/// <summary>
|
||||||
/// </summary>
|
/// Enables raw status reporting
|
||||||
public uint EnableRawStates { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint EnableRawStates { get; set; }
|
||||||
/// High when raw occupancy is detected
|
/// <summary>
|
||||||
/// </summary>
|
/// High when raw occupancy is detected
|
||||||
public uint RawOccupancyFeedback { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint RawOccupancyFeedback { get; set; }
|
||||||
/// High when PIR sensor detects motion
|
/// <summary>
|
||||||
/// </summary>
|
/// High when PIR sensor detects motion
|
||||||
public uint RawOccupancyPirFeedback { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint RawOccupancyPirFeedback { get; set; }
|
||||||
/// High when US sensor detects motion
|
/// <summary>
|
||||||
/// </summary>
|
/// High when US sensor detects motion
|
||||||
public uint RawOccupancyUsFeedback { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint RawOccupancyUsFeedback { get; set; }
|
||||||
/// High when occupancy is detected
|
/// <summary>
|
||||||
/// </summary>
|
/// High when occupancy is detected
|
||||||
public uint RoomOccupiedFeedback { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint RoomOccupiedFeedback { get; set; }
|
||||||
/// Hich when occupancy is detected in the grace period
|
/// <summary>
|
||||||
/// </summary>
|
/// Hich when occupancy is detected in the grace period
|
||||||
public uint GraceOccupancyDetectedFeedback { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint GraceOccupancyDetectedFeedback { get; set; }
|
||||||
/// High when vacancy is detected
|
/// <summary>
|
||||||
/// </summary>
|
/// High when vacancy is detected
|
||||||
public uint RoomVacantFeedback { get; set; }
|
/// </summary>
|
||||||
|
public uint RoomVacantFeedback { get; set; }
|
||||||
/// <summary>
|
|
||||||
/// Enables the LED Flash when set high
|
/// <summary>
|
||||||
/// </summary>
|
/// Enables the LED Flash when set high
|
||||||
public uint EnableLedFlash { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint EnableLedFlash { get; set; }
|
||||||
/// Disables the LED flash when set high
|
/// <summary>
|
||||||
/// </summary>
|
/// Disables the LED flash when set high
|
||||||
public uint DisableLedFlash { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint DisableLedFlash { get; set; }
|
||||||
/// Enables the Short Timeout
|
/// <summary>
|
||||||
/// </summary>
|
/// Enables the Short Timeout
|
||||||
public uint EnableShortTimeout { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint EnableShortTimeout { get; set; }
|
||||||
/// Disables the Short Timout
|
/// <summary>
|
||||||
/// </summary>
|
/// Disables the Short Timout
|
||||||
public uint DisableShortTimeout { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint DisableShortTimeout { get; set; }
|
||||||
/// Set high to enable one technology to trigger occupancy
|
/// <summary>
|
||||||
/// </summary>
|
/// Set high to enable one technology to trigger occupancy
|
||||||
public uint OrWhenVacated { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint OrWhenVacated { get; set; }
|
||||||
/// Set high to require both technologies to trigger occupancy
|
/// <summary>
|
||||||
/// </summary>
|
/// Set high to require both technologies to trigger occupancy
|
||||||
public uint AndWhenVacated { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint AndWhenVacated { get; set; }
|
||||||
/// Enables Ultrasonic Sensor A
|
/// <summary>
|
||||||
/// </summary>
|
/// Enables Ultrasonic Sensor A
|
||||||
public uint EnableUsA { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint EnableUsA { get; set; }
|
||||||
/// Disables Ultrasonic Sensor A
|
/// <summary>
|
||||||
/// </summary>
|
/// Disables Ultrasonic Sensor A
|
||||||
public uint DisableUsA { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint DisableUsA { get; set; }
|
||||||
/// Enables Ultrasonic Sensor B
|
/// <summary>
|
||||||
/// </summary>
|
/// Enables Ultrasonic Sensor B
|
||||||
public uint EnableUsB { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint EnableUsB { get; set; }
|
||||||
/// Disables Ultrasonic Sensor B
|
/// <summary>
|
||||||
/// </summary>
|
/// Disables Ultrasonic Sensor B
|
||||||
public uint DisableUsB { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint DisableUsB { get; set; }
|
||||||
/// Enables Pir
|
/// <summary>
|
||||||
/// </summary>
|
/// Enables Pir
|
||||||
public uint EnablePir { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint EnablePir { get; set; }
|
||||||
/// Disables Pir
|
/// <summary>
|
||||||
/// </summary>
|
/// Disables Pir
|
||||||
public uint DisablePir { get; set; }
|
/// </summary>
|
||||||
public uint IncrementUsInOccupiedState { get; set; }
|
public uint DisablePir { get; set; }
|
||||||
public uint DecrementUsInOccupiedState { get; set; }
|
public uint IncrementUsInOccupiedState { get; set; }
|
||||||
public uint IncrementUsInVacantState { get; set; }
|
public uint DecrementUsInOccupiedState { get; set; }
|
||||||
public uint DecrementUsInVacantState { get; set; }
|
public uint IncrementUsInVacantState { get; set; }
|
||||||
public uint IncrementPirInOccupiedState { get; set; }
|
public uint DecrementUsInVacantState { get; set; }
|
||||||
public uint DecrementPirInOccupiedState { get; set; }
|
public uint IncrementPirInOccupiedState { get; set; }
|
||||||
public uint IncrementPirInVacantState { get; set; }
|
public uint DecrementPirInOccupiedState { get; set; }
|
||||||
public uint DecrementPirInVacantState { get; set; }
|
public uint IncrementPirInVacantState { get; set; }
|
||||||
#endregion
|
public uint DecrementPirInVacantState { get; set; }
|
||||||
|
#endregion
|
||||||
#region Analogs
|
|
||||||
/// <summary>
|
#region Analogs
|
||||||
/// Sets adn reports the remote timeout value
|
/// <summary>
|
||||||
/// </summary>
|
/// Sets adn reports the remote timeout value
|
||||||
public uint Timeout { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint Timeout { get; set; }
|
||||||
/// Reports the local timeout value
|
/// <summary>
|
||||||
/// </summary>
|
/// Reports the local timeout value
|
||||||
public uint TimeoutLocalFeedback { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint TimeoutLocalFeedback { get; set; }
|
||||||
/// Sets the minimum internal photo sensor value and reports the current level
|
/// <summary>
|
||||||
/// </summary>
|
/// Sets the minimum internal photo sensor value and reports the current level
|
||||||
public uint InternalPhotoSensorValue { get; set; }
|
/// </summary>
|
||||||
/// <summary>
|
public uint InternalPhotoSensorValue { get; set; }
|
||||||
/// Sets the minimum external photo sensor value and reports the current level
|
/// <summary>
|
||||||
/// </summary>
|
/// Sets the minimum external photo sensor value and reports the current level
|
||||||
public uint ExternalPhotoSensorValue { get; set; }
|
/// </summary>
|
||||||
|
public uint ExternalPhotoSensorValue { get; set; }
|
||||||
public uint UsSensitivityInOccupiedState { get; set; }
|
|
||||||
|
public uint UsSensitivityInOccupiedState { get; set; }
|
||||||
public uint UsSensitivityInVacantState { get; set; }
|
|
||||||
|
public uint UsSensitivityInVacantState { get; set; }
|
||||||
public uint PirSensitivityInOccupiedState { get; set; }
|
|
||||||
|
public uint PirSensitivityInOccupiedState { get; set; }
|
||||||
public uint PirSensitivityInVacantState { get; set; }
|
|
||||||
#endregion
|
public uint PirSensitivityInVacantState { get; set; }
|
||||||
|
#endregion
|
||||||
public GlsOccupancySensorBaseJoinMap()
|
|
||||||
{
|
#region Serial
|
||||||
IsOnline = 1;
|
public uint Name { get; set; }
|
||||||
ForceOccupied = 2;
|
#endregion
|
||||||
ForceVacant = 3;
|
|
||||||
EnableRawStates = 4;
|
public GlsOccupancySensorBaseJoinMap()
|
||||||
RoomOccupiedFeedback = 2;
|
{
|
||||||
GraceOccupancyDetectedFeedback = 3;
|
IsOnline = 1;
|
||||||
RoomVacantFeedback = 4;
|
ForceOccupied = 2;
|
||||||
RawOccupancyFeedback = 5;
|
ForceVacant = 3;
|
||||||
RawOccupancyPirFeedback = 6;
|
EnableRawStates = 4;
|
||||||
RawOccupancyUsFeedback = 7;
|
RoomOccupiedFeedback = 2;
|
||||||
EnableLedFlash = 11;
|
GraceOccupancyDetectedFeedback = 3;
|
||||||
DisableLedFlash = 12;
|
RoomVacantFeedback = 4;
|
||||||
EnableShortTimeout = 13;
|
RawOccupancyFeedback = 5;
|
||||||
DisableShortTimeout = 14;
|
RawOccupancyPirFeedback = 6;
|
||||||
OrWhenVacated = 15;
|
RawOccupancyUsFeedback = 7;
|
||||||
AndWhenVacated = 16;
|
EnableLedFlash = 11;
|
||||||
EnableUsA = 17;
|
DisableLedFlash = 12;
|
||||||
DisableUsA = 18;
|
EnableShortTimeout = 13;
|
||||||
EnableUsB = 19;
|
DisableShortTimeout = 14;
|
||||||
DisableUsB = 20;
|
OrWhenVacated = 15;
|
||||||
EnablePir = 21;
|
AndWhenVacated = 16;
|
||||||
DisablePir = 22;
|
EnableUsA = 17;
|
||||||
IncrementUsInOccupiedState = 23;
|
DisableUsA = 18;
|
||||||
DecrementUsInOccupiedState = 24;
|
EnableUsB = 19;
|
||||||
IncrementUsInVacantState = 25;
|
DisableUsB = 20;
|
||||||
DecrementUsInVacantState = 26;
|
EnablePir = 21;
|
||||||
IncrementPirInOccupiedState = 27;
|
DisablePir = 22;
|
||||||
DecrementPirInOccupiedState = 28;
|
IncrementUsInOccupiedState = 23;
|
||||||
IncrementPirInVacantState = 29;
|
DecrementUsInOccupiedState = 24;
|
||||||
DecrementPirInVacantState = 30;
|
IncrementUsInVacantState = 25;
|
||||||
|
DecrementUsInVacantState = 26;
|
||||||
Timeout = 1;
|
IncrementPirInOccupiedState = 27;
|
||||||
TimeoutLocalFeedback = 2;
|
DecrementPirInOccupiedState = 28;
|
||||||
InternalPhotoSensorValue = 3;
|
IncrementPirInVacantState = 29;
|
||||||
ExternalPhotoSensorValue = 4;
|
DecrementPirInVacantState = 30;
|
||||||
UsSensitivityInOccupiedState = 5;
|
|
||||||
UsSensitivityInVacantState = 6;
|
Timeout = 1;
|
||||||
PirSensitivityInOccupiedState = 7;
|
TimeoutLocalFeedback = 2;
|
||||||
PirSensitivityInVacantState = 8;
|
InternalPhotoSensorValue = 3;
|
||||||
}
|
ExternalPhotoSensorValue = 4;
|
||||||
|
UsSensitivityInOccupiedState = 5;
|
||||||
public override void OffsetJoinNumbers(uint joinStart)
|
UsSensitivityInVacantState = 6;
|
||||||
{
|
PirSensitivityInOccupiedState = 7;
|
||||||
var joinOffset = joinStart - 1;
|
PirSensitivityInVacantState = 8;
|
||||||
|
|
||||||
IsOnline = IsOnline + joinOffset;
|
Name = 1;
|
||||||
ForceOccupied = ForceOccupied + joinOffset;
|
|
||||||
ForceVacant = ForceVacant + joinOffset;
|
}
|
||||||
EnableRawStates = EnableRawStates + joinOffset;
|
|
||||||
RoomOccupiedFeedback = RoomOccupiedFeedback + joinOffset;
|
public override void OffsetJoinNumbers(uint joinStart)
|
||||||
GraceOccupancyDetectedFeedback = GraceOccupancyDetectedFeedback + joinOffset;
|
{
|
||||||
RoomVacantFeedback = RoomVacantFeedback + joinOffset;
|
var joinOffset = joinStart - 1;
|
||||||
RawOccupancyFeedback = RawOccupancyFeedback + joinOffset;
|
|
||||||
RawOccupancyPirFeedback = RawOccupancyPirFeedback + joinOffset;
|
IsOnline = IsOnline + joinOffset;
|
||||||
RawOccupancyUsFeedback = RawOccupancyUsFeedback + joinOffset;
|
ForceOccupied = ForceOccupied + joinOffset;
|
||||||
EnableLedFlash = EnableLedFlash + joinOffset;
|
ForceVacant = ForceVacant + joinOffset;
|
||||||
DisableLedFlash = DisableLedFlash + joinOffset;
|
EnableRawStates = EnableRawStates + joinOffset;
|
||||||
EnableShortTimeout = EnableShortTimeout + joinOffset;
|
RoomOccupiedFeedback = RoomOccupiedFeedback + joinOffset;
|
||||||
DisableShortTimeout = DisableShortTimeout + joinOffset;
|
GraceOccupancyDetectedFeedback = GraceOccupancyDetectedFeedback + joinOffset;
|
||||||
OrWhenVacated = OrWhenVacated + joinOffset;
|
RoomVacantFeedback = RoomVacantFeedback + joinOffset;
|
||||||
AndWhenVacated = AndWhenVacated + joinOffset;
|
RawOccupancyFeedback = RawOccupancyFeedback + joinOffset;
|
||||||
EnableUsA = EnableUsA + joinOffset;
|
RawOccupancyPirFeedback = RawOccupancyPirFeedback + joinOffset;
|
||||||
DisableUsA = DisableUsA + joinOffset;
|
RawOccupancyUsFeedback = RawOccupancyUsFeedback + joinOffset;
|
||||||
EnableUsB = EnableUsB + joinOffset;
|
EnableLedFlash = EnableLedFlash + joinOffset;
|
||||||
DisableUsB = DisableUsB + joinOffset;
|
DisableLedFlash = DisableLedFlash + joinOffset;
|
||||||
EnablePir = EnablePir + joinOffset;
|
EnableShortTimeout = EnableShortTimeout + joinOffset;
|
||||||
DisablePir = DisablePir + joinOffset;
|
DisableShortTimeout = DisableShortTimeout + joinOffset;
|
||||||
DisablePir = DisablePir + joinOffset;
|
OrWhenVacated = OrWhenVacated + joinOffset;
|
||||||
IncrementUsInOccupiedState = IncrementUsInOccupiedState + joinOffset;
|
AndWhenVacated = AndWhenVacated + joinOffset;
|
||||||
DecrementUsInOccupiedState = DecrementUsInOccupiedState + joinOffset;
|
EnableUsA = EnableUsA + joinOffset;
|
||||||
IncrementUsInVacantState = IncrementUsInVacantState + joinOffset;
|
DisableUsA = DisableUsA + joinOffset;
|
||||||
DecrementUsInVacantState = DecrementUsInVacantState + joinOffset;
|
EnableUsB = EnableUsB + joinOffset;
|
||||||
IncrementPirInOccupiedState = IncrementPirInOccupiedState + joinOffset;
|
DisableUsB = DisableUsB + joinOffset;
|
||||||
DecrementPirInOccupiedState = DecrementPirInOccupiedState + joinOffset;
|
EnablePir = EnablePir + joinOffset;
|
||||||
IncrementPirInVacantState = IncrementPirInVacantState + joinOffset;
|
DisablePir = DisablePir + joinOffset;
|
||||||
DecrementPirInVacantState = DecrementPirInVacantState + joinOffset;
|
IncrementUsInOccupiedState = IncrementUsInOccupiedState + joinOffset;
|
||||||
|
DecrementUsInOccupiedState = DecrementUsInOccupiedState + joinOffset;
|
||||||
Timeout = Timeout + joinOffset;
|
IncrementUsInVacantState = IncrementUsInVacantState + joinOffset;
|
||||||
TimeoutLocalFeedback = TimeoutLocalFeedback + joinOffset;
|
DecrementUsInVacantState = DecrementUsInVacantState + joinOffset;
|
||||||
InternalPhotoSensorValue = InternalPhotoSensorValue + joinOffset;
|
IncrementPirInOccupiedState = IncrementPirInOccupiedState + joinOffset;
|
||||||
ExternalPhotoSensorValue = ExternalPhotoSensorValue + joinOffset;
|
DecrementPirInOccupiedState = DecrementPirInOccupiedState + joinOffset;
|
||||||
UsSensitivityInOccupiedState = UsSensitivityInOccupiedState + joinOffset;
|
IncrementPirInVacantState = IncrementPirInVacantState + joinOffset;
|
||||||
UsSensitivityInVacantState = UsSensitivityInVacantState + joinOffset;
|
DecrementPirInVacantState = DecrementPirInVacantState + joinOffset;
|
||||||
PirSensitivityInOccupiedState = PirSensitivityInOccupiedState + joinOffset;
|
|
||||||
PirSensitivityInVacantState = PirSensitivityInVacantState + joinOffset;
|
Timeout = Timeout + joinOffset;
|
||||||
}
|
TimeoutLocalFeedback = TimeoutLocalFeedback + joinOffset;
|
||||||
}
|
InternalPhotoSensorValue = InternalPhotoSensorValue + joinOffset;
|
||||||
|
ExternalPhotoSensorValue = ExternalPhotoSensorValue + joinOffset;
|
||||||
}
|
UsSensitivityInOccupiedState = UsSensitivityInOccupiedState + joinOffset;
|
||||||
|
UsSensitivityInVacantState = UsSensitivityInVacantState + joinOffset;
|
||||||
|
PirSensitivityInOccupiedState = PirSensitivityInOccupiedState + joinOffset;
|
||||||
|
PirSensitivityInVacantState = PirSensitivityInVacantState + joinOffset;
|
||||||
|
|
||||||
|
Name = Name + joinOffset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ using PepperDash.Essentials.Core;
|
|||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Bridges
|
||||||
{
|
{
|
||||||
|
[Obsolete("Please use version PepperDash.Essentials.Core.Bridges")]
|
||||||
public class HdMdxxxCEControllerJoinMap : JoinMapBase
|
public class HdMdxxxCEControllerJoinMap : JoinMapBase
|
||||||
{
|
{
|
||||||
#region Digitals
|
#region Digitals
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ using PepperDash.Essentials.Core;
|
|||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Bridges
|
||||||
{
|
{
|
||||||
|
[Obsolete("Please use version PepperDash.Essentials.Core.Bridges")]
|
||||||
public class IBasicCommunicationJoinMap : JoinMapBase
|
public class IBasicCommunicationJoinMap : JoinMapBase
|
||||||
{
|
{
|
||||||
#region Digitals
|
#region Digitals
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ using PepperDash.Essentials.Core;
|
|||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Bridges
|
||||||
{
|
{
|
||||||
|
[Obsolete("Please use version PepperDash.Essentials.Core.Bridges")]
|
||||||
public class IDigitalInputJoinMap : JoinMapBase
|
public class IDigitalInputJoinMap : JoinMapBase
|
||||||
{
|
{
|
||||||
#region Digitals
|
#region Digitals
|
||||||
|
|||||||
@@ -0,0 +1,213 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using Crestron.SimplSharp;
|
||||||
|
using PepperDash.Essentials.Core;
|
||||||
|
using Crestron.SimplSharp.Reflection;
|
||||||
|
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Bridges
|
||||||
|
{
|
||||||
|
[Obsolete("Please use version PepperDash.Essentials.Core.Bridges")]
|
||||||
|
public class SetTopBoxControllerJoinMap : JoinMapBase
|
||||||
|
{
|
||||||
|
#region Digitals
|
||||||
|
public uint DvrList { get; set; } //
|
||||||
|
public uint Replay { get; set; }
|
||||||
|
public uint Up { get; set; } //
|
||||||
|
public uint Down { get; set; } //
|
||||||
|
public uint Left { get; set; } //
|
||||||
|
public uint Right { get; set; } //
|
||||||
|
public uint Select { get; set; } //
|
||||||
|
public uint Menu { get; set; } //
|
||||||
|
public uint Exit { get; set; } //
|
||||||
|
public uint Digit0 { get; set; } //
|
||||||
|
public uint Digit1 { get; set; } //
|
||||||
|
public uint Digit2 { get; set; } //
|
||||||
|
public uint Digit3 { get; set; } //
|
||||||
|
public uint Digit4 { get; set; } //
|
||||||
|
public uint Digit5 { get; set; } //
|
||||||
|
public uint Digit6 { get; set; } //
|
||||||
|
public uint Digit7 { get; set; } //
|
||||||
|
public uint Digit8 { get; set; } //
|
||||||
|
public uint Digit9 { get; set; } //
|
||||||
|
public uint Dash { get; set; } //
|
||||||
|
public uint KeypadEnter { get; set; } //
|
||||||
|
public uint ChannelUp { get; set; } //
|
||||||
|
public uint ChannelDown { get; set; } //
|
||||||
|
public uint LastChannel { get; set; } //
|
||||||
|
public uint Guide { get; set; } //
|
||||||
|
public uint Info { get; set; } //
|
||||||
|
public uint Red { get; set; } //
|
||||||
|
public uint Green { get; set; } //
|
||||||
|
public uint Yellow { get; set; } //
|
||||||
|
public uint Blue { get; set; } //
|
||||||
|
public uint ChapMinus { get; set; }
|
||||||
|
public uint ChapPlus { get; set; }
|
||||||
|
public uint FFwd { get; set; } //
|
||||||
|
public uint Pause { get; set; } //
|
||||||
|
public uint Play { get; set; } //
|
||||||
|
public uint Record { get; set; }
|
||||||
|
public uint Rewind { get; set; } //
|
||||||
|
public uint Stop { get; set; } //
|
||||||
|
|
||||||
|
public uint PowerOn { get; set; } //
|
||||||
|
public uint PowerOff { get; set; } //
|
||||||
|
public uint PowerToggle { get; set; } //
|
||||||
|
|
||||||
|
public uint HasKeypadAccessoryButton1 { get; set; }
|
||||||
|
public uint HasKeypadAccessoryButton2 { get; set; }
|
||||||
|
|
||||||
|
public uint KeypadAccessoryButton1Press { get; set; }
|
||||||
|
public uint KeypadAccessoryButton2Press { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
public uint HasDvr { get; set; }
|
||||||
|
public uint HasPresets { get; set; }
|
||||||
|
public uint HasNumeric { get; set; }
|
||||||
|
public uint HasDpad { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Analogs
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Strings
|
||||||
|
public uint Name { get; set; }
|
||||||
|
public uint LoadPresets { get; set; }
|
||||||
|
public uint KeypadAccessoryButton1Label { get; set; }
|
||||||
|
public uint KeypadAccessoryButton2Label { get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
public SetTopBoxControllerJoinMap()
|
||||||
|
{
|
||||||
|
PowerOn = 1;
|
||||||
|
PowerOff = 2;
|
||||||
|
PowerToggle = 3;
|
||||||
|
|
||||||
|
HasDpad = 4;
|
||||||
|
Up = 4;
|
||||||
|
Down = 5;
|
||||||
|
Left = 6;
|
||||||
|
Right = 7;
|
||||||
|
Select = 8;
|
||||||
|
Menu = 9;
|
||||||
|
Exit = 10;
|
||||||
|
|
||||||
|
HasNumeric = 11;
|
||||||
|
Digit0 = 11;
|
||||||
|
Digit1 = 12;
|
||||||
|
Digit2 = 13;
|
||||||
|
Digit3 = 14;
|
||||||
|
Digit4 = 15;
|
||||||
|
Digit5 = 16;
|
||||||
|
Digit6 = 17;
|
||||||
|
Digit7 = 18;
|
||||||
|
Digit8 = 19;
|
||||||
|
Digit9 = 20;
|
||||||
|
Dash = 21;
|
||||||
|
KeypadEnter = 22;
|
||||||
|
ChannelUp = 23;
|
||||||
|
ChannelDown = 24;
|
||||||
|
LastChannel = 25;
|
||||||
|
|
||||||
|
Guide = 26;
|
||||||
|
Info = 27;
|
||||||
|
Red = 28;
|
||||||
|
Green = 29;
|
||||||
|
Yellow = 30;
|
||||||
|
Blue = 31;
|
||||||
|
|
||||||
|
HasDvr = 32;
|
||||||
|
DvrList = 32;
|
||||||
|
Play = 33;
|
||||||
|
Pause = 34;
|
||||||
|
Stop = 35;
|
||||||
|
FFwd = 36;
|
||||||
|
Rewind = 37;
|
||||||
|
ChapPlus = 38;
|
||||||
|
ChapMinus = 39;
|
||||||
|
Replay = 40;
|
||||||
|
Record = 41;
|
||||||
|
HasKeypadAccessoryButton1 = 42;
|
||||||
|
KeypadAccessoryButton1Press = 42;
|
||||||
|
HasKeypadAccessoryButton2 = 43;
|
||||||
|
KeypadAccessoryButton2Press = 43;
|
||||||
|
|
||||||
|
Name = 1;
|
||||||
|
KeypadAccessoryButton1Label = 42;
|
||||||
|
KeypadAccessoryButton2Label = 43;
|
||||||
|
|
||||||
|
LoadPresets = 50;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void OffsetJoinNumbers(uint joinStart)
|
||||||
|
{
|
||||||
|
var joinOffset = joinStart - 1;
|
||||||
|
|
||||||
|
PowerOn += joinOffset;
|
||||||
|
PowerOff += joinOffset;
|
||||||
|
PowerToggle += joinOffset;
|
||||||
|
|
||||||
|
HasDpad += joinOffset;
|
||||||
|
Up += joinOffset;
|
||||||
|
Down += joinOffset;
|
||||||
|
Left += joinOffset;
|
||||||
|
Right += joinOffset;
|
||||||
|
Select += joinOffset;
|
||||||
|
Menu += joinOffset;
|
||||||
|
Exit += joinOffset;
|
||||||
|
|
||||||
|
HasNumeric += joinOffset;
|
||||||
|
Digit0 += joinOffset;
|
||||||
|
Digit1 += joinOffset;
|
||||||
|
Digit2 += joinOffset;
|
||||||
|
Digit3 += joinOffset;
|
||||||
|
Digit4 += joinOffset;
|
||||||
|
Digit5 += joinOffset;
|
||||||
|
Digit6 += joinOffset;
|
||||||
|
Digit7 += joinOffset;
|
||||||
|
Digit8 += joinOffset;
|
||||||
|
Digit9 += joinOffset;
|
||||||
|
Dash += joinOffset;
|
||||||
|
KeypadEnter += joinOffset;
|
||||||
|
ChannelUp += joinOffset;
|
||||||
|
ChannelDown += joinOffset;
|
||||||
|
LastChannel += joinOffset;
|
||||||
|
|
||||||
|
Guide += joinOffset;
|
||||||
|
Info += joinOffset;
|
||||||
|
Red += joinOffset;
|
||||||
|
Green += joinOffset;
|
||||||
|
Yellow += joinOffset;
|
||||||
|
Blue += joinOffset;
|
||||||
|
|
||||||
|
HasDvr += joinOffset;
|
||||||
|
DvrList += joinOffset;
|
||||||
|
Play += joinOffset;
|
||||||
|
Pause += joinOffset;
|
||||||
|
Stop += joinOffset;
|
||||||
|
FFwd += joinOffset;
|
||||||
|
Rewind += joinOffset;
|
||||||
|
ChapPlus += joinOffset;
|
||||||
|
ChapMinus += joinOffset;
|
||||||
|
Replay += joinOffset;
|
||||||
|
Record += joinOffset;
|
||||||
|
HasKeypadAccessoryButton1 += joinOffset;
|
||||||
|
KeypadAccessoryButton1Press += joinOffset;
|
||||||
|
HasKeypadAccessoryButton2 += joinOffset;
|
||||||
|
KeypadAccessoryButton2Press += joinOffset;
|
||||||
|
|
||||||
|
Name += joinOffset;
|
||||||
|
KeypadAccessoryButton1Label += joinOffset;
|
||||||
|
KeypadAccessoryButton2Label += joinOffset;
|
||||||
|
|
||||||
|
LoadPresets += joinOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,49 +1,51 @@
|
|||||||
using System.Linq;
|
using System;
|
||||||
using Crestron.SimplSharp.Reflection;
|
using System.Linq;
|
||||||
using PepperDash.Essentials.Core;
|
using Crestron.SimplSharp.Reflection;
|
||||||
|
using PepperDash.Essentials.Core;
|
||||||
namespace PepperDash.Essentials.Bridges
|
|
||||||
{
|
namespace PepperDash.Essentials.Bridges
|
||||||
public class StatusSignControllerJoinMap:JoinMapBase
|
{
|
||||||
{
|
[Obsolete("Please use version PepperDash.Essentials.Core.Bridges")]
|
||||||
public uint IsOnline { get; set; }
|
public class StatusSignControllerJoinMap:JoinMapBase
|
||||||
public uint Name { get; set; }
|
{
|
||||||
public uint RedLed { get; set; }
|
public uint IsOnline { get; set; }
|
||||||
public uint GreenLed { get; set; }
|
public uint Name { get; set; }
|
||||||
public uint BlueLed { get; set; }
|
public uint RedLed { get; set; }
|
||||||
public uint RedControl { get; set; }
|
public uint GreenLed { get; set; }
|
||||||
public uint GreenControl { get; set; }
|
public uint BlueLed { get; set; }
|
||||||
public uint BlueControl { get; set; }
|
public uint RedControl { get; set; }
|
||||||
|
public uint GreenControl { get; set; }
|
||||||
public StatusSignControllerJoinMap()
|
public uint BlueControl { get; set; }
|
||||||
{
|
|
||||||
//digital
|
public StatusSignControllerJoinMap()
|
||||||
IsOnline = 1;
|
{
|
||||||
RedControl = 2;
|
//digital
|
||||||
GreenControl = 3;
|
IsOnline = 1;
|
||||||
BlueControl = 4;
|
RedControl = 2;
|
||||||
|
GreenControl = 3;
|
||||||
//Analog
|
BlueControl = 4;
|
||||||
RedLed = 2;
|
|
||||||
GreenLed = 3;
|
//Analog
|
||||||
BlueLed = 4;
|
RedLed = 2;
|
||||||
|
GreenLed = 3;
|
||||||
//string
|
BlueLed = 4;
|
||||||
Name = 1;
|
|
||||||
|
//string
|
||||||
|
Name = 1;
|
||||||
}
|
|
||||||
|
|
||||||
public override void OffsetJoinNumbers(uint joinStart)
|
}
|
||||||
{
|
|
||||||
var joinOffset = joinStart - 1;
|
public override void OffsetJoinNumbers(uint joinStart)
|
||||||
var properties =
|
{
|
||||||
GetType().GetCType().GetProperties().Where(p => p.PropertyType == typeof (uint)).ToList();
|
var joinOffset = joinStart - 1;
|
||||||
|
var properties =
|
||||||
foreach (var propertyInfo in properties)
|
GetType().GetCType().GetProperties().Where(p => p.PropertyType == typeof (uint)).ToList();
|
||||||
{
|
|
||||||
propertyInfo.SetValue(this, (uint) propertyInfo.GetValue(this, null) + joinOffset, null);
|
foreach (var propertyInfo in properties)
|
||||||
}
|
{
|
||||||
}
|
propertyInfo.SetValue(this, (uint) propertyInfo.GetValue(this, null) + joinOffset, null);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,12 +1,9 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Bridges
|
||||||
{
|
{
|
||||||
|
[Obsolete("Please use version PepperDash.Essentials.Core.Bridges")]
|
||||||
public class SystemMonitorJoinMap : JoinMapBase
|
public class SystemMonitorJoinMap : JoinMapBase
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -14,11 +11,21 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public uint ProgramStartJoin { get; set; }
|
public uint ProgramStartJoin { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Offset to indicate where the range of iterated Ethernet joins will start
|
||||||
|
/// </summary>
|
||||||
|
public uint EthernetStartJoin { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Offset between each program join set
|
/// Offset between each program join set
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public uint ProgramOffsetJoin { get; set; }
|
public uint ProgramOffsetJoin { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Offset between each Ethernet Interface join set
|
||||||
|
/// </summary>
|
||||||
|
public uint EthernetOffsetJoin { get; set; }
|
||||||
|
|
||||||
#region Digitals
|
#region Digitals
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Range Sets and reports whether the corresponding program slot is started
|
/// Range Sets and reports whether the corresponding program slot is started
|
||||||
@@ -87,6 +94,68 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
/// Serialized JSON output that aggregates the program info of the corresponding program
|
/// Serialized JSON output that aggregates the program info of the corresponding program
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public uint AggregatedProgramInfo { get; set; }
|
public uint AggregatedProgramInfo { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Reports the controller serial number
|
||||||
|
/// </summary>
|
||||||
|
public uint SerialNumber { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Reports the controller model
|
||||||
|
/// </summary>
|
||||||
|
public uint Model { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Reports the Host name set on the corresponding interface
|
||||||
|
/// </summary>
|
||||||
|
public uint HostName { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Reports the Current IP address set on the corresponding interface. If DHCP is enabled, this will be the DHCP assigned address.
|
||||||
|
/// </summary>
|
||||||
|
public uint CurrentIpAddress { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Reporst the Current Default Gateway set on the corresponding interface. If DHCP is enabled, this will be the DHCP assigned gateway
|
||||||
|
/// </summary>
|
||||||
|
public uint CurrentDefaultGateway { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Reports the Current Subnet Mask set on the corresponding interface. If DHCP is enabled, this will be the DHCP assigned subnet mask
|
||||||
|
/// </summary>
|
||||||
|
public uint CurrentSubnetMask { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Reports the Static IP address set on the corresponding interface. If DHCP is disabled, this will match the Current IP address
|
||||||
|
/// </summary>
|
||||||
|
public uint StaticIpAddress { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Reporst the Static Default Gateway set on the corresponding interface. If DHCP is disabled, this will match the Current gateway
|
||||||
|
/// </summary>
|
||||||
|
public uint StaticDefaultGateway { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Reports the Current Subnet Mask set on the corresponding interface. If DHCP is enabled, this will be the DHCP assigned subnet mask
|
||||||
|
/// </summary>
|
||||||
|
public uint StaticSubnetMask { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Reports the current DomainFeedback on the corresponding interface
|
||||||
|
/// </summary>
|
||||||
|
public uint Domain { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Reports the current DNS Servers on the corresponding interface
|
||||||
|
/// </summary>
|
||||||
|
public uint DnsServer { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Reports the MAC Address of the corresponding interface
|
||||||
|
/// </summary>
|
||||||
|
public uint MacAddress { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Reports the DHCP Status of the corresponding interface
|
||||||
|
/// </summary>
|
||||||
|
public uint DhcpStatus { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Reports the current uptime. Updated in 5 minute intervals.
|
||||||
|
/// </summary>
|
||||||
|
public uint Uptime { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Reports the date of the last boot
|
||||||
|
/// </summary>
|
||||||
|
public uint LastBoot { get; set; }
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public SystemMonitorJoinMap()
|
public SystemMonitorJoinMap()
|
||||||
@@ -98,6 +167,10 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
SnmpAppVersion = 3;
|
SnmpAppVersion = 3;
|
||||||
BACnetAppVersion = 4;
|
BACnetAppVersion = 4;
|
||||||
ControllerVersion = 5;
|
ControllerVersion = 5;
|
||||||
|
SerialNumber = 6;
|
||||||
|
Model = 7;
|
||||||
|
Uptime = 8;
|
||||||
|
LastBoot = 9;
|
||||||
|
|
||||||
|
|
||||||
ProgramStartJoin = 10;
|
ProgramStartJoin = 10;
|
||||||
@@ -115,6 +188,23 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
ProgramCrestronDatabaseVersion = 3;
|
ProgramCrestronDatabaseVersion = 3;
|
||||||
ProgramEnvironmentVersion = 4;
|
ProgramEnvironmentVersion = 4;
|
||||||
AggregatedProgramInfo = 5;
|
AggregatedProgramInfo = 5;
|
||||||
|
|
||||||
|
EthernetStartJoin = 75;
|
||||||
|
|
||||||
|
EthernetOffsetJoin = 15;
|
||||||
|
|
||||||
|
// Offset in groups of 15
|
||||||
|
HostName = 1;
|
||||||
|
CurrentIpAddress = 2;
|
||||||
|
CurrentSubnetMask = 3;
|
||||||
|
CurrentDefaultGateway = 4;
|
||||||
|
StaticIpAddress = 5;
|
||||||
|
StaticSubnetMask = 6;
|
||||||
|
StaticDefaultGateway = 7;
|
||||||
|
Domain = 8;
|
||||||
|
DnsServer = 9;
|
||||||
|
MacAddress = 10;
|
||||||
|
DhcpStatus = 11;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OffsetJoinNumbers(uint joinStart)
|
public override void OffsetJoinNumbers(uint joinStart)
|
||||||
@@ -131,6 +221,7 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
|
|
||||||
// Sets the initial join value where the iterated program joins will begin
|
// Sets the initial join value where the iterated program joins will begin
|
||||||
ProgramStartJoin = ProgramStartJoin + joinOffset;
|
ProgramStartJoin = ProgramStartJoin + joinOffset;
|
||||||
|
EthernetStartJoin = EthernetStartJoin + joinOffset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4,7 +4,7 @@ using PepperDash.Core;
|
|||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using PepperDash.Essentials.Core.CrestronIO;
|
using PepperDash.Essentials.Core.CrestronIO;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Core.Bridges
|
||||||
{
|
{
|
||||||
public static class StatusSignDeviceApiExtensions
|
public static class StatusSignDeviceApiExtensions
|
||||||
{
|
{
|
||||||
@@ -13,7 +13,7 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
{
|
{
|
||||||
var joinMap = new StatusSignControllerJoinMap();
|
var joinMap = new StatusSignControllerJoinMap();
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetJoinMapForDevice(joinMapKey);
|
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(joinMapSerialized))
|
if (!string.IsNullOrEmpty(joinMapSerialized))
|
||||||
joinMap = JsonConvert.DeserializeObject<StatusSignControllerJoinMap>(joinMapSerialized);
|
joinMap = JsonConvert.DeserializeObject<StatusSignControllerJoinMap>(joinMapSerialized);
|
||||||
|
|||||||
@@ -1,9 +1,4 @@
|
|||||||
using System;
|
using Crestron.SimplSharpPro.DeviceSupport;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using Crestron.SimplSharpPro.Diagnostics;
|
using Crestron.SimplSharpPro.Diagnostics;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
@@ -11,15 +6,15 @@ using PepperDash.Essentials.Core.Monitoring;
|
|||||||
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Bridges
|
namespace PepperDash.Essentials.Core.Bridges
|
||||||
{
|
{
|
||||||
public static class SystemMonitorBridge
|
public static class SystemMonitorBridge
|
||||||
{
|
{
|
||||||
public static void LinkToApi(this SystemMonitorController systemMonitorController, BasicTriList trilist, uint joinStart, string joinMapKey)
|
public static void LinkToApi(this SystemMonitorController systemMonitorController, BasicTriList trilist, uint joinStart, string joinMapKey)
|
||||||
{
|
{
|
||||||
SystemMonitorJoinMap joinMap = new SystemMonitorJoinMap();
|
var joinMap = new SystemMonitorJoinMap();
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetJoinMapForDevice(joinMapKey);
|
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
||||||
|
|
||||||
if(!string.IsNullOrEmpty(joinMapSerialized))
|
if(!string.IsNullOrEmpty(joinMapSerialized))
|
||||||
joinMap = JsonConvert.DeserializeObject<SystemMonitorJoinMap>(joinMapSerialized);
|
joinMap = JsonConvert.DeserializeObject<SystemMonitorJoinMap>(joinMapSerialized);
|
||||||
@@ -30,36 +25,81 @@ namespace PepperDash.Essentials.Bridges
|
|||||||
Debug.Console(2, systemMonitorController, "Linking API starting at join: {0}", joinStart);
|
Debug.Console(2, systemMonitorController, "Linking API starting at join: {0}", joinStart);
|
||||||
|
|
||||||
systemMonitorController.TimeZoneFeedback.LinkInputSig(trilist.UShortInput[joinMap.TimeZone]);
|
systemMonitorController.TimeZoneFeedback.LinkInputSig(trilist.UShortInput[joinMap.TimeZone]);
|
||||||
//trilist.SetUShortSigAction(joinMap.TimeZone, new Action<ushort>(u => systemMonitorController.SetTimeZone(u)));
|
|
||||||
systemMonitorController.TimeZoneTextFeedback.LinkInputSig(trilist.StringInput[joinMap.TimeZoneName]);
|
systemMonitorController.TimeZoneTextFeedback.LinkInputSig(trilist.StringInput[joinMap.TimeZoneName]);
|
||||||
|
|
||||||
systemMonitorController.IOControllerVersionFeedback.LinkInputSig(trilist.StringInput[joinMap.IOControllerVersion]);
|
systemMonitorController.IoControllerVersionFeedback.LinkInputSig(trilist.StringInput[joinMap.IOControllerVersion]);
|
||||||
systemMonitorController.SnmpVersionFeedback.LinkInputSig(trilist.StringInput[joinMap.SnmpAppVersion]);
|
systemMonitorController.SnmpVersionFeedback.LinkInputSig(trilist.StringInput[joinMap.SnmpAppVersion]);
|
||||||
systemMonitorController.BACnetAppVersionFeedback.LinkInputSig(trilist.StringInput[joinMap.BACnetAppVersion]);
|
systemMonitorController.BaCnetAppVersionFeedback.LinkInputSig(trilist.StringInput[joinMap.BACnetAppVersion]);
|
||||||
systemMonitorController.ControllerVersionFeedback.LinkInputSig(trilist.StringInput[joinMap.ControllerVersion]);
|
systemMonitorController.ControllerVersionFeedback.LinkInputSig(trilist.StringInput[joinMap.ControllerVersion]);
|
||||||
|
systemMonitorController.SerialNumberFeedback.LinkInputSig(trilist.StringInput[joinMap.SerialNumber]);
|
||||||
|
systemMonitorController.ModelFeedback.LinkInputSig(trilist.StringInput[joinMap.Model]);
|
||||||
|
systemMonitorController.UptimeFeedback.LinkInputSig(trilist.StringInput[joinMap.Uptime]);
|
||||||
|
systemMonitorController.LastStartFeedback.LinkInputSig(trilist.StringInput[joinMap.LastBoot]);
|
||||||
|
|
||||||
// iterate the program status feedback collection and map all the joins
|
// iterate the program status feedback collection and map all the joins
|
||||||
|
LinkProgramInfoJoins(systemMonitorController, trilist, joinMap);
|
||||||
|
|
||||||
|
LinkEthernetInfoJoins(systemMonitorController, trilist, joinMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void LinkEthernetInfoJoins(SystemMonitorController systemMonitorController, BasicTriList trilist, SystemMonitorJoinMap joinMap)
|
||||||
|
{
|
||||||
|
var ethernetSlotJoinStart = joinMap.EthernetStartJoin;
|
||||||
|
|
||||||
|
foreach (var fb in systemMonitorController.EthernetStatusFeedbackCollection)
|
||||||
|
{
|
||||||
|
fb.Value.CurrentIpAddressFeedback.LinkInputSig(trilist.StringInput[ethernetSlotJoinStart + joinMap.CurrentIpAddress]);
|
||||||
|
fb.Value.CurrentSubnetMaskFeedback.LinkInputSig(trilist.StringInput[ethernetSlotJoinStart + joinMap.CurrentSubnetMask]);
|
||||||
|
fb.Value.CurrentDefaultGatewayFeedback.LinkInputSig(trilist.StringInput[ethernetSlotJoinStart + joinMap.CurrentDefaultGateway]);
|
||||||
|
fb.Value.StaticIpAddressFeedback.LinkInputSig(trilist.StringInput[ethernetSlotJoinStart + joinMap.StaticIpAddress]);
|
||||||
|
fb.Value.StaticSubnetMaskFeedback.LinkInputSig(trilist.StringInput[ethernetSlotJoinStart + joinMap.StaticSubnetMask]);
|
||||||
|
fb.Value.StaticDefaultGatewayFeedback.LinkInputSig(trilist.StringInput[ethernetSlotJoinStart + joinMap.StaticDefaultGateway]);
|
||||||
|
fb.Value.HostNameFeedback.LinkInputSig(trilist.StringInput[ethernetSlotJoinStart + joinMap.HostName]);
|
||||||
|
fb.Value.MacAddressFeedback.LinkInputSig(trilist.StringInput[ethernetSlotJoinStart + joinMap.MacAddress]);
|
||||||
|
fb.Value.DomainFeedback.LinkInputSig(trilist.StringInput[ethernetSlotJoinStart + joinMap.Domain]);
|
||||||
|
fb.Value.DnsServerFeedback.LinkInputSig(trilist.StringInput[ethernetSlotJoinStart + joinMap.DnsServer]);
|
||||||
|
fb.Value.DhcpStatusFeedback.LinkInputSig(trilist.StringInput[ethernetSlotJoinStart + joinMap.DhcpStatus]);
|
||||||
|
|
||||||
|
ethernetSlotJoinStart += joinMap.EthernetOffsetJoin;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void LinkProgramInfoJoins(SystemMonitorController systemMonitorController, BasicTriList trilist,
|
||||||
|
SystemMonitorJoinMap joinMap)
|
||||||
|
{
|
||||||
var programSlotJoinStart = joinMap.ProgramStartJoin;
|
var programSlotJoinStart = joinMap.ProgramStartJoin;
|
||||||
|
|
||||||
foreach (var p in systemMonitorController.ProgramStatusFeedbackCollection)
|
foreach (var p in systemMonitorController.ProgramStatusFeedbackCollection)
|
||||||
{
|
{
|
||||||
var programNumber = p.Value.Program.Number;
|
var programNumber = p.Value.Program.Number;
|
||||||
|
|
||||||
trilist.SetBoolSigAction(programSlotJoinStart + joinMap.ProgramStart, new Action<bool>
|
trilist.SetBoolSigAction(programSlotJoinStart + joinMap.ProgramStart,
|
||||||
(b => SystemMonitor.ProgramCollection[programNumber].OperatingState = eProgramOperatingState.Start));
|
b => SystemMonitor.ProgramCollection[programNumber].OperatingState = eProgramOperatingState.Start);
|
||||||
p.Value.ProgramStartedFeedback.LinkInputSig(trilist.BooleanInput[programSlotJoinStart + joinMap.ProgramStart]);
|
p.Value.ProgramStartedFeedback.LinkInputSig(trilist.BooleanInput[programSlotJoinStart + joinMap.ProgramStart]);
|
||||||
|
|
||||||
trilist.SetBoolSigAction(programSlotJoinStart + joinMap.ProgramStop, new Action<bool>
|
trilist.SetBoolSigAction(programSlotJoinStart + joinMap.ProgramStop,
|
||||||
(b => SystemMonitor.ProgramCollection[programNumber].OperatingState = eProgramOperatingState.Stop));
|
b => SystemMonitor.ProgramCollection[programNumber].OperatingState = eProgramOperatingState.Stop);
|
||||||
p.Value.ProgramStoppedFeedback.LinkInputSig(trilist.BooleanInput[programSlotJoinStart + joinMap.ProgramStop]);
|
p.Value.ProgramStoppedFeedback.LinkInputSig(trilist.BooleanInput[programSlotJoinStart + joinMap.ProgramStop]);
|
||||||
|
|
||||||
trilist.SetBoolSigAction(programSlotJoinStart + joinMap.ProgramRegister, new Action<bool>
|
trilist.SetBoolSigAction(programSlotJoinStart + joinMap.ProgramRegister,
|
||||||
(b => SystemMonitor.ProgramCollection[programNumber].RegistrationState = eProgramRegistrationState.Register));
|
b => SystemMonitor.ProgramCollection[programNumber].RegistrationState = eProgramRegistrationState.Register);
|
||||||
p.Value.ProgramRegisteredFeedback.LinkInputSig(trilist.BooleanInput[programSlotJoinStart + joinMap.ProgramRegister]);
|
p.Value.ProgramRegisteredFeedback.LinkInputSig(
|
||||||
|
trilist.BooleanInput[programSlotJoinStart + joinMap.ProgramRegister]);
|
||||||
|
|
||||||
trilist.SetBoolSigAction(programSlotJoinStart + joinMap.ProgramUnregister, new Action<bool>
|
trilist.SetBoolSigAction(programSlotJoinStart + joinMap.ProgramUnregister,
|
||||||
(b => SystemMonitor.ProgramCollection[programNumber].RegistrationState = eProgramRegistrationState.Unregister));
|
b => SystemMonitor.ProgramCollection[programNumber].RegistrationState = eProgramRegistrationState.Unregister);
|
||||||
p.Value.ProgramUnregisteredFeedback.LinkInputSig(trilist.BooleanInput[programSlotJoinStart + joinMap.ProgramUnregister]);
|
p.Value.ProgramUnregisteredFeedback.LinkInputSig(
|
||||||
|
trilist.BooleanInput[programSlotJoinStart + joinMap.ProgramUnregister]);
|
||||||
|
|
||||||
|
p.Value.ProgramNameFeedback.LinkInputSig(trilist.StringInput[programSlotJoinStart + joinMap.ProgramName]);
|
||||||
|
p.Value.ProgramCompileTimeFeedback.LinkInputSig(
|
||||||
|
trilist.StringInput[programSlotJoinStart + joinMap.ProgramCompiledTime]);
|
||||||
|
p.Value.CrestronDataBaseVersionFeedback.LinkInputSig(
|
||||||
|
trilist.StringInput[programSlotJoinStart + joinMap.ProgramCrestronDatabaseVersion]);
|
||||||
|
p.Value.EnvironmentVersionFeedback.LinkInputSig(
|
||||||
|
trilist.StringInput[programSlotJoinStart + joinMap.ProgramEnvironmentVersion]);
|
||||||
|
p.Value.AggregatedProgramInfoFeedback.LinkInputSig(
|
||||||
|
trilist.StringInput[programSlotJoinStart + joinMap.AggregatedProgramInfo]);
|
||||||
|
|
||||||
programSlotJoinStart = programSlotJoinStart + joinMap.ProgramOffsetJoin;
|
programSlotJoinStart = programSlotJoinStart + joinMap.ProgramOffsetJoin;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,14 +10,16 @@ using Crestron.SimplSharp.Reflection;
|
|||||||
|
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
|
using PepperDash.Essentials.Core.Bridges;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
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 PepperDash.Essentials.Room.MobileControl;
|
||||||
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
||||||
|
|
||||||
namespace PepperDash.Essentials
|
namespace PepperDash.Essentials
|
||||||
{
|
{
|
||||||
@@ -25,18 +27,27 @@ namespace PepperDash.Essentials
|
|||||||
{
|
{
|
||||||
HttpLogoServer LogoServer;
|
HttpLogoServer LogoServer;
|
||||||
|
|
||||||
|
private CTimer _startTimer;
|
||||||
|
private const long StartupTime = 500;
|
||||||
|
|
||||||
public ControlSystem()
|
public ControlSystem()
|
||||||
: base()
|
: base()
|
||||||
{
|
{
|
||||||
Thread.MaxNumberOfUserThreads = 400;
|
Thread.MaxNumberOfUserThreads = 400;
|
||||||
Global.ControlSystem = this;
|
Global.ControlSystem = this;
|
||||||
DeviceManager.Initialize(this);
|
DeviceManager.Initialize(this);
|
||||||
|
SystemMonitor.ProgramInitialization.ProgramInitializationUnderUserControl = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Entry point for the program
|
/// Entry point for the program
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public override void InitializeSystem()
|
public override void InitializeSystem()
|
||||||
|
{
|
||||||
|
_startTimer = new CTimer(StartSystem,StartupTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void StartSystem(object obj)
|
||||||
{
|
{
|
||||||
DeterminePlatform();
|
DeterminePlatform();
|
||||||
|
|
||||||
@@ -46,7 +57,12 @@ namespace PepperDash.Essentials
|
|||||||
ConsoleAccessLevelEnum.AccessOperator);
|
ConsoleAccessLevelEnum.AccessOperator);
|
||||||
}
|
}
|
||||||
|
|
||||||
// CrestronConsole.AddNewConsoleCommand(S => { ConfigWriter.WriteConfigFile(null); }, "writeconfig", "writes the current config to a file", ConsoleAccessLevelEnum.AccessOperator);
|
CrestronConsole.AddNewConsoleCommand(PluginLoader.ReportAssemblyVersions, "reportversions", "Reports the versions of the loaded assemblies", ConsoleAccessLevelEnum.AccessOperator);
|
||||||
|
|
||||||
|
CrestronConsole.AddNewConsoleCommand(PepperDash.Essentials.Core.DeviceFactory.GetDeviceFactoryTypes, "gettypes", "Gets the device types that can be built. Accepts a filter string.", ConsoleAccessLevelEnum.AccessOperator);
|
||||||
|
|
||||||
|
CrestronConsole.AddNewConsoleCommand(BridgeHelper.PrintJoinMap, "getjoinmap", "map(s) for bridge or device on bridge [brKey [devKey]]", ConsoleAccessLevelEnum.AccessOperator);
|
||||||
|
|
||||||
CrestronConsole.AddNewConsoleCommand(s =>
|
CrestronConsole.AddNewConsoleCommand(s =>
|
||||||
{
|
{
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "CONSOLE MESSAGE: {0}", s);
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "CONSOLE MESSAGE: {0}", s);
|
||||||
@@ -68,20 +84,26 @@ namespace PepperDash.Essentials
|
|||||||
}, "showconfig", "Shows the current running merged config", ConsoleAccessLevelEnum.AccessOperator);
|
}, "showconfig", "Shows the current running merged config", ConsoleAccessLevelEnum.AccessOperator);
|
||||||
|
|
||||||
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" +
|
||||||
"System URL: {0}\r" +
|
"System URL: {0}\r" +
|
||||||
"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);
|
||||||
|
|
||||||
|
|
||||||
if (!Debug.DoNotLoadOnNextBoot)
|
if (!Debug.DoNotLoadOnNextBoot)
|
||||||
|
{
|
||||||
GoWithLoad();
|
GoWithLoad();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SystemMonitor.ProgramInitialization.ProgramInitializationComplete = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Determines if the program is running on a processor (appliance) or server (VC-4).
|
/// Determines if the program is running on a processor (appliance) or server (VC-4).
|
||||||
///
|
///
|
||||||
/// Sets Global.FilePathPrefix based on platform
|
/// Sets Global.FilePathPrefix and Global.ApplicationDirectoryPathPrefix based on platform
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void DeterminePlatform()
|
public void DeterminePlatform()
|
||||||
{
|
{
|
||||||
@@ -96,17 +118,19 @@ namespace PepperDash.Essentials
|
|||||||
string directoryPrefix;
|
string directoryPrefix;
|
||||||
|
|
||||||
directoryPrefix = Crestron.SimplSharp.CrestronIO.Directory.GetApplicationRootDirectory();
|
directoryPrefix = Crestron.SimplSharp.CrestronIO.Directory.GetApplicationRootDirectory();
|
||||||
|
|
||||||
var version = Crestron.SimplSharp.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
|
|
||||||
|
|
||||||
Global.SetAssemblyVersion(string.Format("{0}.{1}.{2}", version.Major, version.Minor, version.Build));
|
var fullVersion = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false);
|
||||||
|
|
||||||
|
AssemblyInformationalVersionAttribute fullVersionAtt = fullVersion[0] as AssemblyInformationalVersionAttribute;
|
||||||
|
|
||||||
|
Global.SetAssemblyVersion(fullVersionAtt.InformationalVersion);
|
||||||
|
|
||||||
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);
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Starting Essentials v{0} on 3-series Appliance", Global.AssemblyVersion);
|
||||||
|
|
||||||
// Check if User/ProgramX exists
|
// Check if User/ProgramX exists
|
||||||
if (Directory.Exists(directoryPrefix + dirSeparator + "User"
|
if (Directory.Exists(Global.ApplicationDirectoryPathPrefix + dirSeparator + "User"
|
||||||
+ 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, @"User/program{0} directory found", InitialParametersClass.ApplicationNumber);
|
||||||
@@ -154,21 +178,31 @@ namespace PepperDash.Essentials
|
|||||||
{
|
{
|
||||||
Debug.SetDoNotLoadOnNextBoot(false);
|
Debug.SetDoNotLoadOnNextBoot(false);
|
||||||
|
|
||||||
|
PluginLoader.AddProgramAssemblies();
|
||||||
|
|
||||||
|
new Core.DeviceFactory();
|
||||||
|
new Devices.Common.DeviceFactory();
|
||||||
|
new DM.DeviceFactory();
|
||||||
|
new DeviceFactory();
|
||||||
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Starting Essentials load from configuration");
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Starting Essentials load from configuration");
|
||||||
|
|
||||||
var filesReady = SetupFilesystem();
|
var filesReady = SetupFilesystem();
|
||||||
if (filesReady)
|
if (filesReady)
|
||||||
{
|
{
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Checking for plugins");
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Checking for plugins");
|
||||||
LoadPlugins();
|
PluginLoader.LoadPlugins();
|
||||||
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Folder structure verified. Loading config...");
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Folder structure verified. Loading config...");
|
||||||
if (!ConfigReader.LoadConfig2())
|
if (!ConfigReader.LoadConfig2())
|
||||||
|
{
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Error, "Essentials Load complete with errors");
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Load();
|
Load();
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Essentials load complete\r" +
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Essentials load complete\r\n" +
|
||||||
"-------------------------------------------------------------");
|
"-------------------------------------------------------------");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -187,127 +221,18 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
Debug.Console(0, "FATAL INITIALIZE ERROR. System is in an inconsistent state:\r{0}", e);
|
Debug.Console(0, "FATAL INITIALIZE ERROR. System is in an inconsistent state:\r\n{0}", e);
|
||||||
}
|
}
|
||||||
|
finally
|
||||||
// Notify the OS that the program intitialization has completed
|
|
||||||
SystemMonitor.ProgramInitialization.ProgramInitializationComplete = true;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initial simple implementation. Reads user/programXX/plugins folder and
|
|
||||||
/// use
|
|
||||||
/// </summary>
|
|
||||||
void LoadPlugins()
|
|
||||||
{
|
|
||||||
var dir = Global.FilePathPrefix + "plugins";
|
|
||||||
if (Directory.Exists(dir))
|
|
||||||
{
|
{
|
||||||
// TODO Clear out or create localPlugins folder (maybe in program slot folder)
|
// Notify the OS that the program intitialization has completed
|
||||||
|
SystemMonitor.ProgramInitialization.ProgramInitializationComplete = true;
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Plugins directory found, checking for factory plugins");
|
|
||||||
var di = new DirectoryInfo(dir);
|
|
||||||
var zFiles = di.GetFiles("*.cplz");
|
|
||||||
foreach (var fi in zFiles)
|
|
||||||
{
|
|
||||||
Debug.Console(0, "Found cplz: {0}. Unzipping into plugins directory", fi.Name);
|
|
||||||
var result = CrestronZIP.Unzip(fi.FullName, di.FullName);
|
|
||||||
Debug.Console(0, "UnZip Result: {0}", result.ToString());
|
|
||||||
fi.Delete();
|
|
||||||
}
|
|
||||||
var files = di.GetFiles("*.dll");
|
|
||||||
Dictionary<string, Assembly> assyList = new Dictionary<string, Assembly>();
|
|
||||||
foreach (FileInfo fi in files)
|
|
||||||
{
|
|
||||||
// TODO COPY plugin to loadedPlugins folder
|
|
||||||
// TODO LOAD that loadedPlugins dll file
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var assy = Assembly.LoadFrom(fi.FullName);
|
|
||||||
var ver = assy.GetName().Version;
|
|
||||||
var verStr = string.Format("{0}.{1}.{2}.{3}", ver.Major, ver.Minor, ver.Build, ver.Revision);
|
|
||||||
assyList.Add(fi.FullName, assy);
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Loaded plugin file '{0}', version {1}", fi.FullName, verStr);
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
Debug.Console(2, "Assembly {0} is not a custom assembly", fi.FullName);
|
|
||||||
continue; //catching any load issues and continuing. There will be exceptions loading Crestron .dlls from the cplz Probably should do something different here
|
|
||||||
}
|
|
||||||
}
|
|
||||||
foreach (var assy in assyList)
|
|
||||||
{
|
|
||||||
// iteratate this assembly's classes, looking for "LoadPlugin()" methods
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var types = assy.Value.GetTypes();
|
|
||||||
foreach (var type in types)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var methods = type.GetMethods(BindingFlags.Public | BindingFlags.Static);
|
|
||||||
var loadPlugin = methods.FirstOrDefault(m => m.Name.Equals("LoadPlugin"));
|
|
||||||
if (loadPlugin != null)
|
|
||||||
{
|
|
||||||
Debug.Console(2, "LoadPlugin method found in {0}", type.Name);
|
|
||||||
|
|
||||||
var fields = type.GetFields(BindingFlags.Public | BindingFlags.Static);
|
|
||||||
|
|
||||||
var minimumVersion = fields.FirstOrDefault(p => p.Name.Equals("MinimumEssentialsFrameworkVersion"));
|
|
||||||
if (minimumVersion != null)
|
|
||||||
{
|
|
||||||
Debug.Console(2, "MinimumEssentialsFrameworkVersion found");
|
|
||||||
|
|
||||||
var minimumVersionString = minimumVersion.GetValue(null) as string;
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(minimumVersionString))
|
|
||||||
{
|
|
||||||
var passed = Global.IsRunningMinimumVersionOrHigher(minimumVersionString);
|
|
||||||
|
|
||||||
if (!passed)
|
|
||||||
{
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Error, "Plugin indicates minimum Essentials version {0}. Dependency check failed. Skipping Plugin", minimumVersionString);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Passed plugin passed dependency check (required version {0})", minimumVersionString);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Warning, "MinimumEssentialsFrameworkVersion found but not set. Loading plugin, but your mileage may vary.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Warning, "MinimumEssentialsFrameworkVersion not found. Loading plugin, but your mileage may vary.");
|
|
||||||
}
|
|
||||||
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Adding plugin: {0}", assy.Key);
|
|
||||||
loadPlugin.Invoke(null, null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
Debug.Console(2, "Load Plugin not found. {0} is not a plugin assembly", assy.Value.FullName);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
Debug.Console(2, "Assembly {0} is not a custom assembly. Types cannot be loaded.", assy.Value.FullName);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// plugin dll will be loaded. Any classes in plugin should have a static constructor
|
|
||||||
// that registers that class with the Core.DeviceFactory
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Verifies filesystem is set up. IR, SGD, and programX folders
|
/// Verifies filesystem is set up. IR, SGD, and programX folders
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -362,39 +287,42 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
DeviceManager.ActivateAll();
|
DeviceManager.ActivateAll();
|
||||||
|
|
||||||
LinkSystemMonitorToAppServer();
|
var mobileControl = DeviceManager.GetDeviceForKey("appServer") as IMobileControl;
|
||||||
}
|
|
||||||
|
|
||||||
void LinkSystemMonitorToAppServer()
|
if (mobileControl == null) return;
|
||||||
{
|
|
||||||
var sysMon = DeviceManager.GetDeviceForKey("systemMonitor") as PepperDash.Essentials.Core.Monitoring.SystemMonitorController;
|
|
||||||
|
|
||||||
var appServer = DeviceManager.GetDeviceForKey("appServer") as MobileControlSystemController;
|
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)
|
// if (sysMon != null && appServer != null)
|
||||||
{
|
// {
|
||||||
var key = sysMon.Key + "-" + appServer.Key;
|
// var key = sysMon.Key + "-" + appServer.Key;
|
||||||
var messenger = new PepperDash.Essentials.AppServer.Messengers.SystemMonitorMessenger
|
// var messenger = new PepperDash.Essentials.AppServer.Messengers.SystemMonitorMessenger
|
||||||
(key, sysMon, "/device/systemMonitor");
|
// (key, sysMon, "/device/systemMonitor");
|
||||||
|
|
||||||
messenger.RegisterWithAppServer(appServer);
|
// messenger.RegisterWithAppServer(appServer);
|
||||||
|
|
||||||
DeviceManager.AddDevice(messenger);
|
// 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>
|
||||||
public void LoadDevices()
|
public void LoadDevices()
|
||||||
{
|
{
|
||||||
|
|
||||||
// Build the processor wrapper class
|
// Build the processor wrapper class
|
||||||
|
|
||||||
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"));
|
DeviceManager.AddDevice(new PepperDash.Essentials.Core.Monitoring.SystemMonitorController("systemMonitor"));
|
||||||
|
|
||||||
@@ -426,42 +354,43 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
DeviceManager.AddDevice(dmpsRoutingController);
|
DeviceManager.AddDevice(dmpsRoutingController);
|
||||||
}
|
}
|
||||||
|
else if (this.ControllerPrompt.IndexOf("mpc3", StringComparison.OrdinalIgnoreCase) > -1)
|
||||||
|
{
|
||||||
|
Debug.Console(2, "MPC3 processor type detected. Adding Mpc3TouchpanelController.");
|
||||||
|
|
||||||
|
var butToken = devConf.Properties["buttons"];
|
||||||
|
if (butToken != null)
|
||||||
|
{
|
||||||
|
var buttons = butToken.ToObject<Dictionary<string, Essentials.Core.Touchpanels.KeypadButton>>();
|
||||||
|
var tpController = new Essentials.Core.Touchpanels.Mpc3TouchpanelController(devConf.Key, devConf.Name, Global.ControlSystem, buttons);
|
||||||
|
DeviceManager.AddDevice(tpController);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: Unable to deserialize buttons collection for device: {0}", devConf.Key);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Debug.Console(2, "************Processor is not DMPS type***************");
|
Debug.Console(2, "************Processor is not DMPS type***************");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try local factories first
|
// Try local factories first
|
||||||
var newDev = DeviceFactory.GetDevice(devConf);
|
IKeyed newDev = null;
|
||||||
|
|
||||||
if (newDev == null)
|
|
||||||
newDev = BridgeFactory.GetDevice(devConf);
|
|
||||||
|
|
||||||
// Then associated library factories
|
|
||||||
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.Common.DeviceFactory.GetDevice(devConf);
|
|
||||||
if (newDev == null)
|
|
||||||
newDev = PepperDash.Essentials.DM.DeviceFactory.GetDevice(devConf);
|
|
||||||
if (newDev == null)
|
|
||||||
newDev = PepperDash.Essentials.Devices.Displays.DisplayDeviceFactory.GetDevice(devConf);
|
|
||||||
|
|
||||||
//if (newDev == null) // might want to consider the ability to override an essentials "type"
|
//
|
||||||
//{
|
//if (newDev == null)
|
||||||
// // iterate plugin factories
|
// newDev = PepperDash.Essentials.Devices.Displays.DisplayDeviceFactory.GetDevice(devConf);
|
||||||
// foreach (var f in FactoryObjects)
|
//
|
||||||
// {
|
|
||||||
// var cresFactory = f as IGetCrestronDevice;
|
|
||||||
// if (cresFactory != null)
|
|
||||||
// {
|
|
||||||
// newDev = cresFactory.GetDevice(devConf, this);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
if (newDev != null)
|
if (newDev != null)
|
||||||
DeviceManager.AddDevice(newDev);
|
DeviceManager.AddDevice(newDev);
|
||||||
@@ -530,11 +459,11 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
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
|
// Mobile Control bridge
|
||||||
var bridge = new MobileConrolEssentialsHuddleSpaceRoomBridge(room as EssentialsHuddleSpaceRoom);
|
//var bridge = new MobileConrolEssentialsHuddleSpaceRoomBridge(room as EssentialsHuddleSpaceRoom);
|
||||||
AddBridgePostActivationHelper(bridge); // Lets things happen later when all devices are present
|
//AddBridgePostActivationHelper(bridge); // Lets things happen later when all devices are present
|
||||||
DeviceManager.AddDevice(bridge);
|
//DeviceManager.AddDevice(bridge);
|
||||||
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Mobile Control Bridge Added...");
|
CreateMobileControlBridge(room);
|
||||||
}
|
}
|
||||||
else if (room is EssentialsHuddleVtc1Room)
|
else if (room is EssentialsHuddleVtc1Room)
|
||||||
{
|
{
|
||||||
@@ -545,9 +474,11 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
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
|
// Mobile Control bridge
|
||||||
var bridge = new MobileConrolEssentialsHuddleSpaceRoomBridge(room);
|
//var bridge = new MobileConrolEssentialsHuddleSpaceRoomBridge(room);
|
||||||
AddBridgePostActivationHelper(bridge); // Lets things happen later when all devices are present
|
//AddBridgePostActivationHelper(bridge); // Lets things happen later when all devices are present
|
||||||
DeviceManager.AddDevice(bridge);
|
//DeviceManager.AddDevice(bridge);
|
||||||
|
|
||||||
|
CreateMobileControlBridge(room);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -564,25 +495,36 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void CreateMobileControlBridge(EssentialsRoomBase room)
|
||||||
|
{
|
||||||
|
var mobileControl = DeviceManager.GetDeviceForKey("appServer") as IMobileControl;
|
||||||
|
|
||||||
|
if (mobileControl == null) return;
|
||||||
|
|
||||||
|
mobileControl.CreateMobileControlRoomBridge(room);
|
||||||
|
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Mobile Control Bridge Added...");
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Helps add the post activation steps that link bridges to main controller
|
/// Helps add the post activation steps that link bridges to main controller
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="bridge"></param>
|
/// <param name="bridge"></param>
|
||||||
void AddBridgePostActivationHelper(MobileControlBridgeBase bridge)
|
//void AddBridgePostActivationHelper(MobileControlBridgeBase bridge)
|
||||||
{
|
//{
|
||||||
bridge.AddPostActivationAction(() =>
|
// bridge.AddPostActivationAction(() =>
|
||||||
{
|
// {
|
||||||
var parent = DeviceManager.AllDevices.FirstOrDefault(d => d.Key == "appServer") as MobileControlSystemController;
|
// var parent = DeviceManager.AllDevices.FirstOrDefault(d => d.Key == "appServer") as MobileControlSystemController;
|
||||||
if (parent == null)
|
// if (parent == null)
|
||||||
{
|
// {
|
||||||
Debug.Console(0, bridge, "ERROR: Cannot connect app server room bridge. System controller not present");
|
// Debug.Console(0, bridge, "ERROR: Cannot connect app server room bridge. System controller not present");
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
Debug.Console(0, bridge, "Linking to parent controller");
|
// Debug.Console(0, bridge, "Linking to parent controller");
|
||||||
bridge.AddParent(parent);
|
// bridge.AddParent(parent);
|
||||||
parent.AddBridge(bridge);
|
// parent.AddBridge(bridge);
|
||||||
});
|
// });
|
||||||
}
|
//}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Fires up a logo server if not already running
|
/// Fires up a logo server if not already running
|
||||||
|
|||||||
@@ -6,11 +6,12 @@ using Crestron.SimplSharp;
|
|||||||
|
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
|
using PepperDash.Essentials.Core.Config;
|
||||||
using PepperDash.Essentials.Core.Routing;
|
using PepperDash.Essentials.Core.Routing;
|
||||||
|
|
||||||
namespace PepperDash.Essentials
|
namespace PepperDash.Essentials
|
||||||
{
|
{
|
||||||
public class Amplifier : Device, IRoutingSinkNoSwitching
|
public class Amplifier : EssentialsDevice, IRoutingSinkNoSwitching
|
||||||
{
|
{
|
||||||
public event SourceInfoChangeHandler CurrentSourceChange;
|
public event SourceInfoChangeHandler CurrentSourceChange;
|
||||||
|
|
||||||
@@ -54,4 +55,18 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class AmplifierFactory : EssentialsDeviceFactory<Amplifier>
|
||||||
|
{
|
||||||
|
public AmplifierFactory()
|
||||||
|
{
|
||||||
|
TypeNames = new List<string>() { "amplifier" };
|
||||||
|
}
|
||||||
|
|
||||||
|
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
||||||
|
{
|
||||||
|
Debug.Console(1, "Factory Attempting to create new Amplifier Device");
|
||||||
|
return new Amplifier(dc.Key, dc.Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -175,6 +175,10 @@
|
|||||||
{
|
{
|
||||||
"deviceKey": "gls-odt-1",
|
"deviceKey": "gls-odt-1",
|
||||||
"joinStart": 2751
|
"joinStart": 2751
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"deviceKey": "gls-part-1",
|
||||||
|
"joinStart": 2781
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -427,6 +431,19 @@
|
|||||||
"method": "cresnet"
|
"method": "cresnet"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "gls-part-1",
|
||||||
|
"uid": 19,
|
||||||
|
"name": "GLS-PART-CN 1",
|
||||||
|
"type": "glspartcn",
|
||||||
|
"group": "partition",
|
||||||
|
"properties": {
|
||||||
|
"control": {
|
||||||
|
"cresnetId": "90",
|
||||||
|
"method": "cresnet"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"rooms": [],
|
"rooms": [],
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ using System.Linq;
|
|||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
using Crestron.SimplSharp.CrestronIO;
|
using Crestron.SimplSharp.CrestronIO;
|
||||||
using Crestron.SimplSharpPro;
|
using Crestron.SimplSharpPro;
|
||||||
|
using Crestron.SimplSharp.Reflection;
|
||||||
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
@@ -13,85 +14,34 @@ using PepperDash.Essentials.Core.Config;
|
|||||||
|
|
||||||
namespace PepperDash.Essentials
|
namespace PepperDash.Essentials
|
||||||
{
|
{
|
||||||
public class DeviceFactory
|
/// <summary>
|
||||||
{
|
/// Responsible for loading all of the device types for this library
|
||||||
public static IKeyed GetDevice(DeviceConfig dc)
|
/// </summary>
|
||||||
{
|
public class DeviceFactory
|
||||||
var key = dc.Key;
|
{
|
||||||
var name = dc.Name;
|
|
||||||
var type = dc.Type;
|
|
||||||
var properties = dc.Properties;
|
|
||||||
|
|
||||||
var typeName = dc.Type.ToLower();
|
public DeviceFactory()
|
||||||
|
{
|
||||||
|
var assy = Assembly.GetExecutingAssembly();
|
||||||
|
PluginLoader.SetEssentialsAssembly(assy.GetName().Name, assy);
|
||||||
|
|
||||||
if (typeName == "amplifier")
|
var types = assy.GetTypes().Where(ct => typeof(IDeviceFactory).IsAssignableFrom(ct) && !ct.IsInterface && !ct.IsAbstract);
|
||||||
|
|
||||||
|
if (types != null)
|
||||||
{
|
{
|
||||||
return new Amplifier(dc.Key, dc.Name);
|
foreach (var type in types)
|
||||||
}
|
{
|
||||||
else if (dc.Group.ToLower() == "touchpanel") // typeName.StartsWith("tsw"))
|
try
|
||||||
{
|
{
|
||||||
return UiDeviceFactory.GetUiDevice(dc);
|
var factory = (IDeviceFactory)Crestron.SimplSharp.Reflection.Activator.CreateInstance(type);
|
||||||
|
factory.LoadTypeFactories();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Error, "Unable to load type: '{1}' DeviceFactory: {0}", e, type.Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else if (typeName == "mockdisplay")
|
}
|
||||||
{
|
|
||||||
return new MockDisplay(key, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (typeName == "generic")
|
|
||||||
{
|
|
||||||
return new Device(key, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
//// MOVE into something else???
|
|
||||||
//else if (typeName == "basicirdisplay")
|
|
||||||
//{
|
|
||||||
// var ir = IRPortHelper.GetIrPort(properties);
|
|
||||||
// if (ir != null)
|
|
||||||
// return new BasicIrDisplay(key, name, ir.Port, ir.FileName);
|
|
||||||
//}
|
|
||||||
|
|
||||||
else if (typeName == "commmock")
|
|
||||||
{
|
|
||||||
var comm = CommFactory.CreateCommForDevice(dc);
|
|
||||||
var props = JsonConvert.DeserializeObject<ConsoleCommMockDevicePropertiesConfig>(
|
|
||||||
properties.ToString());
|
|
||||||
return new ConsoleCommMockDevice(key, name, props, comm);
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (typeName == "appserver")
|
|
||||||
{
|
|
||||||
var props = JsonConvert.DeserializeObject<MobileControlConfig>(properties.ToString());
|
|
||||||
return new MobileControlSystemController(key, name, props);
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (typeName == "mobilecontrolbridge-ddvc01")
|
|
||||||
{
|
|
||||||
var comm = CommFactory.GetControlPropertiesConfig(dc);
|
|
||||||
|
|
||||||
var bridge = new PepperDash.Essentials.Room.MobileControl.MobileControlDdvc01RoomBridge(key, name, comm.IpIdInt);
|
|
||||||
bridge.AddPreActivationAction(() =>
|
|
||||||
{
|
|
||||||
var parent = DeviceManager.AllDevices.FirstOrDefault(d => d.Key == "appServer") as MobileControlSystemController;
|
|
||||||
if (parent == null)
|
|
||||||
{
|
|
||||||
Debug.Console(0, bridge, "ERROR: Cannot connect bridge. System controller not present");
|
|
||||||
}
|
|
||||||
Debug.Console(0, bridge, "Linking to parent controller");
|
|
||||||
bridge.AddParent(parent);
|
|
||||||
parent.AddBridge(bridge);
|
|
||||||
});
|
|
||||||
|
|
||||||
return bridge;
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (typeName == "roomonwhenoccupancydetectedfeature")
|
|
||||||
{
|
|
||||||
return new RoomOnToDefaultSourceWhenOccupied(dc);
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,191 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using Crestron.SimplSharpPro.UI;
|
|
||||||
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using Newtonsoft.Json.Linq;
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Core.Config;
|
|
||||||
using PepperDash.Essentials.Core.PageManagers;
|
|
||||||
using PepperDash.Essentials.DM.Endpoints.DGEs;
|
|
||||||
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials
|
|
||||||
{
|
|
||||||
public class UiDeviceFactory
|
|
||||||
{
|
|
||||||
public static IKeyed GetUiDevice(DeviceConfig config)
|
|
||||||
{
|
|
||||||
var comm = CommFactory.GetControlPropertiesConfig(config);
|
|
||||||
|
|
||||||
var typeName = config.Type.ToLower();
|
|
||||||
|
|
||||||
EssentialsTouchpanelController panelController = null;
|
|
||||||
|
|
||||||
var props = JsonConvert.DeserializeObject<CrestronTouchpanelPropertiesConfig>(config.Properties.ToString());
|
|
||||||
|
|
||||||
if (typeName.Contains("dge"))
|
|
||||||
{
|
|
||||||
Dge100 dgeDevice = null;
|
|
||||||
if (typeName == "dge100")
|
|
||||||
dgeDevice = new Dge100(comm.IpIdInt, Global.ControlSystem);
|
|
||||||
else if (typeName == "dmdge200c")
|
|
||||||
dgeDevice = new DmDge200C(comm.IpIdInt, Global.ControlSystem);
|
|
||||||
|
|
||||||
if (dgeDevice == null)
|
|
||||||
{
|
|
||||||
Debug.Console(1, "Unable to create DGE device");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
var dgeController = new DgeController(config.Key + "-comPorts", config.Name, dgeDevice, config, props);
|
|
||||||
|
|
||||||
DeviceManager.AddDevice(dgeController);
|
|
||||||
|
|
||||||
panelController = new EssentialsTouchpanelController(config.Key, config.Name, dgeController.DigitalGraphicsEngine,
|
|
||||||
props.ProjectName, props.SgdFile);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
panelController = new EssentialsTouchpanelController(config.Key, config.Name, config.Type, props, comm.IpIdInt);
|
|
||||||
}
|
|
||||||
|
|
||||||
panelController.AddPostActivationAction(() =>
|
|
||||||
{
|
|
||||||
var mainDriver = new EssentialsPanelMainInterfaceDriver(panelController.Panel, props);
|
|
||||||
// Then the sub drivers
|
|
||||||
|
|
||||||
// spin up different room drivers depending on room type
|
|
||||||
var room = DeviceManager.GetDeviceForKey(props.DefaultRoomKey);
|
|
||||||
if (room is EssentialsHuddleSpaceRoom)
|
|
||||||
{
|
|
||||||
|
|
||||||
// Header Driver
|
|
||||||
Debug.Console(0, panelController, "Adding header driver");
|
|
||||||
mainDriver.HeaderDriver = new EssentialsHeaderDriver(mainDriver, props);
|
|
||||||
|
|
||||||
// AV Driver
|
|
||||||
Debug.Console(0, panelController, "Adding huddle space AV driver");
|
|
||||||
var avDriver = new EssentialsHuddlePanelAvFunctionsDriver(mainDriver, props);
|
|
||||||
avDriver.DefaultRoomKey = props.DefaultRoomKey;
|
|
||||||
mainDriver.AvDriver = avDriver;
|
|
||||||
avDriver.CurrentRoom = room as EssentialsHuddleSpaceRoom;
|
|
||||||
|
|
||||||
// Environment Driver
|
|
||||||
if (avDriver.CurrentRoom.PropertiesConfig.Environment != null && avDriver.CurrentRoom.PropertiesConfig.Environment.DeviceKeys.Count > 0)
|
|
||||||
{
|
|
||||||
Debug.Console(0, panelController, "Adding environment driver");
|
|
||||||
mainDriver.EnvironmentDriver = new EssentialsEnvironmentDriver(mainDriver, props);
|
|
||||||
|
|
||||||
mainDriver.EnvironmentDriver.GetDevicesFromConfig(avDriver.CurrentRoom.PropertiesConfig.Environment);
|
|
||||||
}
|
|
||||||
|
|
||||||
mainDriver.HeaderDriver.SetupHeaderButtons(avDriver, avDriver.CurrentRoom);
|
|
||||||
|
|
||||||
panelController.LoadAndShowDriver(mainDriver); // This is a little convoluted.
|
|
||||||
|
|
||||||
if (panelController.Panel is TswFt5ButtonSystem)
|
|
||||||
{
|
|
||||||
var tsw = panelController.Panel as TswFt5ButtonSystem;
|
|
||||||
// Wire up hard keys
|
|
||||||
tsw.Power.UserObject = new Action<bool>(b => { if (!b) avDriver.PowerButtonPressed(); });
|
|
||||||
//tsw.Home.UserObject = new Action<bool>(b => { if (!b) HomePressed(); });
|
|
||||||
if(mainDriver.EnvironmentDriver != null)
|
|
||||||
tsw.Lights.UserObject = new Action<bool>(b =>
|
|
||||||
{
|
|
||||||
if (!b)
|
|
||||||
{
|
|
||||||
//mainDriver.AvDriver.PopupInterlock.ShowInterlockedWithToggle(mainDriver.EnvironmentDriver.BackgroundSubpageJoin);
|
|
||||||
mainDriver.EnvironmentDriver.Toggle();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
tsw.Up.UserObject = new Action<bool>(avDriver.VolumeUpPress);
|
|
||||||
tsw.Down.UserObject = new Action<bool>(avDriver.VolumeDownPress);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//else if (room is EssentialsPresentationRoom)
|
|
||||||
//{
|
|
||||||
// Debug.Console(0, panelController, "Adding presentation room driver");
|
|
||||||
// var avDriver = new EssentialsPresentationPanelAvFunctionsDriver(mainDriver, props);
|
|
||||||
// avDriver.CurrentRoom = room as EssentialsPresentationRoom;
|
|
||||||
// avDriver.DefaultRoomKey = props.DefaultRoomKey;
|
|
||||||
// mainDriver.AvDriver = avDriver ;
|
|
||||||
// mainDriver.HeaderDriver = new EssentialsHeaderDriver(mainDriver, props);
|
|
||||||
// panelController.LoadAndShowDriver(mainDriver);
|
|
||||||
|
|
||||||
// if (panelController.Panel is TswFt5ButtonSystem)
|
|
||||||
// {
|
|
||||||
// var tsw = panelController.Panel as TswFt5ButtonSystem;
|
|
||||||
// // Wire up hard keys
|
|
||||||
// tsw.Power.UserObject = new Action<bool>(b => { if (!b) avDriver.PowerButtonPressed(); });
|
|
||||||
// //tsw.Home.UserObject = new Action<bool>(b => { if (!b) HomePressed(); });
|
|
||||||
// tsw.Up.UserObject = new Action<bool>(avDriver.VolumeUpPress);
|
|
||||||
// tsw.Down.UserObject = new Action<bool>(avDriver.VolumeDownPress);
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
else if (room is EssentialsHuddleVtc1Room)
|
|
||||||
{
|
|
||||||
Debug.Console(0, panelController, "Adding huddle space VTC AV driver");
|
|
||||||
|
|
||||||
// Header Driver
|
|
||||||
mainDriver.HeaderDriver = new EssentialsHeaderDriver(mainDriver, props);
|
|
||||||
|
|
||||||
// AV Driver
|
|
||||||
var avDriver = new EssentialsHuddleVtc1PanelAvFunctionsDriver(mainDriver, props);
|
|
||||||
|
|
||||||
var codecDriver = new PepperDash.Essentials.UIDrivers.VC.EssentialsVideoCodecUiDriver(panelController.Panel, avDriver,
|
|
||||||
(room as EssentialsHuddleVtc1Room).VideoCodec, mainDriver.HeaderDriver);
|
|
||||||
avDriver.SetVideoCodecDriver(codecDriver);
|
|
||||||
avDriver.DefaultRoomKey = props.DefaultRoomKey;
|
|
||||||
mainDriver.AvDriver = avDriver;
|
|
||||||
avDriver.CurrentRoom = room as EssentialsHuddleVtc1Room;
|
|
||||||
|
|
||||||
// Environment Driver
|
|
||||||
if (avDriver.CurrentRoom.PropertiesConfig.Environment != null && avDriver.CurrentRoom.PropertiesConfig.Environment.DeviceKeys.Count > 0)
|
|
||||||
{
|
|
||||||
Debug.Console(0, panelController, "Adding environment driver");
|
|
||||||
mainDriver.EnvironmentDriver = new EssentialsEnvironmentDriver(mainDriver, props);
|
|
||||||
|
|
||||||
mainDriver.EnvironmentDriver.GetDevicesFromConfig(avDriver.CurrentRoom.PropertiesConfig.Environment);
|
|
||||||
}
|
|
||||||
|
|
||||||
mainDriver.HeaderDriver.SetupHeaderButtons(avDriver, avDriver.CurrentRoom);
|
|
||||||
|
|
||||||
panelController.LoadAndShowDriver(mainDriver); // This is a little convoluted.
|
|
||||||
|
|
||||||
if (panelController.Panel is TswFt5ButtonSystem)
|
|
||||||
{
|
|
||||||
var tsw = panelController.Panel as TswFt5ButtonSystem;
|
|
||||||
// Wire up hard keys
|
|
||||||
tsw.Power.UserObject = new Action<bool>(b => { if (!b) avDriver.EndMeetingPress(); });
|
|
||||||
//tsw.Home.UserObject = new Action<bool>(b => { if (!b) HomePressed(); });
|
|
||||||
if (mainDriver.EnvironmentDriver != null)
|
|
||||||
tsw.Lights.UserObject = new Action<bool>(b =>
|
|
||||||
{
|
|
||||||
if (!b)
|
|
||||||
{
|
|
||||||
//mainDriver.AvDriver.PopupInterlock.ShowInterlockedWithToggle(mainDriver.EnvironmentDriver.BackgroundSubpageJoin);
|
|
||||||
mainDriver.EnvironmentDriver.Toggle();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
tsw.Up.UserObject = new Action<bool>(avDriver.VolumeUpPress);
|
|
||||||
tsw.Down.UserObject = new Action<bool>(avDriver.VolumeDownPress);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Debug.Console(0, panelController, "ERROR: Cannot load AvFunctionsDriver for room '{0}'", props.DefaultRoomKey);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return panelController;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,23 +1,15 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Linq;
|
||||||
using System.Linq;
|
using Crestron.SimplSharp;
|
||||||
using System.Text;
|
using Crestron.SimplSharpPro;
|
||||||
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharp.CrestronIO;
|
|
||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using Crestron.SimplSharpPro.Fusion;
|
using Crestron.SimplSharpPro.Fusion;
|
||||||
|
|
||||||
|
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
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.Fusion;
|
using PepperDash.Essentials.Core.Fusion;
|
||||||
using PepperDash.Essentials.Devices.Common;
|
|
||||||
using PepperDash.Essentials.Devices.Common.Occupancy;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Fusion
|
namespace PepperDash.Essentials.Fusion
|
||||||
{
|
{
|
||||||
public class EssentialsHuddleVtc1FusionController : EssentialsHuddleSpaceFusionSystemControllerBase
|
public class EssentialsHuddleVtc1FusionController : EssentialsHuddleSpaceFusionSystemControllerBase
|
||||||
@@ -186,7 +178,7 @@ namespace PepperDash.Essentials.Fusion
|
|||||||
|
|
||||||
|
|
||||||
FusionRoom.SystemPowerOn.OutputSig.SetSigFalseAction((Room as EssentialsHuddleVtc1Room).PowerOnToDefaultOrLastSource);
|
FusionRoom.SystemPowerOn.OutputSig.SetSigFalseAction((Room as EssentialsHuddleVtc1Room).PowerOnToDefaultOrLastSource);
|
||||||
FusionRoom.SystemPowerOff.OutputSig.SetSigFalseAction(() => (Room as EssentialsHuddleVtc1Room).RunRouteAction("roomOff"));
|
FusionRoom.SystemPowerOff.OutputSig.SetSigFalseAction(() => (Room as EssentialsHuddleVtc1Room).RunRouteAction("roomOff", Room.SourceListKey));
|
||||||
// NO!! room.RoomIsOn.LinkComplementInputSig(FusionRoom.SystemPowerOff.InputSig);
|
// NO!! room.RoomIsOn.LinkComplementInputSig(FusionRoom.SystemPowerOff.InputSig);
|
||||||
|
|
||||||
|
|
||||||
@@ -342,7 +334,7 @@ namespace PepperDash.Essentials.Fusion
|
|||||||
|
|
||||||
// Current Source
|
// Current Source
|
||||||
var defaultDisplaySourceNone = FusionRoom.CreateOffsetBoolSig((uint)joinOffset + 8, displayName + "Source None", eSigIoMask.InputOutputSig);
|
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"); }); ;
|
defaultDisplaySourceNone.OutputSig.UserObject = new Action<bool>(b => { if (!b) (Room as EssentialsHuddleVtc1Room).RunRouteAction("roomOff", Room.SourceListKey); }); ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,266 +0,0 @@
|
|||||||
//using System;
|
|
||||||
//using System.Collections.Generic;
|
|
||||||
//using System.Linq;
|
|
||||||
//using System.Text;
|
|
||||||
//using Crestron.SimplSharp;
|
|
||||||
//using Crestron.SimplSharp.CrestronIO;
|
|
||||||
//using Crestron.SimplSharp.Net.Http;
|
|
||||||
|
|
||||||
//using Newtonsoft.Json;
|
|
||||||
//using Newtonsoft.Json.Linq;
|
|
||||||
|
|
||||||
//using PepperDash.Essentials.Core;
|
|
||||||
//using PepperDash.Essentials.Core.Http;
|
|
||||||
//using PepperDash.Core;
|
|
||||||
|
|
||||||
//namespace PepperDash.Essentials
|
|
||||||
//{
|
|
||||||
// public class EssentialsHttpApiHandler
|
|
||||||
// {
|
|
||||||
// string ConfigPath;
|
|
||||||
// string PresetsPathPrefix;
|
|
||||||
// EssentialsHttpServer Server;
|
|
||||||
|
|
||||||
// /// <summary>
|
|
||||||
// ///
|
|
||||||
// /// </summary>
|
|
||||||
// /// <param name="server">HTTP server to attach to</param>
|
|
||||||
// /// <param name="configPath">The full path to configuration file</param>
|
|
||||||
// /// <param name="presetsListPath">The folder prefix for the presets path, eq "\HTML\presets\"</param>
|
|
||||||
// public EssentialsHttpApiHandler(EssentialsHttpServer server, string configPath, string presetsPathPrefix)
|
|
||||||
// {
|
|
||||||
// if (server == null) throw new ArgumentNullException("server");
|
|
||||||
// Server = server;
|
|
||||||
// ConfigPath = configPath;
|
|
||||||
// PresetsPathPrefix = presetsPathPrefix;
|
|
||||||
// server.ApiRequest += Server_ApiRequest;
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
// void Server_ApiRequest(object sender, Crestron.SimplSharp.Net.Http.OnHttpRequestArgs args)
|
|
||||||
// {
|
|
||||||
// try
|
|
||||||
// {
|
|
||||||
// var path = args.Request.Path.ToLower();
|
|
||||||
|
|
||||||
// if (path == "/api/config")
|
|
||||||
// HandleApiConfig(args);
|
|
||||||
// else if (path.StartsWith("/api/presetslist/"))
|
|
||||||
// HandleApiPresetsList(args);
|
|
||||||
// else if (path == "/api/presetslists")
|
|
||||||
// HandleApiGetPresetsLists(args.Request, args.Response);
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// args.Response.Code = 404;
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// args.Response.Header.SetHeaderValue("Access-Control-Allow-Origin", "*");
|
|
||||||
// args.Response.Header.SetHeaderValue("Access-Control-Allow-Methods", "GET, POST, PATCH, PUT, DELETE, OPTIONS");
|
|
||||||
// }
|
|
||||||
// catch (Exception e)
|
|
||||||
// {
|
|
||||||
// Debug.Console(1, "Uncaught HTTP server error: \n{0}", e);
|
|
||||||
// args.Response.Code = 500;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// /// <summary>
|
|
||||||
// /// GET will return the running configuration. POST will attempt to take in a new config
|
|
||||||
// /// and restart the program.
|
|
||||||
// /// </summary>
|
|
||||||
// void HandleApiConfig(OnHttpRequestArgs args)
|
|
||||||
// {
|
|
||||||
// var request = args.Request;
|
|
||||||
// if (request.Header.RequestType == "GET")
|
|
||||||
// {
|
|
||||||
// if (File.Exists(ConfigPath))
|
|
||||||
// {
|
|
||||||
// Debug.Console(2, "Sending config:{0}", ConfigPath);
|
|
||||||
// args.Response.Header.ContentType = EssentialsHttpServer.GetContentType(new FileInfo(ConfigPath).Extension);
|
|
||||||
// args.Response.ContentStream = new FileStream(ConfigPath, FileMode.Open, FileAccess.Read);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// else if (request.Header.RequestType == "POST")
|
|
||||||
// {
|
|
||||||
// Debug.Console(2, "Post type: '{0}'", request.Header.ContentType);
|
|
||||||
|
|
||||||
// // Make sure we're receiving at least good json
|
|
||||||
// Debug.Console(1, "Receving new config");
|
|
||||||
// if (GetContentStringJson(args) == null)
|
|
||||||
// return;
|
|
||||||
|
|
||||||
// //---------------------------- try to move these into common method
|
|
||||||
// // Move current file aside
|
|
||||||
// var bakPath = ConfigPath + ".bak";
|
|
||||||
// if (File.Exists(bakPath))
|
|
||||||
// File.Delete(bakPath);
|
|
||||||
// File.Move(ConfigPath, bakPath);
|
|
||||||
|
|
||||||
// // Write the file
|
|
||||||
// using (FileStream fs = File.Open(ConfigPath, FileMode.OpenOrCreate))
|
|
||||||
// using (StreamWriter sw = new StreamWriter(fs))
|
|
||||||
// {
|
|
||||||
// try
|
|
||||||
// {
|
|
||||||
// sw.Write(args.Request.ContentString);
|
|
||||||
// }
|
|
||||||
// catch (Exception e)
|
|
||||||
// {
|
|
||||||
// string err = string.Format("Error writing received config file:\r{0}", e);
|
|
||||||
// CrestronConsole.PrintLine(err);
|
|
||||||
// ErrorLog.Warn(err);
|
|
||||||
// // Put file back
|
|
||||||
// File.Move(ConfigPath + ".bak", ConfigPath);
|
|
||||||
// args.Response.Code = 500;
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // If client says "yeah, restart" and has a good token
|
|
||||||
// // Restart program
|
|
||||||
// string consoleResponse = null;
|
|
||||||
// var restart = CrestronConsole.SendControlSystemCommand("progreset -p:" +
|
|
||||||
// InitialParametersClass.ApplicationNumber, ref consoleResponse);
|
|
||||||
// if (!restart) Debug.Console(0, "CAN'T DO THAT YO: {0}", consoleResponse);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// void HandleApiPresetsList(OnHttpRequestArgs args)
|
|
||||||
// {
|
|
||||||
// var listPath = PresetsPathPrefix + args.Request.Path.Remove(0, 17);
|
|
||||||
// Debug.Console(2, "Checking for preset list '{0}'", listPath);
|
|
||||||
|
|
||||||
// if (args.Request.Header.RequestType == "GET")
|
|
||||||
// {
|
|
||||||
// if (File.Exists(listPath))
|
|
||||||
// {
|
|
||||||
// Debug.Console(2, "Sending presets file:{0}", listPath);
|
|
||||||
// args.Response.Header.ContentType = EssentialsHttpServer.GetContentType(new FileInfo(listPath).Extension);
|
|
||||||
// args.Response.ContentStream = new FileStream(listPath, FileMode.Open, FileAccess.Read);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// else if (args.Request.Header.RequestType == "POST")
|
|
||||||
// {
|
|
||||||
// // Make sure we're receiving at least good json
|
|
||||||
// Debug.Console(1, "Receving new presets");
|
|
||||||
// if (GetContentStringJson(args) == null)
|
|
||||||
// return;
|
|
||||||
|
|
||||||
// //---------------------------- try to move these into common method
|
|
||||||
// // Move current file aside
|
|
||||||
// var bakPath = listPath + ".new";
|
|
||||||
// Debug.Console(2, "Moving presets file to {0}", bakPath);
|
|
||||||
// if(File.Exists(bakPath))
|
|
||||||
// File.Delete(bakPath);
|
|
||||||
// File.Move(listPath, bakPath);
|
|
||||||
|
|
||||||
// Debug.Console(2, "Writing new file");
|
|
||||||
// // Write the file
|
|
||||||
// using (FileStream fs = File.OpenWrite(listPath))
|
|
||||||
// using (StreamWriter sw = new StreamWriter(fs))
|
|
||||||
// {
|
|
||||||
// try
|
|
||||||
// {
|
|
||||||
// Debug.Console(2, "Writing {1}, {0} bytes", args.Request.ContentString.Length, listPath);
|
|
||||||
// sw.Write(args.Request.ContentString);
|
|
||||||
// }
|
|
||||||
// catch (Exception e)
|
|
||||||
// {
|
|
||||||
// string err = string.Format("Error writing received presets file:\r{0}", e);
|
|
||||||
// CrestronConsole.PrintLine(err);
|
|
||||||
// ErrorLog.Warn(err);
|
|
||||||
// // Put file back
|
|
||||||
// File.Move(listPath + ".bak", listPath);
|
|
||||||
// args.Response.Code = 500;
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
// void HandleApiGetPresetsLists(HttpServerRequest request, HttpServerResponse response)
|
|
||||||
// {
|
|
||||||
// if (request.Header.RequestType != "GET")
|
|
||||||
// {
|
|
||||||
// response.Code = 404; // This should be a 405 with an allow header
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// if (Directory.Exists(PresetsPathPrefix))
|
|
||||||
// {
|
|
||||||
// //CrestronConsole.PrintLine("Parsing presets directory");
|
|
||||||
// List<string> files = Directory.GetFiles(PresetsPathPrefix, "*.json")
|
|
||||||
// .ToList().Select(f => Path.GetFileName(f)).ToList();
|
|
||||||
// if (files.Count > 0)
|
|
||||||
// files.Sort();
|
|
||||||
// var json = JsonConvert.SerializeObject(files);
|
|
||||||
// response.Header.ContentType = "application/json";
|
|
||||||
// response.ContentString = json;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // //CrestronConsole.PrintLine("Found {0} files", files.Count);
|
|
||||||
// // JObject jo = new JObject();
|
|
||||||
// // JArray ja = new JArray();
|
|
||||||
|
|
||||||
// // foreach (var filename in files)
|
|
||||||
// // {
|
|
||||||
// // try
|
|
||||||
// // {
|
|
||||||
// // using (StreamReader sr = new StreamReader(filename))
|
|
||||||
// // {
|
|
||||||
// // JObject tempJo = JObject.Parse(sr.ReadToEnd());
|
|
||||||
// // if (tempJo.Value<string>("content").Equals("presetsList"))
|
|
||||||
// // {
|
|
||||||
// // var jItem = new JObject(); // make a new object
|
|
||||||
// // jItem.Add("Name", tempJo["name"]);
|
|
||||||
// // jItem.Add("File", filename);
|
|
||||||
// // jItem.Add("Url", Uri.EscapeUriString(new Uri(
|
|
||||||
// // filename.Replace("\\html", "")
|
|
||||||
// // .Replace("\\HTML", "")
|
|
||||||
// // .Replace('\\', '/'), UriKind.Relative).ToString()));
|
|
||||||
// // ja.Add(jItem); // add to array
|
|
||||||
// // }
|
|
||||||
// // else
|
|
||||||
// // CrestronConsole.PrintLine("Cannot use presets file '{0}'", filename);
|
|
||||||
// // }
|
|
||||||
// // }
|
|
||||||
// // catch
|
|
||||||
// // {
|
|
||||||
// // // ignore failures - maybe delete them
|
|
||||||
// // CrestronConsole.PrintLine("Unable to read presets file '{0}'", filename);
|
|
||||||
// // }
|
|
||||||
// // }
|
|
||||||
// // jo.Add("PresetChannelLists", ja);
|
|
||||||
// // //CrestronConsole.PrintLine(jo.ToString());
|
|
||||||
// // response.Header.ContentType = "application/json";
|
|
||||||
// // response.ContentString = jo.ToString();
|
|
||||||
// //}
|
|
||||||
// //else
|
|
||||||
// // CrestronConsole.PrintLine("No presets files in directory");
|
|
||||||
// }
|
|
||||||
|
|
||||||
// /// <summary>
|
|
||||||
// /// Simply does what it says
|
|
||||||
// /// </summary>
|
|
||||||
// JObject GetContentStringJson(OnHttpRequestArgs args)
|
|
||||||
// {
|
|
||||||
// //var content = args.Request.ContentString;
|
|
||||||
// //Debug.Console(1, "{0}", content);
|
|
||||||
|
|
||||||
// try
|
|
||||||
// {
|
|
||||||
// // just see if it parses properly
|
|
||||||
// return JObject.Parse(args.Request.ContentString);
|
|
||||||
// }
|
|
||||||
// catch (Exception e)
|
|
||||||
// {
|
|
||||||
// string err = string.Format("JSON Error reading config file:\r{0}", e);
|
|
||||||
// CrestronConsole.PrintLine(err);
|
|
||||||
// ErrorLog.Warn(err);
|
|
||||||
// args.Response.Code = 400; // Bad request
|
|
||||||
// return null;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
<ProjectGuid>{1BED5BA9-88C4-4365-9362-6F4B128071D3}</ProjectGuid>
|
<ProjectGuid>{1BED5BA9-88C4-4365-9362-6F4B128071D3}</ProjectGuid>
|
||||||
<OutputType>Library</OutputType>
|
<OutputType>Library</OutputType>
|
||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
<RootNamespace>PepperDash.Essentials</RootNamespace>
|
<RootNamespace>PepperDashEssentials</RootNamespace>
|
||||||
<AssemblyName>PepperDashEssentials</AssemblyName>
|
<AssemblyName>PepperDashEssentials</AssemblyName>
|
||||||
<ProjectTypeGuids>{0B4745B0-194B-4BB6-8E21-E9057CA92230};{4D628B5B-2FBC-4AA6-8C16-197242AEB884};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
<ProjectTypeGuids>{0B4745B0-194B-4BB6-8E21-E9057CA92230};{4D628B5B-2FBC-4AA6-8C16-197242AEB884};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||||
<PlatformFamilyName>WindowsCE</PlatformFamilyName>
|
<PlatformFamilyName>WindowsCE</PlatformFamilyName>
|
||||||
@@ -108,42 +108,16 @@
|
|||||||
<Reference Include="System.Data" />
|
<Reference Include="System.Data" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="AppServer\Messengers\ConfigMessenger.cs" />
|
|
||||||
<Compile Include="AppServer\Messengers\Ddvc01AtcMessenger.cs" />
|
|
||||||
<Compile Include="AppServer\Messengers\AudioCodecBaseMessenger.cs" />
|
|
||||||
<Compile Include="AppServer\Messengers\Ddvc01VtcMessenger.cs" />
|
|
||||||
<Compile Include="AppServer\Messengers\MessengerBase.cs" />
|
|
||||||
<Compile Include="AppServer\Messengers\SystemMonitorMessenger.cs" />
|
|
||||||
<Compile Include="AppServer\Messengers\VideoCodecBaseMessenger.cs" />
|
|
||||||
<Compile Include="Audio\EssentialsVolumeLevelConfig.cs" />
|
<Compile Include="Audio\EssentialsVolumeLevelConfig.cs" />
|
||||||
<Compile Include="Bridges\AppleTvBridge.cs" />
|
<Compile Include="Bridges\EiscBridge.cs" />
|
||||||
<Compile Include="Bridges\BridgeBase.cs" />
|
|
||||||
<Compile Include="Bridges\BridgeFactory.cs" />
|
|
||||||
<Compile Include="Bridges\C2nRthsControllerBridge.cs" />
|
|
||||||
<Compile Include="Bridges\CameraControllerBridge.cs" />
|
|
||||||
<Compile Include="Bridges\AirMediaControllerBridge.cs" />
|
|
||||||
<Compile Include="Bridges\DmBladeChassisControllerBridge.cs" />
|
|
||||||
<Compile Include="Bridges\JoinMaps\C2nRthsControllerJoinMap.cs" />
|
|
||||||
<Compile Include="Bridges\JoinMaps\DmBladeChassisControllerJoinMap.cs" />
|
|
||||||
<Compile Include="Bridges\DmpsAudioOutputControllerBridge.cs" />
|
|
||||||
<Compile Include="Bridges\DmpsRoutingControllerBridge.cs" />
|
|
||||||
<Compile Include="Bridges\DisplayControllerBridge.cs" />
|
|
||||||
<Compile Include="Bridges\DigitalLoggerBridge.cs" />
|
|
||||||
<Compile Include="Bridges\DmChassisControllerBridge.cs" />
|
|
||||||
<Compile Include="Bridges\DmTxControllerBridge.cs" />
|
|
||||||
<Compile Include="Bridges\GenericLightingBridge.cs" />
|
|
||||||
<Compile Include="Bridges\GenericRelayDeviceBridge.cs" />
|
|
||||||
<Compile Include="Bridges\GlsOccupancySensorBaseControllerBridge.cs" />
|
|
||||||
<Compile Include="Bridges\HdMdxxxCEControllerBridge.cs" />
|
|
||||||
<Compile Include="Bridges\IBasicCommunicationBridge.cs" />
|
|
||||||
<Compile Include="Bridges\DmRmcControllerBridge.cs" />
|
|
||||||
<Compile Include="Bridges\IBridge.cs" />
|
|
||||||
<Compile Include="Bridges\IDigitalInputBridge.cs" />
|
|
||||||
<Compile Include="Bridges\JoinMaps\AirMediaControllerJoinMap.cs" />
|
<Compile Include="Bridges\JoinMaps\AirMediaControllerJoinMap.cs" />
|
||||||
<Compile Include="Bridges\JoinMaps\AppleTvJoinMap.cs" />
|
<Compile Include="Bridges\JoinMaps\AppleTvJoinMap.cs" />
|
||||||
|
<Compile Include="Bridges\BridgeFactory.cs" />
|
||||||
|
<Compile Include="Bridges\JoinMaps\C2nRthsControllerJoinMap.cs" />
|
||||||
<Compile Include="Bridges\JoinMaps\CameraControllerJoinMap.cs" />
|
<Compile Include="Bridges\JoinMaps\CameraControllerJoinMap.cs" />
|
||||||
<Compile Include="Bridges\JoinMaps\DigitalLoggerJoinMap.cs" />
|
<Compile Include="Bridges\JoinMaps\DigitalLoggerJoinMap.cs" />
|
||||||
<Compile Include="Bridges\JoinMaps\DisplayControllerJoinMap.cs" />
|
<Compile Include="Bridges\JoinMaps\DisplayControllerJoinMap.cs" />
|
||||||
|
<Compile Include="Bridges\JoinMaps\DmBladeChassisControllerJoinMap.cs" />
|
||||||
<Compile Include="Bridges\JoinMaps\DmChassisControllerJoinMap.cs" />
|
<Compile Include="Bridges\JoinMaps\DmChassisControllerJoinMap.cs" />
|
||||||
<Compile Include="Bridges\JoinMaps\DmpsAudioOutputControllerJoinMap.cs" />
|
<Compile Include="Bridges\JoinMaps\DmpsAudioOutputControllerJoinMap.cs" />
|
||||||
<Compile Include="Bridges\JoinMaps\DmpsRoutingControllerJoinMap.cs" />
|
<Compile Include="Bridges\JoinMaps\DmpsRoutingControllerJoinMap.cs" />
|
||||||
@@ -151,20 +125,18 @@
|
|||||||
<Compile Include="Bridges\JoinMaps\DmTxControllerJoinMap.cs" />
|
<Compile Include="Bridges\JoinMaps\DmTxControllerJoinMap.cs" />
|
||||||
<Compile Include="Bridges\JoinMaps\GenericLightingJoinMap.cs" />
|
<Compile Include="Bridges\JoinMaps\GenericLightingJoinMap.cs" />
|
||||||
<Compile Include="Bridges\JoinMaps\GenericRelayControllerJoinMap.cs" />
|
<Compile Include="Bridges\JoinMaps\GenericRelayControllerJoinMap.cs" />
|
||||||
|
<Compile Include="Bridges\JoinMaps\GlsOccupancySensorBaseJoinMap.cs" />
|
||||||
<Compile Include="Bridges\JoinMaps\HdMdxxxCEControllerJoinMap.cs" />
|
<Compile Include="Bridges\JoinMaps\HdMdxxxCEControllerJoinMap.cs" />
|
||||||
<Compile Include="Bridges\JoinMaps\IBasicCommunicationJoinMap.cs" />
|
<Compile Include="Bridges\JoinMaps\IBasicCommunicationJoinMap.cs" />
|
||||||
|
<Compile Include="Bridges\IBridge.cs" />
|
||||||
<Compile Include="Bridges\JoinMaps\IDigitalInputJoinMap.cs" />
|
<Compile Include="Bridges\JoinMaps\IDigitalInputJoinMap.cs" />
|
||||||
<Compile Include="Bridges\JoinMaps\GlsOccupancySensorBaseJoinMap.cs" />
|
<Compile Include="Bridges\JoinMaps\SetTopBoxControllerJoinMap.cs" />
|
||||||
<Compile Include="Bridges\JoinMaps\StatusSignControllerJoinMap.cs" />
|
<Compile Include="Bridges\JoinMaps\StatusSignControllerJoinMap.cs" />
|
||||||
<Compile Include="Bridges\JoinMaps\SystemMonitorJoinMap.cs" />
|
<Compile Include="Bridges\JoinMaps\SystemMonitorJoinMap.cs" />
|
||||||
<Compile Include="Bridges\StatusSignControllerBridge.cs" />
|
|
||||||
<Compile Include="Bridges\SystemMonitorBridge.cs" />
|
|
||||||
<Compile Include="Factory\DeviceFactory.cs" />
|
<Compile Include="Factory\DeviceFactory.cs" />
|
||||||
<Compile Include="Devices\Amplifier.cs" />
|
<Compile Include="Devices\Amplifier.cs" />
|
||||||
<Compile Include="ControlSystem.cs" />
|
<Compile Include="ControlSystem.cs" />
|
||||||
<Compile Include="Factory\UiDeviceFactory.cs" />
|
|
||||||
<Compile Include="Fusion\EssentialsHuddleVtc1FusionController.cs" />
|
<Compile Include="Fusion\EssentialsHuddleVtc1FusionController.cs" />
|
||||||
<Compile Include="HttpApiHandler.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" />
|
||||||
@@ -173,22 +145,6 @@
|
|||||||
<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="AppServer\MobileControlConfig.cs" />
|
|
||||||
<Compile Include="AppServer\MobileControlDdvc01DeviceBridge.cs" />
|
|
||||||
<Compile Include="AppServer\Interfaces.cs" />
|
|
||||||
<Compile Include="AppServer\RoomBridges\MobileControlBridgeBase.cs" />
|
|
||||||
<Compile Include="AppServer\RoomBridges\MobileControlDdvc01RoomBridge.cs" />
|
|
||||||
<Compile Include="AppServer\RoomBridges\MobileControlEssentialsHuddleSpaceRoomBridge.cs" />
|
|
||||||
<Compile Include="AppServer\DeviceTypeInterfaces\IChannelExtensions.cs" />
|
|
||||||
<Compile Include="AppServer\DeviceTypeInterfaces\IColorExtensions.cs" />
|
|
||||||
<Compile Include="AppServer\DeviceTypeInterfaces\IDPadExtensions.cs" />
|
|
||||||
<Compile Include="AppServer\DeviceTypeInterfaces\IDvrExtensions.cs" />
|
|
||||||
<Compile Include="AppServer\DeviceTypeInterfaces\INumericExtensions.cs" />
|
|
||||||
<Compile Include="AppServer\DeviceTypeInterfaces\IPowerExtensions.cs" />
|
|
||||||
<Compile Include="AppServer\DeviceTypeInterfaces\ISetTopBoxControlsExtensions.cs" />
|
|
||||||
<Compile Include="AppServer\DeviceTypeInterfaces\ITransportExtensions.cs" />
|
|
||||||
<Compile Include="AppServer\RoomBridges\SourceDeviceMapDictionary.cs" />
|
|
||||||
<Compile Include="AppServer\Volumes.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" />
|
||||||
@@ -199,6 +155,7 @@
|
|||||||
<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" />
|
||||||
@@ -220,7 +177,6 @@
|
|||||||
<Compile Include="UIDrivers\Page Drivers\SingleSubpageModalAndBackDriver.cs" />
|
<Compile Include="UIDrivers\Page Drivers\SingleSubpageModalAndBackDriver.cs" />
|
||||||
<Compile Include="UIDrivers\SmartObjectRoomsList.cs" />
|
<Compile Include="UIDrivers\SmartObjectRoomsList.cs" />
|
||||||
<Compile Include="UI\JoinConstants\UIBoolJoin.cs" />
|
<Compile Include="UI\JoinConstants\UIBoolJoin.cs" />
|
||||||
<Compile Include="AppServer\MobileControlSystemController.cs" />
|
|
||||||
<Compile Include="UI\DualDisplaySourceSRLController.cs" />
|
<Compile Include="UI\DualDisplaySourceSRLController.cs" />
|
||||||
<Compile Include="UI\SubpageReferenceListActivityItem.cs" />
|
<Compile Include="UI\SubpageReferenceListActivityItem.cs" />
|
||||||
<Compile Include="Room\Types\EssentialsHuddleSpaceRoom.cs" />
|
<Compile Include="Room\Types\EssentialsHuddleSpaceRoom.cs" />
|
||||||
|
|||||||
491
PepperDashEssentials/PluginLoading/PluginLoading.cs
Normal file
491
PepperDashEssentials/PluginLoading/PluginLoading.cs
Normal file
@@ -0,0 +1,491 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using Crestron.SimplSharp;
|
||||||
|
using Crestron.SimplSharp.CrestronIO;
|
||||||
|
using Crestron.SimplSharp.Reflection;
|
||||||
|
|
||||||
|
using PepperDash.Core;
|
||||||
|
using PepperDash.Essentials.Core;
|
||||||
|
using PepperDash.Essentials.Core.Plugins;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Deals with loading plugins at runtime
|
||||||
|
/// </summary>
|
||||||
|
public static class PluginLoader
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The complete list of loaded assemblies. Includes Essentials Framework assemblies and plugins
|
||||||
|
/// </summary>
|
||||||
|
public static List<LoadedAssembly> LoadedAssemblies { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The list of assemblies loaded from the plugins folder
|
||||||
|
/// </summary>
|
||||||
|
static List<LoadedAssembly> LoadedPluginFolderAssemblies;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The directory to look in for .cplz plugin packages
|
||||||
|
/// </summary>
|
||||||
|
static string _pluginDirectory = Global.FilePathPrefix + "plugins";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The directory where plugins will be moved to and loaded from
|
||||||
|
/// </summary>
|
||||||
|
static string _loadedPluginsDirectoryPath = _pluginDirectory + Global.DirectorySeparator + "loadedAssemblies";
|
||||||
|
|
||||||
|
// The temp directory where .cplz archives will be unzipped to
|
||||||
|
static string _tempDirectory = _pluginDirectory + Global.DirectorySeparator + "temp";
|
||||||
|
|
||||||
|
static PluginLoader()
|
||||||
|
{
|
||||||
|
LoadedAssemblies = new List<LoadedAssembly>();
|
||||||
|
LoadedPluginFolderAssemblies = new List<LoadedAssembly>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Retrieves all the loaded assemblies from the program directory
|
||||||
|
/// </summary>
|
||||||
|
public static void AddProgramAssemblies()
|
||||||
|
{
|
||||||
|
Debug.Console(2, "Getting Assemblies loaded with Essentials");
|
||||||
|
// Get the loaded assembly filenames
|
||||||
|
var appDi = new DirectoryInfo(Global.ApplicationDirectoryPathPrefix);
|
||||||
|
var assemblyFiles = appDi.GetFiles("*.dll");
|
||||||
|
|
||||||
|
Debug.Console(2, "Found {0} Assemblies", assemblyFiles.Length);
|
||||||
|
|
||||||
|
foreach (var fi in assemblyFiles)
|
||||||
|
{
|
||||||
|
string version = string.Empty;
|
||||||
|
Assembly assembly = null;
|
||||||
|
|
||||||
|
switch (fi.Name)
|
||||||
|
{
|
||||||
|
case ("PepperDashEssentials.dll"):
|
||||||
|
{
|
||||||
|
version = Global.AssemblyVersion;
|
||||||
|
assembly = Assembly.GetExecutingAssembly();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ("PepperDashEssentialsBase.dll"):
|
||||||
|
{
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ("PepperDash_Core.dll"):
|
||||||
|
{
|
||||||
|
version = PepperDash.Core.Debug.PepperDashCoreVersion;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LoadedAssemblies.Add(new LoadedAssembly(fi.Name, version, assembly));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Debug.Level > 1)
|
||||||
|
{
|
||||||
|
Debug.Console(2, "Loaded Assemblies:");
|
||||||
|
|
||||||
|
foreach (var assembly in LoadedAssemblies)
|
||||||
|
{
|
||||||
|
Debug.Console(2, "Assembly: {0}", assembly.Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Loads an assembly via Reflection and adds it to the list of loaded assemblies
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="fileName"></param>
|
||||||
|
static LoadedAssembly LoadAssembly(string filePath)
|
||||||
|
{
|
||||||
|
Debug.Console(2, "Attempting to load {0}", filePath);
|
||||||
|
var assembly = Assembly.LoadFrom(filePath);
|
||||||
|
if (assembly != null)
|
||||||
|
{
|
||||||
|
var assyVersion = GetAssemblyVersion(assembly);
|
||||||
|
|
||||||
|
var loadedAssembly = new LoadedAssembly(assembly.GetName().Name, assyVersion, assembly);
|
||||||
|
LoadedAssemblies.Add(loadedAssembly);
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Loaded assembly '{0}', version {1}", loadedAssembly.Name, loadedAssembly.Version);
|
||||||
|
return loadedAssembly;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Unable to load assembly: '{0}'", filePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Attempts to get the assembly informational version and if not possible gets the version
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="assembly"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
static string GetAssemblyVersion(Assembly assembly)
|
||||||
|
{
|
||||||
|
var ver = assembly.GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false);
|
||||||
|
if (ver != null && ver.Length > 0)
|
||||||
|
{
|
||||||
|
// Get the AssemblyInformationalVersion
|
||||||
|
AssemblyInformationalVersionAttribute verAttribute = ver[0] as AssemblyInformationalVersionAttribute;
|
||||||
|
return verAttribute.InformationalVersion;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Get the AssemblyVersion
|
||||||
|
var version = assembly.GetName().Version;
|
||||||
|
var verStr = string.Format("{0}.{1}.{2}.{3}", version.Major, version.Minor, version.Build, version.Revision);
|
||||||
|
return verStr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Checks if the filename matches an already loaded assembly file's name
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filename"></param>
|
||||||
|
/// <returns>True if file already matches loaded assembly file.</returns>
|
||||||
|
public static bool CheckIfAssemblyLoaded(string name)
|
||||||
|
{
|
||||||
|
Debug.Console(2, "Checking if assembly: {0} is loaded...", name);
|
||||||
|
var loadedAssembly = LoadedAssemblies.FirstOrDefault(s => s.Name.Equals(name));
|
||||||
|
|
||||||
|
if (loadedAssembly != null)
|
||||||
|
{
|
||||||
|
Debug.Console(2, "Assembly already loaded.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Console(2, "Assembly not loaded.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Used by console command to report the currently loaded assemblies and versions
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="command"></param>
|
||||||
|
public static void ReportAssemblyVersions(string command)
|
||||||
|
{
|
||||||
|
Debug.Console(0, "Loaded Assemblies:");
|
||||||
|
foreach (var assembly in LoadedAssemblies)
|
||||||
|
{
|
||||||
|
Debug.Console(0, "{0} Version: {1}", assembly.Name, assembly.Version);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Moves any .dll assemblies not already loaded from the plugins folder to loadedPlugins folder
|
||||||
|
/// </summary>
|
||||||
|
static void MoveDllAssemblies()
|
||||||
|
{
|
||||||
|
Debug.Console(0, "Looking for .dll assemblies from plugins folder...");
|
||||||
|
|
||||||
|
var pluginDi = new DirectoryInfo(_pluginDirectory);
|
||||||
|
var pluginFiles = pluginDi.GetFiles("*.dll");
|
||||||
|
|
||||||
|
if (pluginFiles.Length > 0)
|
||||||
|
{
|
||||||
|
if (!Directory.Exists(_loadedPluginsDirectoryPath))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(_loadedPluginsDirectoryPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var pluginFile in pluginFiles)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Debug.Console(0, "Found .dll: {0}", pluginFile.Name);
|
||||||
|
|
||||||
|
if (!CheckIfAssemblyLoaded(pluginFile.Name))
|
||||||
|
{
|
||||||
|
string filePath = string.Empty;
|
||||||
|
|
||||||
|
filePath = _loadedPluginsDirectoryPath + Global.DirectorySeparator + pluginFile.Name;
|
||||||
|
|
||||||
|
// Check if there is a previous file in the loadedPlugins directory and delete
|
||||||
|
if (File.Exists(filePath))
|
||||||
|
{
|
||||||
|
Debug.Console(0, "Found existing file in loadedPlugins: {0} Deleting and moving new file to replace it", filePath);
|
||||||
|
File.Delete(filePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Move the file
|
||||||
|
File.Move(pluginFile.FullName, filePath);
|
||||||
|
Debug.Console(2, "Moved {0} to {1}", pluginFile.FullName, filePath);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Skipping assembly: {0}. There is already an assembly with that name loaded.", pluginFile.FullName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Debug.Console(2, "Error with plugin file {0} . Exception: {1}", pluginFile.FullName, e);
|
||||||
|
continue; //catching any load issues and continuing. There will be exceptions loading Crestron .dlls from the cplz Probably should do something different here
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.Console(0, "Done with .dll assemblies");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Unzips each .cplz archive into the temp directory and moves any unloaded files into loadedPlugins
|
||||||
|
/// </summary>
|
||||||
|
static void UnzipAndMoveCplzArchives()
|
||||||
|
{
|
||||||
|
Debug.Console(0, "Looking for .cplz archives from plugins folder...");
|
||||||
|
var di = new DirectoryInfo(_pluginDirectory);
|
||||||
|
var zFiles = di.GetFiles("*.cplz");
|
||||||
|
|
||||||
|
if (zFiles.Length > 0)
|
||||||
|
{
|
||||||
|
if (!Directory.Exists(_loadedPluginsDirectoryPath))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(_loadedPluginsDirectoryPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var zfi in zFiles)
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(_tempDirectory);
|
||||||
|
var tempDi = new DirectoryInfo(_tempDirectory);
|
||||||
|
|
||||||
|
Debug.Console(0, "Found cplz: {0}. Unzipping into temp plugins directory", zfi.Name);
|
||||||
|
var result = CrestronZIP.Unzip(zfi.FullName, tempDi.FullName);
|
||||||
|
Debug.Console(0, "UnZip Result: {0}", result.ToString());
|
||||||
|
|
||||||
|
var tempFiles = tempDi.GetFiles("*.dll");
|
||||||
|
foreach (var tempFile in tempFiles)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!CheckIfAssemblyLoaded(tempFile.Name))
|
||||||
|
{
|
||||||
|
string filePath = string.Empty;
|
||||||
|
|
||||||
|
filePath = _loadedPluginsDirectoryPath + Global.DirectorySeparator + tempFile.Name;
|
||||||
|
|
||||||
|
// Check if there is a previous file in the loadedPlugins directory and delete
|
||||||
|
if (File.Exists(filePath))
|
||||||
|
{
|
||||||
|
Debug.Console(0, "Found existing file in loadedPlugins: {0} Deleting and moving new file to replace it", filePath);
|
||||||
|
File.Delete(filePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Move the file
|
||||||
|
File.Move(tempFile.FullName, filePath);
|
||||||
|
Debug.Console(2, "Moved {0} to {1}", tempFile.FullName, filePath);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Skipping assembly: {0}. There is already an assembly with that name loaded.", tempFile.FullName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Debug.Console(2, "Assembly {0} is not a custom assembly. Exception: {1}", tempFile.FullName, e);
|
||||||
|
continue; //catching any load issues and continuing. There will be exceptions loading Crestron .dlls from the cplz Probably should do something different here
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete the .cplz and the temp directory
|
||||||
|
Directory.Delete(_tempDirectory, true);
|
||||||
|
zfi.Delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.Console(0, "Done with .cplz archives");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Attempts to load the assemblies from the loadedPlugins folder
|
||||||
|
/// </summary>
|
||||||
|
static void LoadPluginAssemblies()
|
||||||
|
{
|
||||||
|
Debug.Console(0, "Loading assemblies from loadedPlugins folder...");
|
||||||
|
var pluginDi = new DirectoryInfo(_loadedPluginsDirectoryPath);
|
||||||
|
var pluginFiles = pluginDi.GetFiles("*.dll");
|
||||||
|
|
||||||
|
Debug.Console(2, "Found {0} plugin assemblies to load", pluginFiles.Length);
|
||||||
|
|
||||||
|
foreach (var pluginFile in pluginFiles)
|
||||||
|
{
|
||||||
|
var loadedAssembly = LoadAssembly(pluginFile.FullName);
|
||||||
|
|
||||||
|
LoadedPluginFolderAssemblies.Add(loadedAssembly);
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.Console(0, "All Plugins Loaded.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Iterate the loaded assemblies and try to call the LoadPlugin method
|
||||||
|
/// </summary>
|
||||||
|
static void LoadCustomPluginTypes()
|
||||||
|
{
|
||||||
|
Debug.Console(0, "Loading Custom Plugin Types...");
|
||||||
|
foreach (var loadedAssembly in LoadedPluginFolderAssemblies)
|
||||||
|
{
|
||||||
|
// iteratate this assembly's classes, looking for "LoadPlugin()" methods
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var assy = loadedAssembly.Assembly;
|
||||||
|
var types = assy.GetTypes();
|
||||||
|
foreach (var type in types)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (typeof(IPluginDeviceFactory).IsAssignableFrom(type))
|
||||||
|
{
|
||||||
|
var plugin = (IPluginDeviceFactory)Crestron.SimplSharp.Reflection.Activator.CreateInstance(type);
|
||||||
|
LoadCustomPlugin(plugin, loadedAssembly);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var methods = type.GetMethods(BindingFlags.Public | BindingFlags.Static);
|
||||||
|
var loadPlugin = methods.FirstOrDefault(m => m.Name.Equals("LoadPlugin"));
|
||||||
|
if (loadPlugin != null)
|
||||||
|
{
|
||||||
|
LoadCustomLegacyPlugin(type, loadPlugin, loadedAssembly);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Debug.Console(2, "Load Plugin not found. {0} is not a plugin assembly. Exception: {1}", loadedAssembly.Name, e);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Debug.Console(2, "Error Loading Assembly: {0} Exception: (1) ", loadedAssembly.Name, e);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// plugin dll will be loaded. Any classes in plugin should have a static constructor
|
||||||
|
// that registers that class with the Core.DeviceFactory
|
||||||
|
Debug.Console(0, "Done Loading Custom Plugin Types.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Loads a
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="plugin"></param>
|
||||||
|
static void LoadCustomPlugin(IPluginDeviceFactory plugin, LoadedAssembly loadedAssembly)
|
||||||
|
{
|
||||||
|
var passed = Global.IsRunningMinimumVersionOrHigher(plugin.MinimumEssentialsFrameworkVersion);
|
||||||
|
|
||||||
|
if (!passed)
|
||||||
|
{
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Error, "Plugin indicates minimum Essentials version {0}. Dependency check failed. Skipping Plugin", plugin.MinimumEssentialsFrameworkVersion);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Passed plugin passed dependency check (required version {0})", plugin.MinimumEssentialsFrameworkVersion);
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Loading plugin: {0}", loadedAssembly.Name);
|
||||||
|
plugin.LoadTypeFactories();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Loads a a custom plugin via the legacy method
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="type"></param>
|
||||||
|
/// <param name="loadPlugin"></param>
|
||||||
|
static void LoadCustomLegacyPlugin(CType type, MethodInfo loadPlugin, LoadedAssembly loadedAssembly)
|
||||||
|
{
|
||||||
|
Debug.Console(2, "LoadPlugin method found in {0}", type.Name);
|
||||||
|
|
||||||
|
var fields = type.GetFields(BindingFlags.Public | BindingFlags.Static);
|
||||||
|
|
||||||
|
var minimumVersion = fields.FirstOrDefault(p => p.Name.Equals("MinimumEssentialsFrameworkVersion"));
|
||||||
|
if (minimumVersion != null)
|
||||||
|
{
|
||||||
|
Debug.Console(2, "MinimumEssentialsFrameworkVersion found");
|
||||||
|
|
||||||
|
var minimumVersionString = minimumVersion.GetValue(null) as string;
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(minimumVersionString))
|
||||||
|
{
|
||||||
|
var passed = Global.IsRunningMinimumVersionOrHigher(minimumVersionString);
|
||||||
|
|
||||||
|
if (!passed)
|
||||||
|
{
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Error, "Plugin indicates minimum Essentials version {0}. Dependency check failed. Skipping Plugin", minimumVersionString);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Passed plugin passed dependency check (required version {0})", minimumVersionString);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Warning, "MinimumEssentialsFrameworkVersion found but not set. Loading plugin, but your mileage may vary.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Warning, "MinimumEssentialsFrameworkVersion not found. Loading plugin, but your mileage may vary.");
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Loading legacy plugin: {0}", loadedAssembly.Name);
|
||||||
|
loadPlugin.Invoke(null, null);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Loads plugins
|
||||||
|
/// </summary>
|
||||||
|
public static void LoadPlugins()
|
||||||
|
{
|
||||||
|
if (Directory.Exists(_pluginDirectory))
|
||||||
|
{
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Plugins directory found, checking for plugins");
|
||||||
|
|
||||||
|
// Deal with any .dll files
|
||||||
|
MoveDllAssemblies();
|
||||||
|
|
||||||
|
// Deal with any .cplz files
|
||||||
|
UnzipAndMoveCplzArchives();
|
||||||
|
|
||||||
|
if(Directory.Exists(_loadedPluginsDirectoryPath)) {
|
||||||
|
// Load the assemblies from the loadedPlugins folder into the AppDomain
|
||||||
|
LoadPluginAssemblies();
|
||||||
|
|
||||||
|
// Load the types from any custom plugin assemblies
|
||||||
|
LoadCustomPluginTypes();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Represents an assembly loaded at runtime and it's associated metadata
|
||||||
|
/// </summary>
|
||||||
|
public class LoadedAssembly
|
||||||
|
{
|
||||||
|
public string Name { get; private set; }
|
||||||
|
public string Version { get; private set; }
|
||||||
|
public Assembly Assembly { get; private set; }
|
||||||
|
|
||||||
|
public LoadedAssembly(string name, string version, Assembly assembly)
|
||||||
|
{
|
||||||
|
Name = name;
|
||||||
|
Version = version;
|
||||||
|
Assembly = assembly;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +1,10 @@
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using Crestron.SimplSharp.Reflection;
|
||||||
|
|
||||||
[assembly: AssemblyTitle("PepperDashEssentials")]
|
[assembly: System.Reflection.AssemblyTitle("PepperDashEssentials")]
|
||||||
[assembly: AssemblyCompany("PepperDash Technology Corp")]
|
[assembly: System.Reflection.AssemblyCompany("PepperDash Technology Corp")]
|
||||||
[assembly: AssemblyProduct("PepperDashEssentials")]
|
[assembly: System.Reflection.AssemblyProduct("PepperDashEssentials")]
|
||||||
[assembly: AssemblyCopyright("Copyright © PepperDash Technology Corp 2018")]
|
[assembly: System.Reflection.AssemblyCopyright("Copyright © PepperDash Technology Corp 2020")]
|
||||||
[assembly: AssemblyVersion("1.4.0.*")]
|
[assembly: System.Reflection.AssemblyVersion("0.0.0.*")]
|
||||||
|
[assembly: System.Reflection.AssemblyInformationalVersion("0.0.0-buildType-buildNumber")]
|
||||||
|
[assembly: Crestron.SimplSharp.Reflection.AssemblyInformationalVersion("0.0.0-buildType-buildNumber")]
|
||||||
|
|||||||
@@ -1,13 +1,23 @@
|
|||||||
function Update-SourceVersion
|
function Update-SourceVersion
|
||||||
{
|
{
|
||||||
Param ([string]$Version)
|
Param ([string]$Version)
|
||||||
$NewVersion = ‘AssemblyVersion("‘ + $Version + ‘.*")’;
|
$fullVersion = $Version
|
||||||
|
$baseVersion = [regex]::Match($Version, "(\d+.\d+.\d+).*").captures.groups[1].value
|
||||||
|
$NewAssemblyVersion = ‘AssemblyVersion("‘ + $baseVersion + ‘.*")’
|
||||||
|
echo "AssemblyVersion = $NewAssemblyVersion"
|
||||||
|
$NewAssemblyInformationalVersion = ‘AssemblyInformationalVersion("‘ + $Version + ‘")’
|
||||||
|
echo "AssemblyInformationalVersion = $NewAssemblyInformationalVersion"
|
||||||
|
|
||||||
foreach ($o in $input)
|
foreach ($o in $input)
|
||||||
{
|
{
|
||||||
Write-output $o.FullName
|
Write-output $o.FullName
|
||||||
$TmpFile = $o.FullName + “.tmp”
|
$TmpFile = $o.FullName + “.tmp”
|
||||||
get-content $o.FullName |
|
get-content $o.FullName |
|
||||||
%{$_ -replace ‘AssemblyVersion\("(\d+\.\d+\.\d+)\.\*"\)’, $NewVersion } > $TmpFile
|
%{
|
||||||
|
$_ -replace ‘AssemblyVersion\(".*"\)’, $NewAssemblyVersion} |
|
||||||
|
%{
|
||||||
|
$_ -replace ‘AssemblyInformationalVersion\(".*"\)’, $NewAssemblyInformationalVersion
|
||||||
|
} > $TmpFile
|
||||||
move-item $TmpFile $o.FullName -force
|
move-item $TmpFile $o.FullName -force
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -21,9 +31,10 @@ function Update-AllAssemblyInfoFiles ( $version )
|
|||||||
}
|
}
|
||||||
|
|
||||||
# validate arguments
|
# validate arguments
|
||||||
$r= [System.Text.RegularExpressions.Regex]::Match($args[0], "^\d+\.\d+\.\d+$");
|
$r= [System.Text.RegularExpressions.Regex]::Match($args[0], "\d+\.\d+\.\d+.*");
|
||||||
if ($r.Success)
|
if ($r.Success)
|
||||||
{
|
{
|
||||||
|
echo "Updating Assembly Version to $args ...";
|
||||||
Update-AllAssemblyInfoFiles $args[0];
|
Update-AllAssemblyInfoFiles $args[0];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,16 +0,0 @@
|
|||||||
<ProgramInfo>
|
|
||||||
<RequiredInfo>
|
|
||||||
<FriendlyName>PepperDashEssentials</FriendlyName>
|
|
||||||
<SystemName>PepperDashEssentialsBase</SystemName>
|
|
||||||
<EntryPoint>PepperDashEssentialsBase</EntryPoint>
|
|
||||||
<MinFirmwareVersion>1.009.0029</MinFirmwareVersion>
|
|
||||||
<ProgramTool>SIMPL# Plugin</ProgramTool>
|
|
||||||
<DesignToolId>5</DesignToolId>
|
|
||||||
<ProgramToolId>5</ProgramToolId>
|
|
||||||
<ArchiveName />
|
|
||||||
</RequiredInfo>
|
|
||||||
<OptionalInfo>
|
|
||||||
<CompiledOn>1/8/2016 3:03:22 PM</CompiledOn>
|
|
||||||
<CompilerRev>1.0.0.27100</CompilerRev>
|
|
||||||
</OptionalInfo>
|
|
||||||
</ProgramInfo>
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,18 +0,0 @@
|
|||||||
MainAssembly=PepperDashEssentialsBase.dll:5d68a993ab03b4b88d0f95478188a439
|
|
||||||
MainAssemblyMinFirmwareVersion=1.009.0029
|
|
||||||
ü
|
|
||||||
DependencySource=Crestron.SimplSharpPro.DeviceSupport.dll:caae4b4259aaf619059f0ae34473bfd2
|
|
||||||
DependencyPath=PepperDashEssentialsBase.cplz:Crestron.SimplSharpPro.DeviceSupport.dll
|
|
||||||
DependencyMainAssembly=Crestron.SimplSharpPro.DeviceSupport.dll:caae4b4259aaf619059f0ae34473bfd2
|
|
||||||
ü
|
|
||||||
DependencySource=Crestron.SimplSharpPro.DM.dll:bdf5acfa80cc3bb87f21deb891128b1d
|
|
||||||
DependencyPath=PepperDashEssentialsBase.cplz:Crestron.SimplSharpPro.DM.dll
|
|
||||||
DependencyMainAssembly=Crestron.SimplSharpPro.DM.dll:bdf5acfa80cc3bb87f21deb891128b1d
|
|
||||||
ü
|
|
||||||
DependencySource=Crestron.SimplSharpPro.EthernetCommunications.dll:36e663497195140ee6f1b4ebc53f5ea7
|
|
||||||
DependencyPath=PepperDashEssentialsBase.cplz:Crestron.SimplSharpPro.EthernetCommunications.dll
|
|
||||||
DependencyMainAssembly=Crestron.SimplSharpPro.EthernetCommunications.dll:36e663497195140ee6f1b4ebc53f5ea7
|
|
||||||
ü
|
|
||||||
DependencySource=Crestron.SimplSharpPro.UI.dll:089312a0cb0b4537072d4eb234e71e0e
|
|
||||||
DependencyPath=PepperDashEssentialsBase.cplz:Crestron.SimplSharpPro.UI.dll
|
|
||||||
DependencyMainAssembly=Crestron.SimplSharpPro.UI.dll:089312a0cb0b4537072d4eb234e71e0e
|
|
||||||
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user