Compare commits
539 Commits
Author | SHA1 | Date |
---|---|---|
Matt McWilliams | 2af8b4b209 | |
Matt McWilliams | 66096fa2ea | |
Matt McWilliams | 18875a01c6 | |
Matt McWilliams | 7d2c2b9d09 | |
Matt McWilliams | 67a290a02a | |
Matt McWilliams | 63f4278b2b | |
Matt McWilliams | 6778f871db | |
Matt McWilliams | edc72a5486 | |
Matt McWilliams | 2779258111 | |
Matt McWilliams | da735779b4 | |
Matt McWilliams | b7e2e912f4 | |
Matt McWilliams | d34172d8e9 | |
Matt McWilliams | f30ce78f9d | |
Matt McWilliams | ed767aedb5 | |
Matt McWilliams | ab35895cb3 | |
Matt McWilliams | 1e2b65644d | |
Matt McWilliams | 3f58bbc617 | |
Matt McWilliams | c1da7b53a2 | |
Matt McWilliams | 4181c22995 | |
Matt McWilliams | d31ac53bd1 | |
Matt McWilliams | 9b954852aa | |
Matt McWilliams | 3758916fb5 | |
Matt McWilliams | 25c1395655 | |
Matt McWilliams | 440edd7b18 | |
Matt McWilliams | a2f045841f | |
Matt McWilliams | c890107e1e | |
Matt McWilliams | a5df1650b9 | |
Matt McWilliams | 173ce499bc | |
Matt McWilliams | 33412b0588 | |
Matt McWilliams | 3c5e31a961 | |
Matt McWilliams | 39676f9a06 | |
Matt McWilliams | 0f893d94c4 | |
Matt McWilliams | b08f5094d5 | |
Matt McWilliams | 70e046eeb7 | |
Matt McWilliams | 58d0742187 | |
Matt McWilliams | f84e8b741a | |
Matt McWilliams | fcf24b5539 | |
Matt McWilliams | 128a4d2ded | |
Matt McWilliams | b14d24e650 | |
Matt McWilliams | 7995665c6b | |
Matt McWilliams | a22906d3c2 | |
Matt McWilliams | 042533dc85 | |
Matt McWilliams | 5fbefeecbf | |
Matt McWilliams | a9772ff081 | |
Matt McWilliams | cdf983c7c6 | |
Matt McWilliams | 03f886580f | |
Matt McWilliams | a06e2869b9 | |
Matt McWilliams | 6bafb263de | |
Matt McWilliams | 493ff5fbf6 | |
Matt McWilliams | c29e0880ac | |
Matt McWilliams | 986c7a915b | |
Matt McWilliams | 68b1b8b819 | |
Matt McWilliams | 382ba56fa7 | |
Matt McWilliams | 24d6685047 | |
Matt McWilliams | 565d2ecceb | |
Matt McWilliams | c4456e458f | |
Matt McWilliams | f707dedc91 | |
Matt McWilliams | 702fc4680d | |
Matt McWilliams | 99b63150ac | |
Matt McWilliams | 6e7c226c57 | |
Matt McWilliams | c8e5f7b742 | |
Matt McWilliams | 0cf147d185 | |
Matt McWilliams | cf1514f53e | |
Matt McWilliams | af3843a8ef | |
Matt McWilliams | 91ce2dd450 | |
Matt McWilliams | 71c9efae42 | |
Matt McWilliams | 08ce0d792b | |
Matt McWilliams | 754ef17b74 | |
Matt McWilliams | 5d4fec8c81 | |
Matt McWilliams | 1e0338a77f | |
Matt McWilliams | e6b9628746 | |
Matt McWilliams | 6f68081dc5 | |
Matt McWilliams | 66b18dd351 | |
Matt McWilliams | b5f5b6461a | |
Matt McWilliams | 6dd29d9596 | |
Matt McWilliams | 29ba125534 | |
Matt McWilliams | 144af1414c | |
Matt McWilliams | 06906eca42 | |
Matt McWilliams | 0d47748d6a | |
Matt McWilliams | b1c8192625 | |
Matt McWilliams | d2c7781d79 | |
Matt McWilliams | 37d4f50ef4 | |
Matt McWilliams | 082ac85c5c | |
Matt McWilliams | cfca56ba48 | |
Matt McWilliams | c7cb4ddbc5 | |
Matt McWilliams | 7f98d6028b | |
Matt McWilliams | 401822a7bb | |
Matt McWilliams | 173ba06590 | |
Matt McWilliams | 2677118bad | |
Matt McWilliams | 8e90456d87 | |
Matt McWilliams | 0b880a5e79 | |
Matt McWilliams | 082dbc0826 | |
Matt McWilliams | 5eccbbf6df | |
Matt McWilliams | 513deb7a0a | |
Matt McWilliams | 2b24dc647c | |
Matt McWilliams | f8e5968f30 | |
Matt McWilliams | 18b8c84fff | |
Matt McWilliams | 1d6ccb7838 | |
Matt McWilliams | a7a63a3be7 | |
Matt McWilliams | 153ef9eceb | |
Matt McWilliams | eec7765e73 | |
Matt McWilliams | 03f2b55762 | |
Matt McWilliams | 6714374639 | |
Matt McWilliams | b6b1f5d5ba | |
Matt McWilliams | d7a10f9737 | |
Matt McWilliams | d778adc7d0 | |
Matt McWilliams | dcbb57f732 | |
Matt McWilliams | 24452794a9 | |
Matt McWilliams | 24fe1e8773 | |
Matt McWilliams | b30c637c10 | |
Matt McWilliams | f16795b11c | |
Matt McWilliams | 141d27599f | |
Matt McWilliams | 86c88c4ac2 | |
Matt McWilliams | fbab0c043a | |
Matt McWilliams | 1a01a4f05e | |
Matt McWilliams | b0305ae6da | |
Matt McWilliams | dd4834de04 | |
Matt McWilliams | 2d90c127a3 | |
Matt McWilliams | 51d440fccc | |
Matt McWilliams | 2e3ed56bb3 | |
Matt McWilliams | 4be57f3128 | |
Matt McWilliams | de6f0d0495 | |
Matt McWilliams | 98e1e73163 | |
Matt McWilliams | 1ae524ff31 | |
Matt McWilliams | 010927c5ca | |
Matt McWilliams | 3346bf01af | |
Matt McWilliams | 788cac7d50 | |
Matt McWilliams | 4c0fa2ba41 | |
Matt McWilliams | 83209f466f | |
Matt McWilliams | 10c452c1b3 | |
Matt McWilliams | a8a33a823a | |
Matt McWilliams | e7e7f86ab3 | |
Matt McWilliams | 386285d48c | |
Matt McWilliams | c4119ab7cc | |
Matt McWilliams | 176643f148 | |
Matt McWilliams | 8b235bb6b0 | |
Matt McWilliams | 8a170f65ca | |
Matt McWilliams | 2f56dd4b8a | |
Matt McWilliams | 699c2dbec8 | |
Matt McWilliams | dac720863d | |
Matt McWilliams | 3b03eb70fb | |
Matt McWilliams | a173cf0d7c | |
Matt McWilliams | 55b39e7db3 | |
Matt McWilliams | 505a2a71e7 | |
Matt McWilliams | fb51716e3a | |
Matt McWilliams | bdd74fa90a | |
Matt McWilliams | 8631250b9e | |
Matt McWilliams | c9f35ffe90 | |
Matt McWilliams | 18d6e2c7cd | |
Matt McWilliams | f47ea2d382 | |
Matt McWilliams | 0cc167b3a6 | |
Matthew McWilliams | 5133295f38 | |
Matt McWilliams | 621948fbac | |
Matt McWilliams | 4539c6d897 | |
Matt McWilliams | a7db072dc6 | |
Matt McWilliams | 58ce079330 | |
Matt McWilliams | dd03583a27 | |
Matt McWilliams | 3feaea74bf | |
Matt McWilliams | 1d6cbe5c53 | |
Matt McWilliams | 318f931dbf | |
Matt McWilliams | 5400518ea6 | |
Matt McWilliams | f73a1e3931 | |
Matthew McWilliams | 60d7ab4b5e | |
Matthew McWilliams | 95cde2907a | |
Matthew McWilliams | 35b67f1815 | |
Matt McWilliams | f958789b20 | |
Matt McWilliams | 4beef04a3f | |
Matthew McWilliams | 6d379d284b | |
Matt McWilliams | 2c21110b97 | |
Matt McWilliams | 777db577d7 | |
Matt McWilliams | bf320216cf | |
Matt McWilliams | b48c498574 | |
Matt McWilliams | 0b71da8e7b | |
Matt McWilliams | c0d6cbccec | |
Matt McWilliams | 95ede98623 | |
Matt McWilliams | 3881dd4891 | |
Matt McWilliams | 71e4bea384 | |
Matt McWilliams | 83aa3099c4 | |
Matt McWilliams | 672db32917 | |
Matt McWilliams | 80a9c23f4d | |
Matt McWilliams | 49ad3c28a8 | |
Matt McWilliams | a29c85628c | |
Matt McWilliams | 3ec93ab3b1 | |
Matt McWilliams | 10c29d3af1 | |
Matt McWilliams | 41840b90c8 | |
Matt McWilliams | c89e865d3d | |
Matt McWilliams | c6ec54bd06 | |
Matt McWilliams | af3b1b8cbb | |
Matt McWilliams | 86273a9f09 | |
Matt McWilliams | ba0241a811 | |
Matt McWilliams | 1bd73876b4 | |
Matt McWilliams | cc806cbe52 | |
Matt McWilliams | 8f7a40075a | |
Matt McWilliams | 64faaa9427 | |
Matt McWilliams | d44c67ce80 | |
Matt McWilliams | 144b408092 | |
Matt McWilliams | d2390dca30 | |
Matt McWilliams | 503a8ec92f | |
Matt McWilliams | ca22a3ba4b | |
Matt McWilliams | ef54e61494 | |
Matt McWilliams | b1745c786b | |
Matt McWilliams | 83efbc18c7 | |
Matthew McWilliams | f47396e48c | |
Matt McWilliams | 03c27a9226 | |
Matt McWilliams | 08655898d4 | |
Matt McWilliams | 5d347d23e4 | |
Matthew McWilliams | a25d93ec55 | |
Matthew McWilliams | bbf0cbd1c6 | |
Matthew McWilliams | 4aceeac1c2 | |
Matt McWilliams | 1f5bb85304 | |
Matthew McWilliams | 087fd3f763 | |
Matthew McWilliams | daece3b45a | |
Matthew McWilliams | 9705505285 | |
Matthew McWilliams | 9016062f70 | |
Matthew McWilliams | a6de66eb66 | |
Matt McWilliams | 6ada6b08ed | |
Matt McWilliams | 710e178ba2 | |
Matt McWilliams | 9e7990851e | |
Matt McWilliams | ae34558f18 | |
Matt McWilliams | c1a51f1ce8 | |
Matt McWilliams | 13702a3d5b | |
Matt McWilliams | 6b66cfe03f | |
Matt McWilliams | cbc876c57c | |
Matt McWilliams | 7813a8c904 | |
Matt McWilliams | 5f941e91b5 | |
Matt McWilliams | d262ed418d | |
Matt McWilliams | 2e9db4d667 | |
Matt McWilliams | bd9317dd8f | |
Matt McWilliams | 461add1cda | |
Matt McWilliams | 1528dec668 | |
Matt McWilliams | fff9d5d410 | |
Matt McWilliams | 231c354cb1 | |
Matt McWilliams | 4e0149e752 | |
Matt McWilliams | 5c6b9191e5 | |
Matt McWilliams | 77a0f7d8a0 | |
Matt McWilliams | 9faae6fc36 | |
Matt McWilliams | 3689eb7528 | |
Matt McWilliams | 210dc85558 | |
Matt McWilliams | 174b900cd8 | |
Matt McWilliams | fbe954280f | |
Matt McWilliams | 142c990a0e | |
Matt McWilliams | 790ea3d551 | |
Matt McWilliams | c6b8592490 | |
Matt McWilliams | f67e011d5e | |
Matt McWilliams | a4bc54482d | |
Matt McWilliams | be50eb6fcf | |
Matt McWilliams | a7d784583a | |
Matt McWilliams | 7af1f739e4 | |
Matt McWilliams | 3e247703a8 | |
Matt McWilliams | c7e338ebff | |
Matt McWilliams | cc2af435d5 | |
Matt McWilliams | 87695b173d | |
Matt McWilliams | 722ff9c05e | |
Matt McWilliams | 51114df576 | |
Matt McWilliams | 9126bc82c0 | |
Matt McWilliams | e09fe7d42f | |
Matt McWilliams | 234e69c7a2 | |
Matt McWilliams | d7017af245 | |
Matt McWilliams | f49c70ead6 | |
Matt McWilliams | 9a89dbe6a5 | |
Matt McWilliams | 844bb286a5 | |
Matt McWilliams | 4eceecf139 | |
Matt McWilliams | 95e2e997e5 | |
Matt McWilliams | 346c303edb | |
Matt McWilliams | 908fe52ad8 | |
Matt McWilliams | 3fd1e47b7b | |
Matt McWilliams | d41f082839 | |
Matt McWilliams | 2047ce4f76 | |
Matt McWilliams | 3ef56cab21 | |
Matt McWilliams | 6b77b98aad | |
Matt McWilliams | 211101cd6b | |
Matt McWilliams | e27cae353f | |
Matt McWilliams | b12a08e47a | |
Matt McWilliams | 9b298ac676 | |
Matt McWilliams | 52acb97e08 | |
Matt McWilliams | 78450e9e6a | |
Matt McWilliams | dc746fe6f4 | |
Matt McWilliams | 0e3bc563a7 | |
Matt McWilliams | d0ef5d410d | |
Matt McWilliams | d9aa7dc698 | |
Matt McWilliams | 70ab8cb527 | |
Matt McWilliams | 512f6c86ad | |
Matt McWilliams | d23eb290d9 | |
Matt McWilliams | 648bca5b2e | |
Matt McWilliams | 5db5d477e4 | |
Matt McWilliams | 7741134917 | |
Matt McWilliams | 3c19cd35cf | |
Matt McWilliams | 85832d18f6 | |
Matt McWilliams | 5f0da91659 | |
Matt McWilliams | e1bf69e622 | |
Matt McWilliams | d9290f7262 | |
Matt McWilliams | 81b6846261 | |
Matt McWilliams | a57519adce | |
Matt McWilliams | 02639466ee | |
Matt McWilliams | 6e2795d380 | |
Matt McWilliams | 8e35596088 | |
Matt McWilliams | 0162d012c5 | |
Matt McWilliams | 47fb673b78 | |
Matt McWilliams | f296488bc2 | |
Matt McWilliams | f5392aea9f | |
Matt McWilliams | 24b1301f9f | |
Matt McWilliams | 1290a8f324 | |
Matt McWilliams | e64277e438 | |
Matt McWilliams | c9bcb74a9f | |
Matt McWilliams | 42db1f81b8 | |
Matt McWilliams | 7222952eba | |
Matt McWilliams | 744f10c948 | |
Matt McWilliams | b50704a6a8 | |
Matt McWilliams | c152806511 | |
Matt McWilliams | 4d9454daf2 | |
Matt McWilliams | e754c65602 | |
Matt McWilliams | b672921c84 | |
Matt McWilliams | 6116ada2fd | |
Matt McWilliams | d7baa4d17b | |
Matt McWilliams | ebc5504998 | |
Matt McWilliams | c5e66a6f40 | |
Matt McWilliams | cff558ef9a | |
Matt McWilliams | 325837d93e | |
Matt McWilliams | 135540b261 | |
Matt McWilliams | 49464cd25a | |
Matt McWilliams | d0fe54b429 | |
Matt McWilliams | 2dce6f4b08 | |
Matt McWilliams | 99794d04c2 | |
Matt McWilliams | cc06655cd6 | |
Matt McWilliams | ab6f517d27 | |
Matt McWilliams | 682167db48 | |
Matt McWilliams | f127dc1128 | |
Matt McWilliams | 0b816ae8e1 | |
Matt McWilliams | c600fea4e1 | |
Matt McWilliams | 92067bdbef | |
Matt McWilliams | c181e003a3 | |
Matt McWilliams | 597137670d | |
Matt McWilliams | 3036aebbc4 | |
Matt McWilliams | cbe6477af2 | |
Matthew McWilliams | c2546d2bc5 | |
Matt McWilliams | 46be1bfd3b | |
Matt McWilliams | 1029885047 | |
Matt McWilliams | 164bde8cce | |
Matt McWilliams | 41504caac9 | |
Matt McWilliams | 9b34b4e026 | |
Matt McWilliams | 95612c1d18 | |
Matt McWilliams | 0829ec9081 | |
Matt McWilliams | ef0d246901 | |
Matt McWilliams | 622a8a7c42 | |
Matt McWilliams | 925659ba4b | |
Matt McWilliams | 20c9287ac2 | |
Matt McWilliams | 8aaa2b8940 | |
Matt McWilliams | 30bd35e21d | |
Matthew McWilliams | 0c2e39f0b2 | |
Matt McWilliams | cbd7001228 | |
Matt McWilliams | dec96ec9be | |
Matt McWilliams | 3942cd05be | |
Matt McWilliams | ee1e9c9feb | |
Matt McWilliams | fcb77232ec | |
Matt McWilliams | 1fcbec7466 | |
Matt McWilliams | 98f2c7a24a | |
Matt McWilliams | 787e6ed06e | |
Matt McWilliams | bb5b7c7897 | |
Matt McWilliams | 42b3aa767d | |
Matt McWilliams | b20a6084e6 | |
Matthew McWilliams | d9a8576701 | |
Matthew McWilliams | 69273d2a1c | |
Matthew McWilliams | 755ea757f7 | |
Matt McWilliams | 81fc54af8d | |
Matt McWilliams | 4281ca4390 | |
Matt McWilliams | 3419172535 | |
Matt McWilliams | 206c266b08 | |
Matthew McWilliams | 5026cf869f | |
Matthew McWilliams | d5ecd9e057 | |
Matthew McWilliams | 72b5077356 | |
Matthew McWilliams | 6601c030f7 | |
Matthew McWilliams | 3ec1373f08 | |
Matt McWilliams | b29478cb58 | |
Matt McWilliams | fe61e63e76 | |
Matt McWilliams | ee0ab663d7 | |
Matt McWilliams | 1964d6002d | |
Matt McWilliams | f55b72044c | |
Matt McWilliams | 3f759f5678 | |
Matt McWilliams | 6582154ec6 | |
Matt McWilliams | 9d0545aa4f | |
Matt McWilliams | ea055d6e56 | |
Matthew McWilliams | bc48765b35 | |
Matthew McWilliams | 70c2c695f0 | |
Matthew McWilliams | 8ec5816364 | |
Matthew McWilliams | c33c6e24f6 | |
Matt McWilliams | b0ca15bd8d | |
Matt McWilliams | 76799bd66d | |
Matthew McWilliams | 18dbb72a54 | |
Matthew McWilliams | c0ec81c0f9 | |
Matt McWilliams | c3661d6ff1 | |
Matt McWilliams | c0f056cd8d | |
Matt McWilliams | 2924efe39f | |
Matt McWilliams | e275539fb0 | |
Matt McWilliams | 4c13c54815 | |
Matt McWilliams | 62a66f5f6d | |
Matt McWilliams | 3a435933e3 | |
Matt McWilliams | 78f7ac0e68 | |
Matt McWilliams | 28dc19fc32 | |
Matt McWilliams | 585c47d6c7 | |
Matt McWilliams | 04a0330327 | |
Matt McWilliams | dae4e65aee | |
Matt McWilliams | 129647b863 | |
Matt McWilliams | 2f9201716a | |
Matt McWilliams | f9d716552b | |
Matt McWilliams | 818c8453ee | |
Matthew McWilliams | f7a3c52260 | |
Matt McWilliams | 9d3bf24627 | |
Matt McWilliams | c77201ef4e | |
Matt McWilliams | f585aa2a5a | |
Matt McWilliams | 96e0ce6050 | |
Matt McWilliams | 17d4ff459f | |
Matt McWilliams | c15c376a2f | |
Matt McWilliams | 22bed4632b | |
Matt McWilliams | 8b5faaa1a4 | |
Matt McWilliams | 81d94fd727 | |
Matt McWilliams | bbfe6fc657 | |
Matt McWilliams | 467a5c06d6 | |
Matt McWilliams | 9dce9fb1f2 | |
Matt McWilliams | e1c8ba1320 | |
mmcwilliams | 4ef318c55e | |
mmcwilliams | 7f7513809a | |
Matt McWilliams | b3bb07454f | |
Matt McWilliams | faad084b2b | |
Matt McWilliams | 3e528c23a5 | |
Matt McWilliams | 6fed941441 | |
Matt McWilliams | 6fee5a803c | |
Matt McWilliams | 2861bc52fd | |
Matt McWilliams | 8c14a06b96 | |
Matt McWilliams | 3e0ac3f0d0 | |
Matt McWilliams | 394fbe2323 | |
Matt McWilliams | 11267796ba | |
Matt McWilliams | aac5e5d488 | |
Matt McWilliams | 8a6bc0b4f5 | |
Matt McWilliams | a2af605d37 | |
Matt McWilliams | 32f70be614 | |
Matt McWilliams | 31c701734a | |
Matt McWilliams | fb7b1e2fb6 | |
Matt McWilliams | 5061a511ab | |
Matt McWilliams | c0121bcfe7 | |
Matt McWilliams | 66639e951b | |
Matt McWilliams | 53d147b9bc | |
Matt McWilliams | ad1ac51fc8 | |
Matt McWilliams | 88a6e9f563 | |
Matt McWilliams | 7dc4d153be | |
Matt McWilliams | dcc91501ee | |
Matt McWilliams | 6473f388d8 | |
Matt McWilliams | a21fff82f1 | |
Matt McWilliams | 2c8eabeffd | |
Matt McWilliams | 85bfa57127 | |
Matt McWilliams | 112e6b543c | |
Matt McWilliams | 232f39b861 | |
Matt McWilliams | 338a60f947 | |
Matt McWilliams | 9ab1436d49 | |
Matt McWilliams | 8d3c035e7b | |
sixteenmillimeter | 10b823bca8 | |
sixteenmillimeter | 7f9020e698 | |
sixteenmillimeter | 6a563e131b | |
dependabot[bot] | 1fb5c984ac | |
dependabot[bot] | b90a68cb39 | |
dependabot[bot] | 7ebfe16897 | |
sixteenmillimeter | e84f1ce8ff | |
sixteenmillimeter | eb7e62aac7 | |
sixteenmillimeter | dab5c67c04 | |
sixteenmillimeter | 69ca62f884 | |
dependabot[bot] | 53941835cb | |
dependabot[bot] | 7d4e53fe24 | |
sixteenmillimeter | 6f19842da0 | |
sixteenmillimeter | 3692195887 | |
sixteenmillimeter | e672c2dc93 | |
sixteenmillimeter | 65292524b1 | |
sixteenmillimeter | 5e481e77b0 | |
sixteenmillimeter | 7c9543239e | |
sixteenmillimeter | 8672b6584a | |
sixteenmillimeter | c5d7f9c91f | |
sixteenmillimeter | 9502d255c7 | |
sixteenmillimeter | 08c3c23da0 | |
sixteenmillimeter | 6eeeae85c8 | |
sixteenmillimeter | 7c61af7043 | |
sixteenmillimeter | d501623290 | |
sixteenmillimeter | 0ccb29dfb0 | |
sixteenmillimeter | f02782d4da | |
sixteenmillimeter | c2e83ab27b | |
sixteenmillimeter | 32356b0037 | |
sixteenmillimeter | dd1bec8394 | |
sixteenmillimeter | 4f2252d113 | |
sixteenmillimeter | 0145bebb4b | |
mmcwilliams | 5e6fbbb43c | |
mmcwilliams | 7e516a59b6 | |
mmcwilliams | 948b20fead | |
mmcwilliams | c61c128044 | |
mmcwilliams | 296ef93ecb | |
sixteenmillimeter | 74621ef1fb | |
sixteenmillimeter | 0811222d27 | |
sixteenmillimeter | 0c364576c9 | |
dependabot[bot] | 7ff49f0aa6 | |
dependabot[bot] | a9b678f748 | |
dependabot[bot] | f2fd77a858 | |
sixteenmillimeter | 8c97258866 | |
sixteenmillimeter | 5c691a8e12 | |
sixteenmillimeter | e5e4c7ded7 | |
sixteenmillimeter | a748f689bd | |
sixteenmillimeter | 5309f85638 | |
sixteenmillimeter | efc6d0ef03 | |
sixteenmillimeter | a379e4b086 | |
sixteenmillimeter | 4a1bf417a4 | |
mmcwilliams | b702929e1f | |
sixteenmillimeter | d042381293 | |
dependabot[bot] | 9805127387 | |
dependabot[bot] | 270862bd5f | |
sixteenmillimeter | 53e012018f | |
sixteenmillimeter | 420a3fbd50 | |
sixteenmillimeter | 5258fcbf30 | |
sixteenmillimeter | 4db3ce8b88 | |
sixteenmillimeter | e3d36a1f27 | |
sixteenmillimeter | 67d0e750c2 | |
mmcwilliams | f4eb066725 | |
mmcwilliams | fb63bade2f | |
Matt | ed0175b733 | |
mmcwilliams | 8163f7d454 | |
mmcwilliams | 5ec50713ba | |
Matt | 37719b9974 | |
sixteenmillimeter | 3fd2b04e75 | |
mmcwilliams | c15cd512ae | |
mmcwilliams | cc41b75130 | |
mmcwilliams | f929ea2cc2 | |
mmcwilliams | d4987ed3a3 | |
mmcwilliams | da00c62db3 | |
sixteenmillimeter | 55c460fbb4 | |
sixteenmillimeter | 01cac728f5 | |
sixteenmillimeter | 8d5663d3a2 | |
sixteenmillimeter | 1c940d6df7 | |
sixteenmillimeter | 891c34ad88 | |
sixteenmillimeter | aec5b79f90 | |
sixteenmillimeter | e25a8bbc7c | |
sixteenmillimeter | d70de98256 | |
sixteenmillimeter | aec3e29476 | |
sixteenmillimeter | 32fe873707 | |
sixteenmillimeter | 549cd3cc04 | |
sixteenmillimeter | 8dc955a5e7 |
|
@ -3,4 +3,10 @@
|
|||
*.Parent
|
||||
|
||||
node_modules
|
||||
dist
|
||||
dist
|
||||
|
||||
*.svd
|
||||
*debug_custom.json
|
||||
*debug.cfg
|
||||
|
||||
notes/mphd
|
|
@ -0,0 +1,9 @@
|
|||
[submodule "scad/common"]
|
||||
path = scad/common
|
||||
url = https://git.sixteenmillimeter.com/modules/common.git
|
||||
[submodule "scad/sprocketed_roller"]
|
||||
path = scad/sprocketed_roller
|
||||
url = https://git.sixteenmillimeter.com/modules/sprocketed_roller.git
|
||||
[submodule "scad/MCAD"]
|
||||
path = scad/MCAD
|
||||
url = https://github.com/openscad/MCAD.git
|
2
LICENSE
2
LICENSE
|
@ -1,4 +1,4 @@
|
|||
Copyright 2018 M McWilliams
|
||||
Copyright 2018-2021 M McWilliams
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
|
|
172
Readme.md
172
Readme.md
|
@ -1,79 +1,93 @@
|
|||
# mcopy
|
||||
|
||||
An open platform for controlling small-gauge film optical printers (16mm, Super8, 8mm).
|
||||
|
||||
-------
|
||||
1. <a href="#intro">Introduction</a>
|
||||
2. <a href="#downloads">Downloads</a>
|
||||
1. <a href="#usage">Usage</a>
|
||||
2. <a href="#software">Software</a>
|
||||
3. <a href="#firmware">Firmware</a>
|
||||
3. <a href="#hardware">Hardware</a>
|
||||
4. <a href="#why">Why?</a>
|
||||
|
||||
-------
|
||||
|
||||
## Introduction <a name="intro"></a>
|
||||
|
||||
The `mcopy` project is comprised of software and hardware for optical printers, built with re-purposed broken projectors.
|
||||
|
||||
#### Components
|
||||
|
||||
* Sequencer desktop app
|
||||
* Scripting language, called `mscript`, for orchestrating complex sequences
|
||||
* Arduino firmware for projectors, cameras, lights and existing printers
|
||||
* 3D models of parts used for modifying projectors and printers
|
||||
* Schematics for simple Arduino-based electronics
|
||||
|
||||
## Downloads <a name="downloads"></a>
|
||||
|
||||
### Latest Installers
|
||||
|
||||
* [1.4.9](https://github.com/sixteenmillimeter/mcopy/releases/tag/1.4.9) for macOS and Linux (.deb)
|
||||
|
||||
### Older Versions
|
||||
* [1.2.0](https://github.com/sixteenmillimeter/mcopy/releases/tag/1.2.0) for macOS and Linux (.deb)
|
||||
* [1.0.3](https://github.com/sixteenmillimeter/mcopy/releases/tag/1.0.3) for macOS and Linux (.deb)
|
||||
|
||||
For Windows, you can [install from source](https://github.com/sixteenmillimeter/mcopy/tree/master/app#mcopy-desktop-app) for now.
|
||||
|
||||
## Usage <a name="usage"></a>
|
||||
|
||||
The software requires your hardware to be in place before the mcopy control app is useful.
|
||||
|
||||
![mcopy app](docs/mcopy.png?raw=true "mcopy app")
|
||||
|
||||
## Software <a name="software"></a>
|
||||
|
||||
The mcopy desktop app is an Electron-based project which can be built for Linux, Windows and macOS.
|
||||
Pre-built packages will be made available for macOS, initially, with the other two target platforms to follow.
|
||||
To build the desktop app from source, see the [installation and running instructions](https://github.com/sixteenmillimeter/mcopy/tree/master/app#mcopy-desktop-app).
|
||||
The desktop software also interoperates with two related projects; the Bluetooth + Wifi capable, Raspberry Pi-based [INTVAL3](https://github.com/sixteenmillimeter/intval3) and the Arduino-based [intval2](https://github.com/sixteenmillimeter/intval2).
|
||||
|
||||
## Firmware <a name="firmware"></a>
|
||||
|
||||
This project contains Arduino formware for controlling:
|
||||
|
||||
* a projector
|
||||
* a camera (see [intval2](https://github.com/sixteenmillimeter/intval2) for more info)
|
||||
* a light
|
||||
* a projector + a camera
|
||||
* a projector + a light
|
||||
* a camera + a light
|
||||
* a camera + a projector + a light
|
||||
|
||||
Using a simple serial interface, this modular platform can be used to control DIY components, modified existing optical printers or a mixture of components.
|
||||
The desktop app can connect to multiple serial devices, so your mcopy optical printer can be built from various designs that suit your hardware tastes/needs/available parts.
|
||||
|
||||
|
||||
## Hardware <a name="hardware"></a>
|
||||
|
||||
All non-electronic hardware for this project is available as plaintext OpenSCAD files and 3D print-able .STL files.
|
||||
The hardware component of this project is aimed at modifying broken Bell & Howell projectors into USB serial-controlled projectors to be used in optical printing.
|
||||
As a secondary capability, this desktop software and firmware package can be used to replace the sequencers for early-model JK optical printers, with some modification.
|
||||
|
||||
|
||||
## Why? <a name="why"></a>
|
||||
|
||||
I'm interested in expanding the viability and access of the 16mm film format and to repurpose thre rising tide of discarded film technology.
|
||||
|
||||
# mcopy
|
||||
|
||||
An open platform for controlling small-gauge film optical printers (16mm, Super8, 8mm).
|
||||
|
||||
## [Project Home - git.sixteenmillimeter.com/16mm/mcopy](https://git.sixteenmillimeter.com/16mm/mcopy)
|
||||
|
||||
* Github Mirror - [github.com/sixteenmillimeter/mcopy](https://github.com/sixteenmillimeter/mcopy)
|
||||
* Gitlab Mirror - [gitlab.com/16mm/mcopy](https://gitlab.com/16mm/mcopy)
|
||||
|
||||
-------
|
||||
1. <a href="#intro">Introduction</a>
|
||||
2. <a href="#downloads">Downloads</a>
|
||||
1. <a href="#usage">Usage</a>
|
||||
2. <a href="#software">Software</a>
|
||||
3. <a href="#firmware">Firmware</a>
|
||||
3. <a href="#hardware">Hardware</a>
|
||||
4. <a href="#why">Why?</a>
|
||||
|
||||
-------
|
||||
|
||||
## Introduction <a name="intro"></a>
|
||||
|
||||
The `mcopy` project is comprised of software and hardware for optical printers, built with re-purposed broken projectors.
|
||||
|
||||
#### Components
|
||||
|
||||
* Sequencer desktop app
|
||||
* Scripting language, called `mscript`, for orchestrating complex sequences
|
||||
* Arduino firmware for projectors, cameras, lights and existing printers
|
||||
* 3D models of parts used for modifying projectors and printers
|
||||
* Schematics for simple Arduino-based electronics
|
||||
* Filmout feature for digitally transferring video and images to analog film
|
||||
* Interoperability with the [intval3](https://github.com/sixteenmillimeter/intval3) intervalometer
|
||||
|
||||
## Downloads <a name="downloads"></a>
|
||||
|
||||
### Latest Installers
|
||||
|
||||
* [1.6.9](https://github.com/sixteenmillimeter/mcopy/releases/tag/1.6.9) for macOS, Linux (.deb) and Windows (.msi)
|
||||
|
||||
### Older Versions
|
||||
* [1.6.7](https://github.com/sixteenmillimeter/mcopy/releases/tag/1.6.7) for macOS and Linux (.deb)
|
||||
* [1.6.4](https://github.com/sixteenmillimeter/mcopy/releases/tag/1.6.4) for macOS, Linux (.deb) and Windows (.msi)
|
||||
* [1.6.2](https://github.com/sixteenmillimeter/mcopy/releases/tag/1.6.2) for macOS
|
||||
* [1.6.1](https://github.com/sixteenmillimeter/mcopy/releases/tag/1.6.1) for macOS
|
||||
* [1.5.2](https://github.com/sixteenmillimeter/mcopy/releases/tag/1.5.2) for macOS
|
||||
* [1.4.9](https://github.com/sixteenmillimeter/mcopy/releases/tag/1.4.9) for macOS and Linux (.deb)
|
||||
* [1.2.0](https://github.com/sixteenmillimeter/mcopy/releases/tag/1.2.0) for macOS and Linux (.deb)
|
||||
* [1.0.3](https://github.com/sixteenmillimeter/mcopy/releases/tag/1.0.3) for macOS and Linux (.deb)
|
||||
|
||||
For Windows, you can [install from source](https://github.com/sixteenmillimeter/mcopy/tree/master/app#mcopy-desktop-app) for now.
|
||||
|
||||
## Usage <a name="usage"></a>
|
||||
|
||||
The software requires your hardware to be in place before the mcopy control app is useful.
|
||||
|
||||
![mcopy app](docs/mcopy.png?raw=true "mcopy app")
|
||||
|
||||
## Software <a name="software"></a>
|
||||
|
||||
The mcopy desktop app is an Electron-based project which can be built for Linux, Windows and macOS.
|
||||
Pre-built packages will be made available for macOS, initially, with the other two target platforms to follow.
|
||||
To build the desktop app from source, see the [installation and running instructions](https://github.com/sixteenmillimeter/mcopy/tree/master/app#mcopy-desktop-app).
|
||||
The desktop software also interoperates with two related projects; the Bluetooth + Wifi capable, Raspberry Pi-based [INTVAL3](https://github.com/sixteenmillimeter/intval3) and the Arduino-based [intval2](https://github.com/sixteenmillimeter/intval2).
|
||||
|
||||
## Firmware <a name="firmware"></a>
|
||||
|
||||
This project contains Arduino formware for controlling:
|
||||
|
||||
* a projector
|
||||
* a camera (see [intval2](https://github.com/sixteenmillimeter/intval2) for more info)
|
||||
* a light
|
||||
* a projector + a camera
|
||||
* a projector + a light
|
||||
* a camera + a light
|
||||
* a camera + a projector + a light
|
||||
|
||||
Using a simple serial interface, this modular platform can be used to control DIY components, modified existing optical printers or a mixture of components.
|
||||
The desktop app can connect to multiple serial devices, so your mcopy optical printer can be built from various designs that suit your hardware tastes/needs/available parts.
|
||||
|
||||
|
||||
## Hardware <a name="hardware"></a>
|
||||
|
||||
All non-electronic hardware for this project is available as plaintext OpenSCAD files and 3D print-able .STL files.
|
||||
The hardware component of this project is aimed at modifying broken Bell & Howell projectors into USB serial-controlled projectors to be used in optical printing.
|
||||
|
||||
As a secondary capability, this desktop software and firmware package can be used to replace the sequencers for early-model JK optical printers, with some modification.
|
||||
|
||||
|
||||
## Why? <a name="why"></a>
|
||||
|
||||
I'm interested in expanding the viability and access of the 16mm film format and to repurpose thre rising tide of discarded film technology.
|
||||
|
||||
|
|
|
@ -1,3 +1,6 @@
|
|||
node_modules/*
|
||||
logs/*
|
||||
data/transfer*.json
|
||||
data/transfer*.json
|
||||
.appleId*
|
||||
.applePwd*
|
||||
.appleIdentity*
|
||||
|
|
112
app/css/app.css
112
app/css/app.css
|
@ -194,8 +194,8 @@ button:focus {
|
|||
width: 66px;
|
||||
height: 66px;
|
||||
position: absolute;
|
||||
top: 7px;
|
||||
left: 7px;
|
||||
top: 14px / 2;
|
||||
left: 14px / 2;
|
||||
}
|
||||
.dial-wrapper input {
|
||||
margin-top: 94px;
|
||||
|
@ -210,10 +210,10 @@ button:focus {
|
|||
top: 0;
|
||||
bottom: 0;
|
||||
overflow: hidden;
|
||||
width: 40px;
|
||||
width: 80px / 2;
|
||||
}
|
||||
.dial-container.dial-container1 {
|
||||
left: 40px;
|
||||
left: 80px / 2;
|
||||
}
|
||||
.dial-container.dial-container1 .dial-wedge {
|
||||
transform: rotateZ(0deg);
|
||||
|
@ -227,16 +227,16 @@ button:focus {
|
|||
.dial-container.dial-container2 .dial-wedge {
|
||||
transform: rotateZ(0deg);
|
||||
border-radius: 80px 0 0 80px;
|
||||
transform-origin: 40px 40px;
|
||||
transform-origin: 80px/2 80px/2;
|
||||
}
|
||||
.dial-wedge {
|
||||
height: 80px;
|
||||
width: 40px;
|
||||
width: 80px / 2;
|
||||
}
|
||||
.dial-marker {
|
||||
border-radius: 50%;
|
||||
height: 7px;
|
||||
width: 7px;
|
||||
height: 14px / 2;
|
||||
width: 14px / 2;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: calc(50% - (14px * 2));
|
||||
|
@ -367,6 +367,7 @@ button:focus {
|
|||
float: right;
|
||||
width: 90px;
|
||||
margin-right: 60px;
|
||||
height: 32px;
|
||||
}
|
||||
#seq_stats {
|
||||
width: 40%;
|
||||
|
@ -484,6 +485,9 @@ button:focus {
|
|||
#sequence #projector_second_backward > div {
|
||||
color: #bf2e39;
|
||||
}
|
||||
#sequence #black input[type=checkbox]:checked {
|
||||
background: white;
|
||||
}
|
||||
#sequence input[type=checkbox] {
|
||||
-webkit-appearance: none;
|
||||
-moz-appearance: none;
|
||||
|
@ -500,6 +504,10 @@ button:focus {
|
|||
box-sizing: border-box;
|
||||
cursor: pointer;
|
||||
}
|
||||
#sequence input[type=checkbox].disabled {
|
||||
cursor: not-allowed;
|
||||
border-color: #646464;
|
||||
}
|
||||
#sequence .L {
|
||||
display: inline-block;
|
||||
width: 35px;
|
||||
|
@ -627,6 +635,11 @@ button:focus {
|
|||
background: #AB1A25;
|
||||
border-color: #AB1A25;
|
||||
}
|
||||
.cmd:active.capper,
|
||||
.cmd.active.capper {
|
||||
background: white;
|
||||
color: #272b30;
|
||||
}
|
||||
.cmd:active i,
|
||||
.cmd.active i {
|
||||
color: #272b30;
|
||||
|
@ -650,14 +663,44 @@ button:focus {
|
|||
::-webkit-scrollbar-thumb:window-inactive {
|
||||
background: rgba(0, 0, 0, 0.05);
|
||||
}
|
||||
#settings h4 {
|
||||
margin-bottom: 1px;
|
||||
}
|
||||
#settings > div {
|
||||
width: 300px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
#settings > div.left {
|
||||
float: left;
|
||||
padding-left: 30px;
|
||||
}
|
||||
#settings > div.right {
|
||||
float: right;
|
||||
padding-right: 30px;
|
||||
}
|
||||
#settings > div.right input[type=number] {
|
||||
min-width: 200px;
|
||||
width: 200px;
|
||||
}
|
||||
#settings > div.right input[readonly] {
|
||||
cursor: not-allowed;
|
||||
}
|
||||
#settings > div.right .spacer {
|
||||
height: 62px;
|
||||
}
|
||||
#settings > div.right .proj_time {
|
||||
height: 111px;
|
||||
}
|
||||
#settings > div.right .cam_time {
|
||||
height: 111px;
|
||||
}
|
||||
#settings > div.right > div {
|
||||
width: 270px;
|
||||
}
|
||||
#settings > div > div {
|
||||
width: 360px;
|
||||
}
|
||||
#settings input[type=text],
|
||||
#settings input[type=number],
|
||||
#settings select {
|
||||
display: block;
|
||||
border-radius: 5px;
|
||||
|
@ -672,33 +715,43 @@ button:focus {
|
|||
padding: 6px 12px;
|
||||
font-size: 21px;
|
||||
min-width: 300px;
|
||||
max-width: 300px;
|
||||
}
|
||||
#settings input[type=text] span,
|
||||
#settings input[type=number] span,
|
||||
#settings select span {
|
||||
display: block;
|
||||
font-size: 16px;
|
||||
font-weight: 200;
|
||||
}
|
||||
#settings input[type=text]:active,
|
||||
#settings input[type=number]:active,
|
||||
#settings select:active,
|
||||
#settings input[type=text] .active,
|
||||
#settings input[type=number] .active,
|
||||
#settings select .active {
|
||||
background: #fff;
|
||||
color: #272b30;
|
||||
outline: none;
|
||||
}
|
||||
#settings input[type=text]:focus,
|
||||
#settings input[type=number]:focus,
|
||||
#settings select:focus {
|
||||
outline: none;
|
||||
}
|
||||
#settings input[type=text].active,
|
||||
#settings input[type=number].active,
|
||||
#settings select.active {
|
||||
border-color: #DAE035;
|
||||
color: #DAE035;
|
||||
}
|
||||
#settings input[type=text] {
|
||||
width: 200px;
|
||||
}
|
||||
#settings button {
|
||||
margin-top: -1px;
|
||||
margin-top: 0px;
|
||||
float: right;
|
||||
padding: 8px 16px 9px;
|
||||
}
|
||||
#settings input[type=radio] {
|
||||
float: right;
|
||||
|
@ -707,6 +760,17 @@ button:focus {
|
|||
#settings .spacer {
|
||||
margin-top: 10px;
|
||||
}
|
||||
#settings #version {
|
||||
position: absolute;
|
||||
right: 20px;
|
||||
bottom: 10px;
|
||||
z-index: 1000;
|
||||
height: 14px;
|
||||
width: auto;
|
||||
font-size: 14px;
|
||||
line-height: 14px;
|
||||
color: #999;
|
||||
}
|
||||
.cm-s-monokai.CodeMirror {
|
||||
background: #272b30 !important;
|
||||
}
|
||||
|
@ -795,9 +859,11 @@ button:focus {
|
|||
}
|
||||
#path_bar select {
|
||||
line-height: 41px;
|
||||
height: 41px;
|
||||
height: 37px;
|
||||
margin-right: 5px;
|
||||
float: right;
|
||||
box-sizing: content-box;
|
||||
padding: 0 0 0 8px;
|
||||
}
|
||||
#filmout_monitor {
|
||||
display: none;
|
||||
|
@ -837,20 +903,22 @@ button:focus {
|
|||
#filmout_position_wrap input {
|
||||
margin-right: 5px;
|
||||
margin-left: 5px;
|
||||
width: 308px !important;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
#filmout_position_wrap button,
|
||||
#filmout_position_wrap input {
|
||||
float: left;
|
||||
}
|
||||
#filmout_position_wrap > div {
|
||||
width: 410px;
|
||||
width: 425px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
#filmout_functions {
|
||||
padding-top: 5px;
|
||||
}
|
||||
#filmout_functions > div {
|
||||
width: 410px;
|
||||
width: 425px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
#filmout_stats_video,
|
||||
|
@ -872,6 +940,12 @@ button:focus {
|
|||
#filmout_stats_monitor {
|
||||
right: 5px;
|
||||
}
|
||||
.hide {
|
||||
display: none;
|
||||
}
|
||||
.show {
|
||||
display: block;
|
||||
}
|
||||
#screens {
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
@ -1124,19 +1198,23 @@ button:focus {
|
|||
float: right;
|
||||
}
|
||||
.cam2,
|
||||
.proj2 {
|
||||
.proj2,
|
||||
.black {
|
||||
display: none;
|
||||
}
|
||||
.cam2 > *,
|
||||
.proj2 > * {
|
||||
.proj2 > *,
|
||||
.black > * {
|
||||
visibility: hidden;
|
||||
}
|
||||
.cam2.on,
|
||||
.proj2.on {
|
||||
.proj2.on,
|
||||
.black.on {
|
||||
display: block;
|
||||
}
|
||||
.cam2.on > *,
|
||||
.proj2.on > * {
|
||||
.proj2.on > *,
|
||||
.black.on > * {
|
||||
visibility: visible;
|
||||
}
|
||||
#overlay {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"version": "1.5.0",
|
||||
"version": "1.8.104",
|
||||
"ext_port": 1111,
|
||||
"profiles": {
|
||||
"mcopy": {
|
||||
|
@ -15,8 +15,8 @@
|
|||
"momentary": 0
|
||||
},
|
||||
"black": {
|
||||
"before": 0,
|
||||
"after": 0
|
||||
"before": 100,
|
||||
"after": 100
|
||||
},
|
||||
"light": false
|
||||
},
|
||||
|
@ -87,6 +87,20 @@
|
|||
"delay": 50,
|
||||
"momentary": 130
|
||||
},
|
||||
"proj": {
|
||||
"time": 1340,
|
||||
"delay": 50,
|
||||
"momentary": 300
|
||||
},
|
||||
"light": false
|
||||
},
|
||||
"norris": {
|
||||
"label": "Norris",
|
||||
"cam": {
|
||||
"time": 650,
|
||||
"delay": 50,
|
||||
"momentary": 130
|
||||
},
|
||||
"light": false
|
||||
}
|
||||
},
|
||||
|
@ -164,7 +178,20 @@
|
|||
"cameras": "4",
|
||||
"camera_projectors_identifier": "5",
|
||||
"cameras_projector_identifier": "6",
|
||||
"cameras_projectors_identifier": "7"
|
||||
"cameras_projectors_identifier": "7",
|
||||
"capper_identifier": "C",
|
||||
"camera_capper_identifier": "8",
|
||||
"camera_capper_projector_identifier": "9",
|
||||
"camera_capper_projectors_identifier": "0",
|
||||
"capper_on": "A",
|
||||
"capper_off": "B",
|
||||
"takeup_forward": "D",
|
||||
"takeup_backward": "F",
|
||||
"error": "E",
|
||||
"camera_exposure": "G",
|
||||
"state": "H",
|
||||
"home": "I",
|
||||
"offset": "O"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,6 +13,16 @@
|
|||
body.meter {
|
||||
background: rgb(117, 117, 117);
|
||||
}
|
||||
body.meter #img,
|
||||
body.meter #can {
|
||||
display: none;
|
||||
}
|
||||
body.image #can{
|
||||
display: none;
|
||||
}
|
||||
body.image #img {
|
||||
display: block;
|
||||
}
|
||||
#img {
|
||||
position: absolute;
|
||||
/*background-image: url(".../img/background.jpg");*/
|
||||
|
@ -46,32 +56,48 @@
|
|||
</canvas>
|
||||
<script>
|
||||
'use strict';
|
||||
const { remote, ipcRenderer } = require('electron')
|
||||
|
||||
const { ipcRenderer } = require('electron')
|
||||
const remote = require('@electron/remote')
|
||||
let imgTmp;
|
||||
function delay (ms) {
|
||||
return new Promise((resolve) => {
|
||||
return setTimeout(resolve, ms)
|
||||
})
|
||||
}
|
||||
async function setImage (src) {
|
||||
return new Promise(async (resolve, reject) => {
|
||||
//let img = new Image()
|
||||
imgTmp = new Image()
|
||||
let img = document.getElementById('img')
|
||||
let body = document.querySelector('body')
|
||||
if (body.classList.contains('meter')) {
|
||||
body.classList.remove('meter')
|
||||
body.className = ''
|
||||
body.classList.add('image')
|
||||
imgTmp.onload = function () {
|
||||
img.style.backgroundImage = `url('${src}')`
|
||||
return resolve(src)
|
||||
}
|
||||
imgTmp.src = src
|
||||
})
|
||||
}
|
||||
|
||||
img.style.backgroundImage = `url('${src}')`;
|
||||
});
|
||||
function setBlank () {
|
||||
let img = document.getElementById('img')
|
||||
img.style.background = ''
|
||||
img.style.backgroundUrl = ''
|
||||
img.style.backgroundColor = 'black'
|
||||
}
|
||||
async function onMeter () {
|
||||
console.log('meter')
|
||||
const body = document.querySelector('body')
|
||||
if (!body.classList.contains('meter')) {
|
||||
body.classList.add('meter')
|
||||
}
|
||||
body.className = ''
|
||||
body.classList.add('meter')
|
||||
}
|
||||
async function onFocus () {
|
||||
console.log('focus')
|
||||
const can = document.getElementById('can')
|
||||
const dpr = window.devicePixelRatio || 1
|
||||
const body = document.querySelector('body')
|
||||
let ctx;
|
||||
body.className = ''
|
||||
if (!can.classList.contains('show')) {
|
||||
can.classList.add('show')
|
||||
}
|
||||
|
@ -104,7 +130,7 @@
|
|||
//console.log(`o: ${opp}`)
|
||||
|
||||
for (let i = 0; i < count; i++) {
|
||||
ctx.beginPath()
|
||||
ctx.beginPath()
|
||||
ctx.moveTo(w / 2, h / 2)
|
||||
ctx.lineTo((w / 2) + opp, longest)
|
||||
ctx.lineTo((w / 2) - opp, longest)
|
||||
|
@ -119,7 +145,9 @@
|
|||
const can = document.getElementById('can')
|
||||
const dpr = window.devicePixelRatio || 1
|
||||
const screen = window.outerWidth / window.outerHeight
|
||||
let ctx;
|
||||
const body = document.querySelector('body')
|
||||
let ctx
|
||||
body.className = ''
|
||||
if (!can.classList.contains('show')) {
|
||||
can.classList.add('show')
|
||||
}
|
||||
|
@ -128,7 +156,7 @@
|
|||
can.width = (window.innerHeight * arg.ratio) * dpr
|
||||
can.height = window.innerHeight * dpr
|
||||
} else {
|
||||
can.width =window.innerWidth * dpr
|
||||
can.width = window.innerWidth * dpr
|
||||
can.height = (window.innerWidth / arg.ratio) * dpr
|
||||
}
|
||||
} else {
|
||||
|
@ -142,7 +170,7 @@
|
|||
can.style.width = `${window.innerHeight * arg.ratio}px`
|
||||
can.style.height = `${window.innerHeight}px`
|
||||
} else {
|
||||
can.style.width = `${window.inneWidth}px`
|
||||
can.style.width = `${window.innerWidth}px`
|
||||
can.style.height = `${window.innerWidth / arg.ratio}px`
|
||||
}
|
||||
} else {
|
||||
|
@ -205,17 +233,28 @@
|
|||
}
|
||||
async function onDigital (event, arg) {
|
||||
if (arg.src) {
|
||||
if (arg.exposure) {
|
||||
setBlank()
|
||||
await delay(10)
|
||||
}
|
||||
try {
|
||||
await setImage(arg.src)
|
||||
await setImage(arg.src)
|
||||
} catch (err) {
|
||||
console.error(err)
|
||||
}
|
||||
if (arg.exposure) {
|
||||
await delay(arg.exposure)
|
||||
setBlank()
|
||||
}
|
||||
ipcRenderer.send('display_load', { src : arg.src })
|
||||
}
|
||||
return event.returnValue = true
|
||||
}
|
||||
|
||||
async function onEscape (evt) {
|
||||
let isEscape = false
|
||||
let win
|
||||
|
||||
evt = evt || window.event
|
||||
|
||||
if ('key' in evt) {
|
||||
|
@ -223,6 +262,7 @@
|
|||
} else {
|
||||
isEscape = (evt.keyCode == 27)
|
||||
}
|
||||
|
||||
if (isEscape) {
|
||||
win = remote.getCurrentWindow()
|
||||
win.close()
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.security.cs.allow-jit</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.debugger</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
|
@ -45,6 +45,8 @@
|
|||
<div id="camera_second_backward" class="row cam2" y="2"></div>
|
||||
<div id="projector_backward" class="row" y="1"></div>
|
||||
<div id="projector_second_backward" class="row proj2" y="3"></div>
|
||||
|
||||
<div id="black" class="row black"></div>
|
||||
|
||||
<div id="light_set" class="row spacer"></div>
|
||||
<div id="numbers" class="row"></div>
|
||||
|
@ -60,6 +62,8 @@
|
|||
<div><span>PROJ </span><i class="fa fa-minus"></i></div>
|
||||
<div class="proj2"><span>PROJ2 </span><i class="fa fa-minus"></i></div>
|
||||
|
||||
<div class="black"><span>BLANK </span><i class="fa fa-times"></i></div>
|
||||
|
||||
<div class="spacer"><span>LIGHT</span></div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -144,20 +148,34 @@
|
|||
<i class="fa fa-step-backward"></i>
|
||||
</button>
|
||||
</div>
|
||||
<div>
|
||||
<div class="hide">
|
||||
<button id="cmd_black_forward" onclick="cmd.black_forward();" class="cmd fwd">
|
||||
<i class="fa fa-times-circle"></i>
|
||||
BLANK +1
|
||||
<i class="fa fa-step-forward"></i>
|
||||
</button>
|
||||
</div>
|
||||
<div>
|
||||
<div class="hide">
|
||||
<button id="cmd_black_backward" onclick="cmd.black_backward();" class="cmd bwd">
|
||||
<i class="fa fa-times-circle"></i>
|
||||
BLANK -1
|
||||
<i class="fa fa-step-backward"></i>
|
||||
</button>
|
||||
</div>
|
||||
<div class="hide">
|
||||
<button id="cmd_capper_on" onclick="cmd.capper_on();" class="cmd capper">
|
||||
<i class="fa fa-times-circle"></i>
|
||||
CAPPER ON
|
||||
<i class="fa fa-eye"></i>
|
||||
</button>
|
||||
</div>
|
||||
<div class="hide">
|
||||
<button id="cmd_capper_off" onclick="cmd.capper_off();" class="cmd capper active">
|
||||
<i class="fa fa-eye"></i>
|
||||
CAPPER OFF
|
||||
<i class="fa fa-eye"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div>
|
||||
|
@ -389,7 +407,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<div id="settings" class="screen">
|
||||
<div>
|
||||
<div class="left">
|
||||
<div>
|
||||
<h4>Devices</h4>
|
||||
<select id="devices">
|
||||
|
@ -419,6 +437,13 @@
|
|||
<input type="text" id="intval" name="intval" placeholder="INTVAL3 URL"/>
|
||||
<input type="radio" id="camera_type_intval" name="camera_type" value="intval" onclick="devices.intval();" />
|
||||
</div>
|
||||
<div class="spacer">
|
||||
<input type="text" id="processing" name="processing" placeholder="PROCESSING URL" />
|
||||
<input type="radio" id="camera_type_processing" name="camera_type" value="processing" onclick="devices.processing();" />
|
||||
</div>
|
||||
<div>
|
||||
<div id="version"></div>
|
||||
</div>
|
||||
<div>
|
||||
<h4>Light</h4>
|
||||
<select id="light_device">
|
||||
|
@ -432,6 +457,19 @@
|
|||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right">
|
||||
<div class="spacer"></div>
|
||||
<div class="proj_time">
|
||||
<h4>Projector Time (ms)</h4>
|
||||
<input type="number" readonly id="proj_time" value="0" />
|
||||
<button id="submit_proj_time" class="hide">✓</button>
|
||||
</div>
|
||||
<div class="cam_time">
|
||||
<h4>Camera Time (ms)</h4>
|
||||
<input type="number" readonly id="cam_time" value="0" />
|
||||
<button id="submit_cam_time" class="hide" onclick="cam.exposure($('#cam_time').val());">✓</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="overlay" onclick="gui.overlay(false);gui.spinner(false);"></div>
|
||||
|
|
|
@ -2474,8 +2474,9 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
!function(a,b){"object"==typeof exports?module.exports=b():"function"==typeof define&&define.amd?define(b):a.Spinner=b()}(this,function(){"use strict";function a(a,b){var c,d=document.createElement(a||"div");for(c in b)d[c]=b[c];return d}function b(a){for(var b=1,c=arguments.length;c>b;b++)a.appendChild(arguments[b]);return a}function c(a,b,c,d){var e=["opacity",b,~~(100*a),c,d].join("-"),f=.01+c/d*100,g=Math.max(1-(1-a)/b*(100-f),a),h=j.substring(0,j.indexOf("Animation")).toLowerCase(),i=h&&"-"+h+"-"||"";return l[e]||(m.insertRule("@"+i+"keyframes "+e+"{0%{opacity:"+g+"}"+f+"%{opacity:"+a+"}"+(f+.01)+"%{opacity:1}"+(f+b)%100+"%{opacity:"+a+"}100%{opacity:"+g+"}}",m.cssRules.length),l[e]=1),e}function d(a,b){var c,d,e=a.style;for(b=b.charAt(0).toUpperCase()+b.slice(1),d=0;d<k.length;d++)if(c=k[d]+b,void 0!==e[c])return c;return void 0!==e[b]?b:void 0}function e(a,b){for(var c in b)a.style[d(a,c)||c]=b[c];return a}function f(a){for(var b=1;b<arguments.length;b++){var c=arguments[b];for(var d in c)void 0===a[d]&&(a[d]=c[d])}return a}function g(a,b){return"string"==typeof a?a:a[b%a.length]}function h(a){this.opts=f(a||{},h.defaults,n)}function i(){function c(b,c){return a("<"+b+' xmlns="urn:schemas-microsoft.com:vml" class="spin-vml">',c)}m.addRule(".spin-vml","behavior:url(#default#VML)"),h.prototype.lines=function(a,d){function f(){return e(c("group",{coordsize:k+" "+k,coordorigin:-j+" "+-j}),{width:k,height:k})}function h(a,h,i){b(m,b(e(f(),{rotation:360/d.lines*a+"deg",left:~~h}),b(e(c("roundrect",{arcsize:d.corners}),{width:j,height:d.width,left:d.radius,top:-d.width>>1,filter:i}),c("fill",{color:g(d.color,a),opacity:d.opacity}),c("stroke",{opacity:0}))))}var i,j=d.length+d.width,k=2*j,l=2*-(d.width+d.length)+"px",m=e(f(),{position:"absolute",top:l,left:l});if(d.shadow)for(i=1;i<=d.lines;i++)h(i,-2,"progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)");for(i=1;i<=d.lines;i++)h(i);return b(a,m)},h.prototype.opacity=function(a,b,c,d){var e=a.firstChild;d=d.shadow&&d.lines||0,e&&b+d<e.childNodes.length&&(e=e.childNodes[b+d],e=e&&e.firstChild,e=e&&e.firstChild,e&&(e.opacity=c))}}var j,k=["webkit","Moz","ms","O"],l={},m=function(){var c=a("style",{type:"text/css"});return b(document.getElementsByTagName("head")[0],c),c.sheet||c.styleSheet}(),n={lines:12,length:7,width:5,radius:10,rotate:0,corners:1,color:"#000",direction:1,speed:1,trail:100,opacity:.25,fps:20,zIndex:2e9,className:"spinner",top:"50%",left:"50%",position:"absolute"};h.defaults={},f(h.prototype,{spin:function(b){this.stop();{var c=this,d=c.opts,f=c.el=e(a(0,{className:d.className}),{position:d.position,width:0,zIndex:d.zIndex});d.radius+d.length+d.width}if(e(f,{left:d.left,top:d.top}),b&&b.insertBefore(f,b.firstChild||null),f.setAttribute("role","progressbar"),c.lines(f,c.opts),!j){var g,h=0,i=(d.lines-1)*(1-d.direction)/2,k=d.fps,l=k/d.speed,m=(1-d.opacity)/(l*d.trail/100),n=l/d.lines;!function o(){h++;for(var a=0;a<d.lines;a++)g=Math.max(1-(h+(d.lines-a)*n)%l*m,d.opacity),c.opacity(f,a*d.direction+i,g,d);c.timeout=c.el&&setTimeout(o,~~(1e3/k))}()}return c},stop:function(){var a=this.el;return a&&(clearTimeout(this.timeout),a.parentNode&&a.parentNode.removeChild(a),this.el=void 0),this},lines:function(d,f){function h(b,c){return e(a(),{position:"absolute",width:f.length+f.width+"px",height:f.width+"px",background:b,boxShadow:c,transformOrigin:"left",transform:"rotate("+~~(360/f.lines*k+f.rotate)+"deg) translate("+f.radius+"px,0)",borderRadius:(f.corners*f.width>>1)+"px"})}for(var i,k=0,l=(f.lines-1)*(1-f.direction)/2;k<f.lines;k++)i=e(a(),{position:"absolute",top:1+~(f.width/2)+"px",transform:f.hwaccel?"translate3d(0,0,0)":"",opacity:f.opacity,animation:j&&c(f.opacity,f.trail,l+k*f.direction,f.lines)+" "+1/f.speed+"s linear infinite"}),f.shadow&&b(i,e(h("#000","0 0 4px #000"),{top:"2px"})),b(d,b(i,h(g(f.color,k),"0 0 1px rgba(0,0,0,.1)")));return d},opacity:function(a,b,c){b<a.childNodes.length&&(a.childNodes[b].style.opacity=c)}});var o=e(a("group"),{behavior:"url(#default#VML)"});return!d(o,"transform")&&o.adj?i():j=d(o,"animation"),h});
|
||||
const mcopy = {};
|
||||
|
||||
const { remote, ipcRenderer } = require('electron');
|
||||
const dialog = require('electron').remote.dialog;
|
||||
const remote = require('@electron/remote');
|
||||
const { ipcRenderer } = require('electron');
|
||||
const { dialog } = remote;
|
||||
const notifier = require('node-notifier');
|
||||
const fs = require('fs');
|
||||
const uuid = require('uuid').v4;
|
||||
|
@ -2495,8 +2496,12 @@ const cmd = require('./lib/ui/cmd.js');
|
|||
const devices = require('./lib/ui/devices.js');
|
||||
const filmout = require('./lib/ui/filmout.js');
|
||||
const mse = require('./lib/ui/mscript.js');
|
||||
const capper = require('./lib/ui/capper.js');
|
||||
const timing = require('./lib/ui/timing.js');
|
||||
const Mscript = require('./lib/mscript');
|
||||
const { delay } = require('./lib/delay');
|
||||
const alertObj = require('./lib/ui/alert.js');
|
||||
|
||||
let log;
|
||||
|
||||
/******
|
||||
|
@ -2513,6 +2518,7 @@ async function init () {
|
|||
log = await require('log')({})
|
||||
|
||||
nav.init();
|
||||
gui.init();
|
||||
grid.init();
|
||||
mse.mscript.init();
|
||||
mse.console.init();
|
||||
|
@ -2523,4 +2529,7 @@ async function init () {
|
|||
proj.init();
|
||||
cam.init();
|
||||
seq.init();
|
||||
capper.init();
|
||||
alertObj.init();
|
||||
timing.init();
|
||||
};
|
|
@ -10,6 +10,13 @@
|
|||
@import "./mscript.less";
|
||||
@import "./filmout.less";
|
||||
|
||||
.hide {
|
||||
display: none;
|
||||
}
|
||||
.show {
|
||||
display: block;
|
||||
}
|
||||
|
||||
#screens{
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
@ -168,7 +175,8 @@
|
|||
}
|
||||
|
||||
.cam2,
|
||||
.proj2{
|
||||
.proj2,
|
||||
.black{
|
||||
display : none;
|
||||
> * {
|
||||
visibility: hidden;
|
||||
|
|
|
@ -42,6 +42,10 @@
|
|||
background: @BACKWARD;
|
||||
border-color: @BACKWARD;
|
||||
}
|
||||
&.capper{
|
||||
background: white;
|
||||
color: @BG;
|
||||
}
|
||||
i{
|
||||
color: @BG;
|
||||
}
|
||||
|
|
|
@ -27,9 +27,11 @@
|
|||
}
|
||||
select{
|
||||
line-height: 41px;
|
||||
height: 41px;
|
||||
height: 37px;
|
||||
margin-right: 5px;
|
||||
float: right;
|
||||
box-sizing: content-box;
|
||||
padding: 0 0 0 8px;
|
||||
}
|
||||
}
|
||||
#filmout_file {
|
||||
|
@ -73,12 +75,14 @@
|
|||
input{
|
||||
margin-right: 5px;
|
||||
margin-left: 5px;
|
||||
width: 308px !important;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
button, input{
|
||||
float: left;
|
||||
}
|
||||
> div{
|
||||
width: 410px;
|
||||
width: 425px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
}
|
||||
|
@ -86,7 +90,7 @@
|
|||
#filmout_functions{
|
||||
padding-top: 5px;
|
||||
> div{
|
||||
width: 410px;
|
||||
width: 425px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
float: right;
|
||||
width: 90px;
|
||||
margin-right: 60px;
|
||||
height: 32px;
|
||||
}
|
||||
}
|
||||
#seq_stats{
|
||||
|
@ -126,6 +127,13 @@
|
|||
color: @BACKWARD + @SECOND;
|
||||
}
|
||||
}
|
||||
#black{
|
||||
input[type=checkbox]{
|
||||
&:checked{
|
||||
background: white;
|
||||
}
|
||||
}
|
||||
}
|
||||
input[type=checkbox]{
|
||||
-webkit-appearance: none;
|
||||
-moz-appearance: none;
|
||||
|
@ -141,6 +149,10 @@
|
|||
display: inline-block;
|
||||
box-sizing: border-box;
|
||||
cursor: pointer;
|
||||
&.disabled{
|
||||
cursor: not-allowed;
|
||||
border-color: rgb(100, 100, 100);
|
||||
}
|
||||
}
|
||||
.L{
|
||||
display: inline-block;
|
||||
|
|
|
@ -1,25 +1,61 @@
|
|||
#settings{
|
||||
h4{
|
||||
margin-bottom: 1px;
|
||||
}
|
||||
> div{
|
||||
width: 300px;
|
||||
margin: 0 auto;
|
||||
&.left{
|
||||
float: left;
|
||||
padding-left: 30px;
|
||||
}
|
||||
&.right{
|
||||
float: right;
|
||||
padding-right: 30px;
|
||||
input[type=number] {
|
||||
min-width: 200px;
|
||||
width: 200px;
|
||||
}
|
||||
input[readonly]{
|
||||
cursor: not-allowed;
|
||||
}
|
||||
.spacer{
|
||||
height: 62px;
|
||||
}
|
||||
.proj_time{
|
||||
height: 111px;
|
||||
}
|
||||
.cam_time{
|
||||
height: 111px;
|
||||
}
|
||||
& > div {
|
||||
width: 270px;
|
||||
}
|
||||
}
|
||||
}
|
||||
> div > div{
|
||||
width: 360px;
|
||||
}
|
||||
input[type=text], select{
|
||||
input[type=text],
|
||||
input[type=number],
|
||||
select{
|
||||
.button();
|
||||
display: inline-block;
|
||||
padding: 6px 12px;
|
||||
font-size: 21px;
|
||||
min-width: 300px;
|
||||
max-width: 300px;
|
||||
&.active{
|
||||
border-color: @SELECTED;
|
||||
color: @SELECTED;
|
||||
}
|
||||
}
|
||||
input[type=text]{
|
||||
width: 200px;
|
||||
}
|
||||
button{
|
||||
margin-top: -1px;
|
||||
float: right;
|
||||
margin-top: 0px;
|
||||
float: right;
|
||||
padding: 8px 16px 9px;
|
||||
}
|
||||
input[type=radio]{
|
||||
float: right;
|
||||
|
@ -28,4 +64,15 @@
|
|||
.spacer{
|
||||
margin-top: 10px;
|
||||
}
|
||||
#version{
|
||||
position: absolute;
|
||||
right: 20px;
|
||||
bottom: 10px;
|
||||
z-index: 1000;
|
||||
height: 14px;
|
||||
width: auto;
|
||||
font-size: 14px;
|
||||
line-height: 14px;
|
||||
color: #999;
|
||||
}
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
export {};
|
|
@ -0,0 +1,58 @@
|
|||
'use strict';
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
/* class representing alert functionality */
|
||||
class Alert {
|
||||
constructor(ui) {
|
||||
this.id = 'alert';
|
||||
this.cb = null;
|
||||
this.ui = ui;
|
||||
this.init();
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
async init() {
|
||||
const Log = require('log');
|
||||
this.log = await Log({ label: this.id });
|
||||
this.ipc = require('electron').ipcMain;
|
||||
this.listen();
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
listen() {
|
||||
this.ipc.on(this.id, this.listener.bind(this));
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
async listener(event, arg) {
|
||||
if (this.cb !== null) {
|
||||
try {
|
||||
await this.cb(arg.state, arg.id);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err);
|
||||
}
|
||||
}
|
||||
event.returnValue = true;
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
async start(cmd) {
|
||||
const start = +new Date();
|
||||
const msg = (cmd + '').replace('ALERT', '').replace('Alert', '').replace('alert', '').trim();
|
||||
this.ui.send(this.id, { msg });
|
||||
return new Promise(function (resolve, reject) {
|
||||
this.cb = function () {
|
||||
const ms = (+new Date()) - start;
|
||||
return resolve(ms);
|
||||
};
|
||||
}.bind(this));
|
||||
}
|
||||
}
|
||||
module.exports = function (ui) {
|
||||
return new Alert(ui);
|
||||
};
|
||||
//# sourceMappingURL=index.js.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/alert/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAIb,4CAA4C;AAE5C,MAAM,KAAK;IAOV,YAAc,EAAQ;QAJd,OAAE,GAAY,OAAO,CAAA;QACrB,OAAE,GAAc,IAAI,CAAA;QAI3B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;QACZ,IAAI,CAAC,IAAI,EAAE,CAAA;IACZ,CAAC;IAED;;QAEI;IACI,KAAK,CAAC,IAAI;QACjB,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;QAC1B,IAAI,CAAC,GAAG,GAAG,MAAM,GAAG,CAAC,EAAE,KAAK,EAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;QACzC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAA;QACtC,IAAI,CAAC,MAAM,EAAE,CAAA;IACd,CAAC;IAED;;QAEI;IACI,MAAM;QACb,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IAC/C,CAAC;IAED;;QAEI;IACI,KAAK,CAAC,QAAQ,CAAE,KAAW,EAAE,GAAS;QAC7C,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,EAAE;YACrB,IAAI;gBACH,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA;aAChC;YAAC,OAAO,GAAG,EAAE;gBACb,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;aACnB;SACD;QACD,KAAK,CAAC,WAAW,GAAG,IAAI,CAAA;IACzB,CAAC;IAED;;QAEI;IACG,KAAK,CAAC,KAAK,CAAE,GAAY;QAC/B,MAAM,KAAK,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAY,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QACrG,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;QAC9B,OAAO,IAAI,OAAO,CAAC,UAAU,OAAkB,EAAE,MAAiB;YACjE,IAAI,CAAC,EAAE,GAAG;gBACT,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC;gBACjC,OAAO,OAAO,CAAC,EAAE,CAAC,CAAC;YACpB,CAAC,CAAA;QACF,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACf,CAAC;CACD;AAED,MAAM,CAAC,OAAO,GAAG,UAAU,EAAQ;IAClC,OAAO,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC;AACtB,CAAC,CAAA"}
|
|
@ -0,0 +1 @@
|
|||
export {};
|
|
@ -1,11 +1,23 @@
|
|||
'use strict';
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
/**
|
||||
* 2023-07-16 Clarification
|
||||
*
|
||||
* Previous versions of this script intermingled and even
|
||||
* swapped the usage of the terms 'serial' and 'device'.
|
||||
* From here on out, the terms will be used as such:
|
||||
*
|
||||
* serial - a hardware address of a serial port
|
||||
* device - common name of a type of mcopy device (eg. camera,
|
||||
* projector, light) that is aliased to a serial port
|
||||
*
|
||||
**/
|
||||
//import Log = require('log');
|
||||
const delay_1 = require("delay");
|
||||
const SerialPort = require('serialport');
|
||||
const Readline = SerialPort.parsers.Readline;
|
||||
const { SerialPort } = require('serialport');
|
||||
const { ReadlineParser } = require('@serialport/parser-readline');
|
||||
const exec = require('child_process').exec;
|
||||
const parser = new Readline('');
|
||||
const parser = new ReadlineParser({ delimiter: '\r\n' });
|
||||
const newlineRe = new RegExp('\n', 'g');
|
||||
const returnRe = new RegExp('\r', 'g');
|
||||
let eventEmitter;
|
||||
|
@ -25,20 +37,30 @@ const KNOWN = [
|
|||
* Class representing the arduino communication features
|
||||
**/
|
||||
class Arduino {
|
||||
constructor() {
|
||||
constructor(errorState) {
|
||||
this.path = {};
|
||||
this.known = KNOWN;
|
||||
this.alias = {};
|
||||
this.serial = { connect: {}, projector: {}, camera: {}, light: {} };
|
||||
this.serial = {};
|
||||
this.hasState = {};
|
||||
this.baud = 57600;
|
||||
this.queue = {};
|
||||
this.timer = 0;
|
||||
this.lock = false;
|
||||
this.locks = {};
|
||||
this.stateStr = {};
|
||||
this.errorState = errorState;
|
||||
this.init();
|
||||
}
|
||||
async init() {
|
||||
const Log = require('log');
|
||||
this.log = await Log({ label: 'arduino' });
|
||||
this.keys = Object.keys(cfg.arduino.cmd);
|
||||
this.values = this.keys.map(key => cfg.arduino.cmd[key]);
|
||||
}
|
||||
/**
|
||||
* Enumerate all connected devices that might be Arduinos
|
||||
*
|
||||
* @async
|
||||
* @returns {Promise} Resolves after enumerating
|
||||
**/
|
||||
async enumerate() {
|
||||
|
@ -50,6 +72,8 @@ class Arduino {
|
|||
catch (err) {
|
||||
throw err;
|
||||
}
|
||||
this.log.info('Available ports:');
|
||||
this.log.info(ports.map((port) => { return port.path; }).join(','));
|
||||
ports.forEach((port) => {
|
||||
if (this.known.indexOf(port.path) !== -1) {
|
||||
matches.push(port.path);
|
||||
|
@ -77,62 +101,146 @@ class Arduino {
|
|||
/**
|
||||
* Send a command to an Arduino using async/await
|
||||
*
|
||||
* @param {string} device Arduino identifier
|
||||
* @param {string} device The Arduino device identifier
|
||||
* @param {string} cmd Single character command to send
|
||||
*
|
||||
* @async
|
||||
* @returns {Promise} Resolves after sending
|
||||
**/
|
||||
async sendAsync(device, cmd) {
|
||||
return new Promise((resolve, reject) => {
|
||||
this.log.info(`sendAsync ${cmd} -> ${device}`);
|
||||
this.queue[cmd] = (ms) => {
|
||||
return resolve(ms);
|
||||
};
|
||||
return this.serial[device].write(cmd, (err, results) => {
|
||||
this.log.info(`Device: ${device}`);
|
||||
return this.serial[this.alias[device]].write(cmd, (err, results) => {
|
||||
if (err) {
|
||||
//console.error(err)
|
||||
//this.log.error(err)
|
||||
return reject(err);
|
||||
}
|
||||
//
|
||||
});
|
||||
});
|
||||
}
|
||||
async send(serial, cmd) {
|
||||
const device = this.alias[serial];
|
||||
let results;
|
||||
if (this.locks[serial]) {
|
||||
return false;
|
||||
/**
|
||||
* Sends a command to the specified Arduino and waits for a response.
|
||||
* Handles the communication lock to prevent sending multiple commands simultaneously.
|
||||
* Emits an 'arduino_send' event after successfully sending the command.
|
||||
*
|
||||
* @async
|
||||
* @param {string} device - The Arduino device identifier.
|
||||
* @param {string} cmd - The command to be sent to the Arduino.
|
||||
* @returns {Promise<boolean|string>} Returns 'false' if the communication is locked, otherwise returns the response from the device.
|
||||
* @throws {Error} Throws an error if the sendAsync method encounters an error.
|
||||
**/
|
||||
async send(device, cmd) {
|
||||
const serial = this.alias[device];
|
||||
let ms;
|
||||
this.log.info(`send ${cmd} -> ${device}`);
|
||||
if (this.isLocked(serial)) {
|
||||
this.log.warn(`send Serial ${serial} is locked`);
|
||||
return null;
|
||||
}
|
||||
this.timer = new Date().getTime();
|
||||
this.locks[serial] = true;
|
||||
await delay_1.delay(cfg.arduino.serialDelay);
|
||||
this.lock(serial);
|
||||
await (0, delay_1.delay)(cfg.arduino.serialDelay);
|
||||
try {
|
||||
results = await this.sendAsync(device, cmd);
|
||||
ms = await this.sendAsync(device, cmd);
|
||||
}
|
||||
catch (e) {
|
||||
return console.error(e);
|
||||
return this.log.error(e);
|
||||
}
|
||||
this.locks[serial] = false;
|
||||
this.unlock(serial);
|
||||
await eventEmitter.emit('arduino_send', cmd);
|
||||
return results;
|
||||
return ms;
|
||||
}
|
||||
async string(serial, str) {
|
||||
const device = this.alias[serial];
|
||||
/**
|
||||
* Sends a string to the specified Arduino.
|
||||
* Handles different types of devices, including fake devices for testing purposes.
|
||||
* Waits for a specified delay before sending the string.
|
||||
*
|
||||
* @async
|
||||
* @param {string} device - The Arduino device identifier.
|
||||
* @param {string} str - The string to be sent to the Arduino.
|
||||
* @returns {Promise<boolean|string>} Returns 'true' if the string is sent successfully, otherwise returns an error message.
|
||||
* @throws {Error} Throws an error if the writeAsync method encounters an error.
|
||||
**/
|
||||
async sendString(device, str) {
|
||||
let writeSuccess;
|
||||
await delay_1.delay(cfg.arduino.serialDelay);
|
||||
if (typeof this.serial[device].fake !== 'undefined'
|
||||
&& this.serial[device].fake) {
|
||||
return this.serial[device].string(str);
|
||||
await (0, delay_1.delay)(cfg.arduino.serialDelay);
|
||||
if (typeof this.serial[this.alias[device]].fake !== 'undefined'
|
||||
&& this.serial[this.alias[device]].fake) {
|
||||
return this.serial[this.alias[device]].string(str);
|
||||
}
|
||||
else {
|
||||
this.log.info(`sendString ${str} -> ${device}`);
|
||||
try {
|
||||
writeSuccess = await this.writeAsync(device, str);
|
||||
}
|
||||
catch (e) {
|
||||
return console.error(e);
|
||||
return this.log.error(e);
|
||||
}
|
||||
this.unlock(this.alias[device]);
|
||||
return writeSuccess;
|
||||
}
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
async stateAsync(device, confirm = false) {
|
||||
const cmd = cfg.arduino.cmd.state;
|
||||
const serial = confirm ? this.alias['connect'] : this.alias[device];
|
||||
return new Promise((resolve, reject) => {
|
||||
this.queue[cmd] = (state) => {
|
||||
this.stateStr[device] = state;
|
||||
if (confirm) {
|
||||
this.hasState[device] = true;
|
||||
this.log.info(`Device ${device} supports state [${state}]`);
|
||||
}
|
||||
return resolve(state);
|
||||
};
|
||||
if (confirm) {
|
||||
setTimeout(function () {
|
||||
if (typeof this.queue[cmd] !== 'undefined') {
|
||||
delete this.queue[cmd];
|
||||
this.hasState[device] = false;
|
||||
this.log.info(`Device ${device} does not support state`);
|
||||
return resolve(null);
|
||||
}
|
||||
}.bind(this), 1000);
|
||||
}
|
||||
this.log.info(`stateAsync ${cmd} -> ${device}`);
|
||||
return this.serial[serial].write(cmd, (err, results) => {
|
||||
if (err) {
|
||||
//this.log.error(err)
|
||||
return reject(err);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
async state(device, confirm = false) {
|
||||
const serial = confirm ? this.alias['connect'] : this.alias[device];
|
||||
let results;
|
||||
if (this.isLocked(serial)) {
|
||||
this.log.warn(`state Serial ${serial} is locked`);
|
||||
return null;
|
||||
}
|
||||
this.timer = new Date().getTime();
|
||||
this.lock(serial);
|
||||
await (0, delay_1.delay)(cfg.arduino.serialDelay);
|
||||
try {
|
||||
results = await this.stateAsync(device, confirm);
|
||||
}
|
||||
catch (e) {
|
||||
return this.log.error(e);
|
||||
}
|
||||
this.unlock(serial);
|
||||
await eventEmitter.emit('arduino_state', cfg.arduino.cmd.state);
|
||||
return results;
|
||||
}
|
||||
/**
|
||||
* Send a string to an Arduino using async/await
|
||||
*
|
||||
|
@ -143,7 +251,7 @@ class Arduino {
|
|||
**/
|
||||
async writeAsync(device, str) {
|
||||
return new Promise((resolve, reject) => {
|
||||
this.serial[device].write(str, function (err, results) {
|
||||
this.serial[this.alias[device]].write(str, function (err, results) {
|
||||
if (err) {
|
||||
return reject(err);
|
||||
}
|
||||
|
@ -151,53 +259,104 @@ class Arduino {
|
|||
});
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Handles the end of communication with the Arduino.
|
||||
* Calculates the time taken for the communication, executes the callback,
|
||||
* and emits an 'arduino_end' event. Handles errors and stray data received.
|
||||
*
|
||||
* @param {string} serial - The serial address of the Arduino device.
|
||||
* @param {string} data - The data received from the Arduino.
|
||||
* @returns {any} The time taken for the communication in milliseconds.
|
||||
**/
|
||||
end(serial, data) {
|
||||
const end = new Date().getTime();
|
||||
const ms = end - this.timer;
|
||||
let complete;
|
||||
//this.log.info(`end ${serial} -> ${data}`)
|
||||
if (this.queue[data] !== undefined) {
|
||||
this.locks[serial] = false;
|
||||
this.unlock(serial);
|
||||
complete = this.queue[data](ms); //execute callback
|
||||
eventEmitter.emit('arduino_end', data);
|
||||
delete this.queue[data];
|
||||
}
|
||||
else if (data[0] === cfg.arduino.cmd.state) {
|
||||
//this.log.info(`end serial -> ${serial}`)
|
||||
this.unlock(serial);
|
||||
complete = this.queue[cfg.arduino.cmd.state](data);
|
||||
eventEmitter.emit('arduino_end', data);
|
||||
delete this.queue[cfg.arduino.cmd.state];
|
||||
return data;
|
||||
}
|
||||
else if (data[0] === cfg.arduino.cmd.error) {
|
||||
this.log.error(`Received error from device ${serial}`);
|
||||
this.unlock(serial);
|
||||
this.error(serial, data);
|
||||
//error state
|
||||
//stop sequence
|
||||
//throw error in ui
|
||||
}
|
||||
else {
|
||||
//console.log('Received stray "' + data + '"'); //silent to user
|
||||
this.log.info('Received stray "' + data + '"'); //silent to user
|
||||
}
|
||||
return ms;
|
||||
}
|
||||
aliasSerial(serial, device) {
|
||||
//this.log.info(`Making "${serial}" an alias of ${device}`);
|
||||
this.alias[serial] = device;
|
||||
error(serial, data) {
|
||||
this.log.error("ERROR", data);
|
||||
}
|
||||
async connect(serial, device, confirm) {
|
||||
/**
|
||||
* Associates an alias with an Arduinos serial address.
|
||||
* Used to map multi-purpose devices onto the same serial connection.
|
||||
*
|
||||
* @param {string} device - The serial number of the target Arduino.
|
||||
* @param {string} serial - The alias to be associated with the target device.
|
||||
**/
|
||||
aliasSerial(device, serial) {
|
||||
//this.log.info(`Making "${serial}" an alias of ${device}`)
|
||||
this.alias[device] = serial;
|
||||
}
|
||||
/**
|
||||
* Connects to an Arduino using its serial number.
|
||||
* Sets up the SerialPort instance and path for the device, and handles data communication.
|
||||
* Handles opening the connection and emitting 'arduino_end' or 'confirmEnd' events upon receiving data.
|
||||
*
|
||||
* @async
|
||||
* @param {string} device - The device identifier (common name).
|
||||
* @param {string} serial - The serial address of the target Arduino (e.g., COM port on Windows).
|
||||
* @param {function} confirm - A callback function to be executed upon receiving confirmation data.
|
||||
* @returns {Promise<string>} Resolves with the device path if the connection is successful.
|
||||
* @throws {Error} Rejects with an error message if the connection fails.
|
||||
**/
|
||||
async connect(device, serial, confirm) {
|
||||
//this.log.info(`connect device ${device}`)
|
||||
//this.log.info(`connect serial ${serial}`)
|
||||
return new Promise(async (resolve, reject) => {
|
||||
let connectSuccess;
|
||||
this.path[serial] = device;
|
||||
this.alias[serial] = device;
|
||||
this.serial[device] = new SerialPort(this.path[serial], {
|
||||
this.path[device] = serial;
|
||||
this.aliasSerial(device, serial);
|
||||
this.serial[serial] = new SerialPort({
|
||||
path: serial,
|
||||
autoOpen: false,
|
||||
baudRate: cfg.arduino.baud,
|
||||
parser: parser
|
||||
parser
|
||||
});
|
||||
this.locks[device] = false;
|
||||
this.unlock(serial);
|
||||
try {
|
||||
connectSuccess = await this.openArduino(device);
|
||||
}
|
||||
catch (e) {
|
||||
console.error('failed to open: ' + e);
|
||||
this.log.error(`Failed to open ${device} @ ${serial}: ` + e);
|
||||
return reject(e);
|
||||
}
|
||||
//console.log(`Opened connection with ${this.path[serial]} as ${serial}`);
|
||||
this.log.info(`Opened connection with ${this.path[device]} as ${device}`);
|
||||
if (!confirm) {
|
||||
this.serial[device].on('data', async (data) => {
|
||||
this.serial[this.alias[device]].on('data', async (data) => {
|
||||
let d = data.toString('utf8');
|
||||
d = d.replace(newlineRe, '').replace(returnRe, '');
|
||||
return this.end(serial, d);
|
||||
});
|
||||
}
|
||||
else {
|
||||
this.serial[device].on('data', async (data) => {
|
||||
this.serial[this.alias[device]].on('data', async (data) => {
|
||||
let d = data.toString('utf8');
|
||||
d = d.replace(newlineRe, '').replace(returnRe, '');
|
||||
return await this.confirmEnd(d);
|
||||
|
@ -206,34 +365,35 @@ class Arduino {
|
|||
return resolve(this.path[serial]);
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Handles the confirmation data received from an Arduino.
|
||||
* Executes the confirmation callback function if the received data is present in the list of expected values.
|
||||
*
|
||||
* @param {string} data - The data received from the Arduino.
|
||||
**/
|
||||
confirmEnd(data) {
|
||||
//console.dir(data)
|
||||
if (data === cfg.arduino.cmd.connect
|
||||
|| data === cfg.arduino.cmd.projector_identifier
|
||||
|| data === cfg.arduino.cmd.camera_identifier
|
||||
|| data === cfg.arduino.cmd.light_identifier
|
||||
|| data === cfg.arduino.cmd.projector_light_identifier
|
||||
|| data === cfg.arduino.cmd.projector_camera_light_identifier
|
||||
|| data === cfg.arduino.cmd.projector_camera_identifier
|
||||
|| data === cfg.arduino.cmd.projector_second_identifier
|
||||
|| data === cfg.arduino.cmd.projectors_identifier
|
||||
|| data === cfg.arduino.cmd.projector_second_forward
|
||||
|| data === cfg.arduino.cmd.projector_second_backward
|
||||
|| data === cfg.arduino.cmd.projector_second
|
||||
|| data === cfg.arduino.cmd.projectors
|
||||
|| data === cfg.arduino.cmd.camera_second_identifier
|
||||
|| data === cfg.arduino.cmd.cameras_identifier
|
||||
|| data === cfg.arduino.cmd.camera_second_forward
|
||||
|| data === cfg.arduino.cmd.camera_second_backward
|
||||
|| data === cfg.arduino.cmd.camera_second
|
||||
|| data === cfg.arduino.cmd.cameras) {
|
||||
if (this.values.indexOf(data) !== -1 && typeof this.confirmExec === 'function') {
|
||||
this.confirmExec(null, data);
|
||||
this.confirmExec = {};
|
||||
this.unlock(this.alias['connect']);
|
||||
}
|
||||
else if (data[0] === cfg.arduino.cmd.state) {
|
||||
this.queue[cfg.arduino.cmd.state](data);
|
||||
delete this.queue[cfg.arduino.cmd.state];
|
||||
this.unlock(this.alias['connect']);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Verifies the connection to an Arduino by sending a connect command.
|
||||
* The confirmation callback checks if the received data matches the expected connect command.
|
||||
*
|
||||
* @async
|
||||
* @returns {Promise<boolean>} Resolves with 'true' if the connection is verified successfully.
|
||||
* @throws {Error} Rejects with an error message if the connection verification fails.
|
||||
**/
|
||||
async verify() {
|
||||
return new Promise(async (resolve, reject) => {
|
||||
const device = this.alias['connect'];
|
||||
const device = 'connect';
|
||||
let writeSuccess;
|
||||
this.confirmExec = function (err, data) {
|
||||
if (data === cfg.arduino.cmd.connect) {
|
||||
|
@ -243,7 +403,7 @@ class Arduino {
|
|||
return reject('Wrong data returned');
|
||||
}
|
||||
};
|
||||
await delay_1.delay(cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(cfg.arduino.serialDelay);
|
||||
try {
|
||||
writeSuccess = await this.sendAsync(device, cfg.arduino.cmd.connect);
|
||||
}
|
||||
|
@ -253,9 +413,17 @@ class Arduino {
|
|||
return resolve(writeSuccess);
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Distinguishes the type of Arduino connected.
|
||||
* Sends a command to the device to identify its type and resolves the promise with the received type.
|
||||
*
|
||||
* @async
|
||||
* @returns {Promise<string>} Resolves with the type of the connected Arduino-based device.
|
||||
* @throws {Error} Rejects with an error message if the distinguish operation fails.
|
||||
**/
|
||||
async distinguish() {
|
||||
return new Promise(async (resolve, reject) => {
|
||||
const device = this.alias['connect'];
|
||||
const device = 'connect';
|
||||
let writeSuccess;
|
||||
let type;
|
||||
this.confirmExec = function (err, data) {
|
||||
|
@ -298,19 +466,39 @@ class Arduino {
|
|||
else if (data === cfg.arduino.cmd.cameras_projectors_identifier) {
|
||||
type = 'camera,camera_second,projector,projector_second';
|
||||
}
|
||||
else if (data === cfg.arduino.cmd.capper_identifier) {
|
||||
type = 'capper';
|
||||
}
|
||||
else if (data === cfg.arduino.cmd.camera_capper_identifier) {
|
||||
type = 'camera,capper';
|
||||
}
|
||||
else if (data === cfg.arduino.cmd.camera_capper_projector_identifier) {
|
||||
type = 'camera,capper,projector';
|
||||
}
|
||||
else if (data === cfg.arduino.cmd.camera_capper_projectors_identifier) {
|
||||
type = 'camera,capper,projector,projector_second';
|
||||
}
|
||||
return resolve(type);
|
||||
};
|
||||
await delay_1.delay(cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(cfg.arduino.serialDelay);
|
||||
try {
|
||||
writeSuccess = await this.sendAsync(device, cfg.arduino.cmd.mcopy_identifier);
|
||||
this.log.info(writeSuccess);
|
||||
}
|
||||
catch (e) {
|
||||
return reject(e);
|
||||
}
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Closes the connection to an Arduino.
|
||||
*
|
||||
* @async
|
||||
* @returns {Promise<boolean>} Resolves with 'true' if the connection is closed successfully.
|
||||
* @throws {Error} Throws an error if the closeArduino method encounters an error.
|
||||
**/
|
||||
async close() {
|
||||
const device = this.alias['connect'];
|
||||
const device = 'connect';
|
||||
let closeSuccess;
|
||||
try {
|
||||
closeSuccess = await this.closeArduino(device);
|
||||
|
@ -320,21 +508,30 @@ class Arduino {
|
|||
}
|
||||
return closeSuccess;
|
||||
}
|
||||
;
|
||||
async fakeConnect(serial) {
|
||||
const device = '/dev/fake';
|
||||
this.alias[serial] = device;
|
||||
this.serial[device] = {
|
||||
/**
|
||||
* Establishes a fake connection to an Arduino for testing purposes.
|
||||
* Creates a fake SerialPort instance with custom write and string methods.
|
||||
*
|
||||
* @async
|
||||
* @param {string} serial - The device identifier of the fake Arduino.
|
||||
* @returns {Promise<boolean>} Resolves with 'true' if the fake connection is established successfully.
|
||||
**/
|
||||
async fakeConnect(device) {
|
||||
const serial = '/dev/fake';
|
||||
this.aliasSerial(device, serial);
|
||||
this.serial[serial] = {
|
||||
write: async function (cmd, cb) {
|
||||
const t = {
|
||||
c: cfg.arduino.cam.time + cfg.arduino.cam.delay,
|
||||
p: cfg.arduino.proj.time + cfg.arduino.proj.delay
|
||||
p: cfg.arduino.proj.time + cfg.arduino.proj.delay,
|
||||
A: 180,
|
||||
B: 180
|
||||
};
|
||||
let timeout = t[cmd];
|
||||
if (typeof timeout === 'undefined')
|
||||
timeout = 10;
|
||||
arduino.timer = +new Date();
|
||||
await delay_1.delay(timeout);
|
||||
await (0, delay_1.delay)(timeout);
|
||||
arduino.end(serial, cmd);
|
||||
return cb();
|
||||
},
|
||||
|
@ -344,7 +541,7 @@ class Arduino {
|
|||
},
|
||||
fake: true
|
||||
};
|
||||
//console.log('Connected to fake arduino! Not real! Does not exist!');
|
||||
//this.log.info('Connected to fake arduino! Not real! Does not exist!')
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
|
@ -356,7 +553,7 @@ class Arduino {
|
|||
**/
|
||||
async openArduino(device) {
|
||||
return new Promise((resolve, reject) => {
|
||||
return this.serial[device].open((err) => {
|
||||
return this.serial[this.alias[device]].open((err) => {
|
||||
if (err) {
|
||||
return reject(err);
|
||||
}
|
||||
|
@ -373,7 +570,7 @@ class Arduino {
|
|||
**/
|
||||
async closeArduino(device) {
|
||||
return new Promise((resolve, reject) => {
|
||||
return this.serial[device].close((err) => {
|
||||
return this.serial[this.alias[device]].close((err) => {
|
||||
if (err) {
|
||||
return reject(err);
|
||||
}
|
||||
|
@ -381,12 +578,23 @@ class Arduino {
|
|||
});
|
||||
});
|
||||
}
|
||||
lock(serial) {
|
||||
//this.log.info(`Locked serial ${serial}`)
|
||||
this.locks[serial] = true;
|
||||
}
|
||||
unlock(serial) {
|
||||
//this.log.info(`Unlocked serial ${serial}`)
|
||||
this.locks[serial] = false;
|
||||
}
|
||||
isLocked(serial) {
|
||||
return typeof this.locks[serial] !== 'undefined' && this.locks[serial] === true;
|
||||
}
|
||||
}
|
||||
if (typeof module !== 'undefined' && module.parent) {
|
||||
module.exports = function (c, ee) {
|
||||
module.exports = function (c, ee, errorState) {
|
||||
eventEmitter = ee;
|
||||
cfg = c;
|
||||
arduino = new Arduino();
|
||||
arduino = new Arduino(errorState);
|
||||
return arduino;
|
||||
};
|
||||
}
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1 @@
|
|||
export {};
|
|
@ -1,6 +1,8 @@
|
|||
'use strict';
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const intval_1 = require("intval");
|
||||
const processing_1 = require("processing");
|
||||
const delay_1 = require("delay");
|
||||
/** class representing camera functions **/
|
||||
class Camera {
|
||||
/**
|
||||
|
@ -9,10 +11,12 @@ class Camera {
|
|||
constructor(arduino, cfg, ui, filmout, second = false) {
|
||||
this.state = {
|
||||
pos: 0,
|
||||
dir: true
|
||||
dir: true,
|
||||
capepr: false
|
||||
};
|
||||
this.arduino = null;
|
||||
this.intval = null;
|
||||
this.processing = null;
|
||||
this.id = 'camera';
|
||||
this.arduino = arduino;
|
||||
this.cfg = cfg;
|
||||
|
@ -37,6 +41,7 @@ class Camera {
|
|||
listen() {
|
||||
this.ipc.on(this.id, this.listener.bind(this));
|
||||
this.ipc.on('intval', this.connectIntval.bind(this));
|
||||
this.ipc.on('processing', this.connectProcessing.bind(this));
|
||||
}
|
||||
/**
|
||||
*
|
||||
|
@ -51,7 +56,15 @@ class Camera {
|
|||
cmd = this.cfg.arduino.cmd[`${this.id}_backward`];
|
||||
}
|
||||
this.state.dir = dir;
|
||||
if (this.intval) {
|
||||
if (this.processing) {
|
||||
try {
|
||||
ms = await this.processing.setDir(dir);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err);
|
||||
}
|
||||
}
|
||||
else if (this.intval) {
|
||||
try {
|
||||
ms = await this.intval.setDir(dir);
|
||||
}
|
||||
|
@ -69,6 +82,27 @@ class Camera {
|
|||
}
|
||||
return await this.end(cmd, id, ms);
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
async cap(state, id) {
|
||||
let cmd;
|
||||
let ms;
|
||||
if (state) {
|
||||
cmd = this.cfg.arduino.cmd[`${this.id}_forward`];
|
||||
}
|
||||
else {
|
||||
cmd = this.cfg.arduino.cmd[`${this.id}_backward`];
|
||||
}
|
||||
this.state.capper = state;
|
||||
try {
|
||||
ms = await this.arduino.send(this.id, cmd);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err);
|
||||
}
|
||||
return await this.end(cmd, id, ms);
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
|
@ -78,7 +112,15 @@ class Camera {
|
|||
if (this.filmout.state.enabled) {
|
||||
await this.filmout.start();
|
||||
}
|
||||
if (this.intval) {
|
||||
if (this.processing) {
|
||||
try {
|
||||
ms = await this.processing.move();
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err);
|
||||
}
|
||||
}
|
||||
else if (this.intval) {
|
||||
try {
|
||||
ms = await this.intval.move();
|
||||
}
|
||||
|
@ -116,11 +158,55 @@ class Camera {
|
|||
/**
|
||||
*
|
||||
**/
|
||||
exposure(exposure, id) {
|
||||
let cmd = 'E';
|
||||
this.intval.setExposure(this.id, exposure, (ms) => {
|
||||
this.end(cmd, id, ms);
|
||||
});
|
||||
async exposure(exposure, id) {
|
||||
const cmd = this.cfg.arduino.cmd.camera_exposure;
|
||||
const str = `${exposure}`;
|
||||
const started = +new Date();
|
||||
let ms;
|
||||
let confirmState;
|
||||
let parts;
|
||||
let confirmExposure;
|
||||
if (this.intval) {
|
||||
return this.intval.setExposure(this.id, exposure, (ms) => {
|
||||
this.ui.send('timing', { c: 'c', ms: exposure });
|
||||
return this.end(cmd, id, ms);
|
||||
});
|
||||
}
|
||||
else if (this.arduino.hasState[this.id]) {
|
||||
try {
|
||||
ms = this.arduino.send(this.id, cmd);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error sending camera exposure command', err);
|
||||
}
|
||||
await (0, delay_1.delay)(1);
|
||||
try {
|
||||
ms = await this.arduino.sendString(this.id, str);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error sending camera exposure string', err);
|
||||
}
|
||||
await ms;
|
||||
await (0, delay_1.delay)(1);
|
||||
try {
|
||||
confirmState = await this.arduino.state(this.id, false);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(`Error confirming set state`, err);
|
||||
}
|
||||
parts = this.arduino.stateStr[this.id].split('G');
|
||||
if (parts.length > 1) {
|
||||
parts = parts[1].split('H');
|
||||
confirmExposure = parseInt(parts[0]);
|
||||
if (!isNaN(confirmExposure)) {
|
||||
this.log.info(`Exposure successfully set to ${confirmExposure}ms`);
|
||||
this.ui.send('timing', { c: 'c', ms: exposure });
|
||||
}
|
||||
}
|
||||
ms = (+new Date()) - started;
|
||||
return await this.end(cmd, id, ms);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
/**
|
||||
*
|
||||
|
@ -129,6 +215,7 @@ class Camera {
|
|||
return new Promise((resolve, reject) => {
|
||||
if (arg.connect) {
|
||||
this.intval = new intval_1.Intval(arg.url);
|
||||
this.processing = null;
|
||||
this.intval.connect((err, ms, state) => {
|
||||
if (err) {
|
||||
this.ui.send('intval', { connected: false });
|
||||
|
@ -148,6 +235,17 @@ class Camera {
|
|||
}
|
||||
});
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
async connectProcessing(event, arg) {
|
||||
return new Promise((resolve, reject) => {
|
||||
this.processing = new processing_1.Processing(arg.url);
|
||||
this.intval = null;
|
||||
this.ui.send('processing', { connected: true, url: arg.url });
|
||||
return resolve(true);
|
||||
});
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
|
@ -171,6 +269,22 @@ class Camera {
|
|||
else if (typeof arg.val !== 'undefined') {
|
||||
this.state.pos = arg.val;
|
||||
}
|
||||
else if (typeof arg.capper !== 'undefined') {
|
||||
try {
|
||||
await this.cap(arg.capper, arg.id);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err);
|
||||
}
|
||||
}
|
||||
else if (typeof arg.exposure !== 'undefined') {
|
||||
try {
|
||||
await this.exposure(arg.exposure, arg.id);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err);
|
||||
}
|
||||
}
|
||||
event.returnValue = true;
|
||||
}
|
||||
/**
|
||||
|
@ -213,9 +327,13 @@ class Camera {
|
|||
else if (cmd === this.cfg.arduino.cmd.camerass) {
|
||||
message += 'Cameras both MOVED 1 frame each';
|
||||
}
|
||||
else if (cmd === this.cfg.arduino.camera_exposure) {
|
||||
message += 'Camera set exposure';
|
||||
}
|
||||
message += ` ${ms}ms`;
|
||||
this.log.info(message);
|
||||
this.ui.send(this.id, { cmd: cmd, id: id, ms: ms });
|
||||
return ms;
|
||||
}
|
||||
}
|
||||
module.exports = function (arduino, cfg, ui, filmout, second) {
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1 @@
|
|||
export {};
|
|
@ -0,0 +1,89 @@
|
|||
'use strict';
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
/** class representing capper functions **/
|
||||
class Capper {
|
||||
/**
|
||||
*
|
||||
**/
|
||||
constructor(arduino, cfg, ui, filmout) {
|
||||
this.state = {
|
||||
capper: false
|
||||
};
|
||||
this.arduino = null;
|
||||
this.id = 'capper';
|
||||
this.arduino = arduino;
|
||||
this.cfg = cfg;
|
||||
this.ui = ui;
|
||||
this.filmout = filmout;
|
||||
this.init();
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
async init() {
|
||||
const Log = require('log');
|
||||
this.log = await Log({ label: this.id });
|
||||
this.ipc = require('electron').ipcMain;
|
||||
this.listen();
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
listen() {
|
||||
this.ipc.on(this.id, this.listener.bind(this));
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
async capper(state, id) {
|
||||
let cmd;
|
||||
let ms;
|
||||
if (state) {
|
||||
cmd = this.cfg.arduino.cmd[`${this.id}_on`];
|
||||
}
|
||||
else {
|
||||
cmd = this.cfg.arduino.cmd[`${this.id}_off`];
|
||||
}
|
||||
this.state.capper = state;
|
||||
try {
|
||||
ms = await this.arduino.send(this.id, cmd);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err);
|
||||
}
|
||||
return await this.end(cmd, id, ms);
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
async listener(event, arg) {
|
||||
if (typeof arg.state !== 'undefined') {
|
||||
try {
|
||||
await this.capper(arg.state, arg.id);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err);
|
||||
}
|
||||
}
|
||||
event.returnValue = true;
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
async end(cmd, id, ms) {
|
||||
let message = '';
|
||||
if (cmd === this.cfg.arduino.cmd.capper_on) {
|
||||
message = 'Capper set to ON';
|
||||
}
|
||||
else if (cmd === this.cfg.arduino.cmd.capper_off) {
|
||||
message = 'Capper set to OFF';
|
||||
}
|
||||
message += ` ${ms}ms`;
|
||||
this.log.info(message);
|
||||
this.ui.send(this.id, { cmd: cmd, id: id, ms: ms });
|
||||
}
|
||||
}
|
||||
module.exports = function (arduino, cfg, ui, filmout) {
|
||||
return new Capper(arduino, cfg, ui, filmout);
|
||||
};
|
||||
//# sourceMappingURL=index.js.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/capper/index.ts"],"names":[],"mappings":"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"}
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -0,0 +1 @@
|
|||
export {};
|
|
@ -1,5 +1,6 @@
|
|||
'use strict';
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const uuid_1 = require("uuid");
|
||||
const delay_1 = require("delay");
|
||||
class Commands {
|
||||
/**
|
||||
|
@ -10,18 +11,24 @@ class Commands {
|
|||
* @param {object} proj Projector 1
|
||||
* @param {object} cam Camera 1
|
||||
* @param {object} light Light source
|
||||
* @param {object} alert Alert object
|
||||
* @param {object} cam2 (optional) Camera 2
|
||||
* @param {object} proj2 {optional} Projector 2
|
||||
* @param {object} proj2 (optional) Projector 2
|
||||
* @param {object} capper Capper object
|
||||
*
|
||||
**/
|
||||
constructor(cfg, proj, cam, light, cam2 = null, proj2 = null) {
|
||||
constructor(cfg, proj, cam, light, alert, cam2 = null, proj2 = null, capper = null) {
|
||||
this.cfg = cfg;
|
||||
this.proj = proj;
|
||||
this.cam = cam;
|
||||
this.light = light;
|
||||
if (cam2)
|
||||
this.alertObj = alert;
|
||||
if (cam2 !== null)
|
||||
this.cam2 = cam2;
|
||||
if (proj2)
|
||||
if (proj2 !== null)
|
||||
this.proj2 = proj2;
|
||||
if (capper !== null)
|
||||
this.capper = capper;
|
||||
this.ipc = require('electron').ipcMain;
|
||||
}
|
||||
/**
|
||||
|
@ -33,10 +40,10 @@ class Commands {
|
|||
let ms;
|
||||
try {
|
||||
if (!this.proj.state.dir) {
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.proj.set(true);
|
||||
}
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
ms = await this.proj.move();
|
||||
}
|
||||
catch (err) {
|
||||
|
@ -53,10 +60,10 @@ class Commands {
|
|||
let ms;
|
||||
try {
|
||||
if (this.proj.state.dir) {
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.proj.set(false);
|
||||
}
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
ms = await this.proj.move();
|
||||
}
|
||||
catch (err) {
|
||||
|
@ -67,24 +74,26 @@ class Commands {
|
|||
/**
|
||||
* Move the camera one frame forward
|
||||
*
|
||||
* @param {array} rgb Color to set light for frame
|
||||
* @param {object} cmd Full cmd object
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async camera_forward(rgb = [255, 255, 255]) {
|
||||
async camera_forward() {
|
||||
const id = (0, uuid_1.v4)();
|
||||
const off = [0, 0, 0];
|
||||
let rgb = [255, 255, 255];
|
||||
let ms;
|
||||
try {
|
||||
if (!this.cam.state.dir) {
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.cam.set(true);
|
||||
}
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(rgb);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(rgb, id);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
ms = await this.cam.move();
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(off);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(off, id);
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
|
@ -97,19 +106,27 @@ class Commands {
|
|||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async black_forward() {
|
||||
const id = (0, uuid_1.v4)();
|
||||
const off = [0, 0, 0];
|
||||
let ms;
|
||||
let ms = 0;
|
||||
try {
|
||||
if (!this.cam.state.dir) {
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.cam.set(true);
|
||||
}
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(off); //make sure set to off
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
ms = await this.cam.move();
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(off);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
if (this.capper) {
|
||||
ms += await this.capper.capper(true, id);
|
||||
}
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(off, id); //make sure set to off
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
ms += await this.cam.move();
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(off, id);
|
||||
if (this.capper) {
|
||||
ms += await this.capper.capper(false, id);
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
|
@ -119,24 +136,26 @@ class Commands {
|
|||
/**
|
||||
* Move the camera one frame backward
|
||||
*
|
||||
* @param {array} rgb Color to set light for frame
|
||||
* @param {object} cmd Full cmd object
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async camera_backward(rgb = [255, 255, 255]) {
|
||||
async camera_backward() {
|
||||
const id = (0, uuid_1.v4)();
|
||||
const off = [0, 0, 0];
|
||||
let rgb = [255, 255, 255];
|
||||
let ms;
|
||||
try {
|
||||
if (this.cam.state.dir) {
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.cam.set(false);
|
||||
}
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(rgb);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(rgb, id);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
ms = await this.cam.move();
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(off);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(off, id);
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
|
@ -149,19 +168,26 @@ class Commands {
|
|||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async black_backward() {
|
||||
const id = (0, uuid_1.v4)();
|
||||
const off = [0, 0, 0];
|
||||
let ms;
|
||||
let ms = 0;
|
||||
try {
|
||||
if (this.cam.state.dir) {
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.cam.set(false);
|
||||
}
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(off); //make sure set to off
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
ms = await this.cam.move();
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(off);
|
||||
if (this.capper) {
|
||||
ms += await this.capper.capper(true, id);
|
||||
}
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(off, id); //make sure set to off
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
ms += await this.cam.move();
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(off, id);
|
||||
if (this.capper) {
|
||||
ms += await this.capper.capper(false, id);
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
|
@ -171,24 +197,26 @@ class Commands {
|
|||
/**
|
||||
* Move the second camera one frame forward
|
||||
*
|
||||
* @param {array} rgb Color to set light for frame
|
||||
* @param {object} cmd Full cmd object
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async camera_second_forward(rgb = [255, 255, 255]) {
|
||||
async camera_second_forward() {
|
||||
const id = (0, uuid_1.v4)();
|
||||
const off = [0, 0, 0];
|
||||
let rgb = [255, 255, 255];
|
||||
let ms;
|
||||
try {
|
||||
if (!this.cam2.state.dir) {
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.cam2.set(true);
|
||||
}
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(rgb);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(rgb, id);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
ms = await this.cam2.move();
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(off);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(off, id);
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
|
@ -198,24 +226,26 @@ class Commands {
|
|||
/**
|
||||
* Move the second camera one frame backward
|
||||
*
|
||||
* @param {array} rgb Color to set light for frame
|
||||
* @param {object} cmd Full cmd object
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async camera_second_backward(rgb = [255, 255, 255]) {
|
||||
async camera_second_backward() {
|
||||
const id = (0, uuid_1.v4)();
|
||||
const off = [0, 0, 0];
|
||||
let rgb = [255, 255, 255];
|
||||
let ms;
|
||||
try {
|
||||
if (this.cam2.state.dir) {
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.cam2.set(false);
|
||||
}
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(rgb);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(rgb, id);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
ms = await this.cam2.move();
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(off);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(off, id);
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
|
@ -225,26 +255,28 @@ class Commands {
|
|||
/**
|
||||
* Move the both cameras one frame forward
|
||||
*
|
||||
* @param {array} rgb Color to set light for frame
|
||||
* @param {object} cmd Full cmd object
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async cameras_forward(rgb = [255, 255, 255]) {
|
||||
async cameras_forward() {
|
||||
const id = (0, uuid_1.v4)();
|
||||
const off = [0, 0, 0];
|
||||
let rgb = [255, 255, 255];
|
||||
let both;
|
||||
let ms;
|
||||
try {
|
||||
if (!this.cam.state.dir) {
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.cam.set(true);
|
||||
}
|
||||
if (!this.cam2.state.dir) {
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.cam2.set(true);
|
||||
}
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(rgb);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(rgb, id);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
if (this.cam && this.cam2 && this.cam.arduino.alias.camera === this.cam.arduino.alias.camera_second) {
|
||||
ms = await this.cam.both();
|
||||
}
|
||||
|
@ -254,8 +286,8 @@ class Commands {
|
|||
both = [await this.cam.move, await this.cam2.move];
|
||||
ms = Math.max(...both);
|
||||
}
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(off);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(off, id);
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
|
@ -265,26 +297,28 @@ class Commands {
|
|||
/**
|
||||
* Move the both cameras one frame backward
|
||||
*
|
||||
* @param {array} rgb Color to set light for frame
|
||||
* @param {object} cmd Full cmd object
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async cameras_backward(rgb = [255, 255, 255]) {
|
||||
async cameras_backward() {
|
||||
const id = (0, uuid_1.v4)();
|
||||
const off = [0, 0, 0];
|
||||
let rgb = [255, 255, 255];
|
||||
let both;
|
||||
let ms;
|
||||
try {
|
||||
if (this.cam.state.dir) {
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.cam.set(false);
|
||||
}
|
||||
if (this.cam2.state.dir) {
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.cam2.set(false);
|
||||
}
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(rgb);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(rgb, id);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
if (this.cam && this.cam2 && this.cam.arduino.alias.camera === this.cam.arduino.alias.camera_second) {
|
||||
ms = await this.cam.both();
|
||||
}
|
||||
|
@ -294,8 +328,8 @@ class Commands {
|
|||
both = [await this.cam.move, await this.cam2.move];
|
||||
ms = Math.max(...both);
|
||||
}
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(off);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(off, id);
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
|
@ -305,26 +339,28 @@ class Commands {
|
|||
/**
|
||||
* Move first camera one frame forward and rewind secondary camera one frame backward
|
||||
*
|
||||
* @param {array} rgb Color to set light for frames
|
||||
* @param {object} cmd Full cmd object
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async camera_forward_camera_second_backward(rgb = [255, 255, 255]) {
|
||||
async camera_forward_camera_second_backward() {
|
||||
const id = (0, uuid_1.v4)();
|
||||
const off = [0, 0, 0];
|
||||
let rgb = [255, 255, 255];
|
||||
let both;
|
||||
let ms;
|
||||
try {
|
||||
if (!this.cam.state.dir) {
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.cam.set(true);
|
||||
}
|
||||
if (this.cam2.state.dir) {
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.cam2.set(false);
|
||||
}
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(rgb);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(rgb, id);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
if (this.cam && this.cam2 && this.cam.arduino.alias.camera === this.cam.arduino.alias.camera_second) {
|
||||
ms = await this.cam.both();
|
||||
}
|
||||
|
@ -334,8 +370,8 @@ class Commands {
|
|||
both = [await this.cam.move, await this.cam2.move];
|
||||
ms = Math.max(...both);
|
||||
}
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(off);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(off, id);
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
|
@ -345,26 +381,28 @@ class Commands {
|
|||
/**
|
||||
* Rewind first camera one frame backward and move secondary camera one frame forward
|
||||
*
|
||||
* @param {array} rgb Color to set light for frame
|
||||
* @param {object} cmd Full cmd object
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async camera_backward_camera_second_forward(rgb = [255, 255, 255]) {
|
||||
async camera_backward_camera_second_forward() {
|
||||
const id = (0, uuid_1.v4)();
|
||||
const off = [0, 0, 0];
|
||||
let rgb = [255, 255, 255];
|
||||
let both;
|
||||
let ms;
|
||||
try {
|
||||
if (this.cam.state.dir) {
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.cam.set(false);
|
||||
}
|
||||
if (!this.cam2.state.dir) {
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.cam2.set(true);
|
||||
}
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(rgb);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(rgb, id);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
if (this.cam && this.cam2 && this.cam.arduino.alias.camera === this.cam.arduino.alias.camera_second) {
|
||||
ms = await this.cam.both();
|
||||
}
|
||||
|
@ -374,8 +412,8 @@ class Commands {
|
|||
both = [await this.cam.move, await this.proj2.move];
|
||||
ms = Math.max(...both);
|
||||
}
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(off);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(off, id);
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
|
@ -391,10 +429,10 @@ class Commands {
|
|||
let ms;
|
||||
try {
|
||||
if (!this.proj2.state.dir) {
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.proj2.set(true);
|
||||
}
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
ms = await this.proj2.move();
|
||||
}
|
||||
catch (err) {
|
||||
|
@ -411,10 +449,10 @@ class Commands {
|
|||
let ms;
|
||||
try {
|
||||
if (this.proj2.state.dir) {
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.proj2.set(false);
|
||||
}
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
ms = await this.proj2.move();
|
||||
}
|
||||
catch (err) {
|
||||
|
@ -432,14 +470,14 @@ class Commands {
|
|||
let ms;
|
||||
try {
|
||||
if (!this.proj.state.dir) {
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.proj.set(true);
|
||||
}
|
||||
if (!this.proj2.state.dir) {
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.proj2.set(true);
|
||||
}
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
if (this.proj && this.proj2 && this.proj.arduino.alias.projector === this.proj.arduino.alias.projector_second) {
|
||||
ms = await this.proj.both();
|
||||
}
|
||||
|
@ -465,14 +503,14 @@ class Commands {
|
|||
let ms;
|
||||
try {
|
||||
if (this.proj.state.dir) {
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.proj.set(false);
|
||||
}
|
||||
if (this.proj2.state.dir) {
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.proj2.set(false);
|
||||
}
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
//run one projector without await?
|
||||
if (this.proj && this.proj2 && this.proj.arduino.alias.projector === this.proj.arduino.alias.projector_second) {
|
||||
ms = await this.proj.both();
|
||||
|
@ -500,14 +538,14 @@ class Commands {
|
|||
let ms;
|
||||
try {
|
||||
if (!this.proj.state.dir) {
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.proj.set(true);
|
||||
}
|
||||
if (this.proj2.state.dir) {
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.proj2.set(false);
|
||||
}
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
//run one projector without await?
|
||||
if (this.proj && this.proj2 && this.proj.arduino.alias.projector === this.proj.arduino.alias.projector_second) {
|
||||
ms = await this.proj.both();
|
||||
|
@ -535,14 +573,14 @@ class Commands {
|
|||
let ms;
|
||||
try {
|
||||
if (this.proj.state.dir) {
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.proj.set(false);
|
||||
}
|
||||
if (!this.proj2.state.dir) {
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.proj2.set(true);
|
||||
}
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
//run one projector without await?
|
||||
if (this.proj && this.proj2 && this.proj.arduino.alias.projector === this.proj.arduino.alias.projector_second) {
|
||||
ms = await this.proj.both();
|
||||
|
@ -559,8 +597,48 @@ class Commands {
|
|||
}
|
||||
return ms;
|
||||
}
|
||||
/**
|
||||
* Throws an alert to pause a sequence
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async alert(cmd) {
|
||||
let ms;
|
||||
try {
|
||||
ms = await this.alertObj.start(cmd.light); //change this meta
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
}
|
||||
return ms;
|
||||
}
|
||||
/**
|
||||
* Pauses a sequence for a length of time
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async pause(cmd) {
|
||||
let ms;
|
||||
try {
|
||||
ms = await (0, delay_1.delay)(cmd.light * 1000); //delay is in seconds
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
}
|
||||
return ms;
|
||||
}
|
||||
async camera_exposure(cmd) {
|
||||
let ms;
|
||||
try {
|
||||
ms = await this.cam.exposure(cmd.light);
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
}
|
||||
return ms;
|
||||
}
|
||||
}
|
||||
module.exports = function (cfg, proj, cam, light, cam2, proj2) {
|
||||
return new Commands(cfg, proj, cam, light, cam2, proj2);
|
||||
module.exports = function (cfg, proj, cam, light, alert, cam2, proj2, capper) {
|
||||
return new Commands(cfg, proj, cam, light, alert, cam2, proj2, capper);
|
||||
};
|
||||
//# sourceMappingURL=index.js.map
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,8 @@
|
|||
/**
|
||||
* Delay in an async/await function
|
||||
*
|
||||
* @param {integer} ms Milliseconds to delay for
|
||||
*
|
||||
* @returns {Promise} Promise to resolve after timeout
|
||||
**/
|
||||
export declare function delay(ms: number): Promise<unknown>;
|
|
@ -1,4 +1,6 @@
|
|||
'use strict';
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.delay = void 0;
|
||||
/**
|
||||
* Delay in an async/await function
|
||||
*
|
||||
|
@ -11,5 +13,6 @@ function delay(ms) {
|
|||
return setTimeout(resolve, ms);
|
||||
});
|
||||
}
|
||||
module.exports.delay = delay;
|
||||
exports.delay = delay;
|
||||
module.exports = { delay };
|
||||
//# sourceMappingURL=index.js.map
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/delay/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb;;;;;;IAMI;AAEJ,SAAS,KAAK,CAAE,EAAW;IAC1B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAa,EAAE,EAAE;QACpC,OAAO,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC"}
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/delay/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;AAEb;;;;;;IAMI;AAEJ,SAAgB,KAAK,CAAE,EAAW;IACjC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAa,EAAE,EAAE;QACpC,OAAO,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACJ,CAAC;AAJD,sBAIC;AAED,MAAM,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,CAAC"}
|
|
@ -0,0 +1 @@
|
|||
export {};
|
|
@ -34,49 +34,57 @@ class Devices {
|
|||
* Listen to the "profile" channel for messages from the UI.
|
||||
**/
|
||||
listen() {
|
||||
this.ipc.on('profile', this.listener.bind(this));
|
||||
this.ipc.handle('profile', this.listener.bind(this));
|
||||
}
|
||||
/**
|
||||
* The "profile" channel callback. If a profile is changed, set it in the
|
||||
* local settings object.
|
||||
**/
|
||||
listener(event, arg) {
|
||||
this.log.info(`Saving profile ${arg.profile}`, 'SETTINGS', false, false);
|
||||
this.settings.update('profile', arg.profile);
|
||||
this.settings.save();
|
||||
async listener(event, arg) {
|
||||
if (typeof arg.profile !== 'undefined') {
|
||||
this.log.info(`Saving profile ${arg.profile}`, 'SETTINGS', false, false);
|
||||
this.settings.update('profile', arg.profile);
|
||||
await this.settings.save();
|
||||
}
|
||||
if (typeof arg.timing !== 'undefined') {
|
||||
this.log.info(`Saving timing info`, 'SETTINGS', false, false);
|
||||
this.settings.update('timing', arg.timing);
|
||||
await this.settings.save();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
async enumerate() {
|
||||
let devices;
|
||||
let serials;
|
||||
try {
|
||||
devices = await this.arduino.enumerate();
|
||||
serials = await this.arduino.enumerate();
|
||||
}
|
||||
catch (err) {
|
||||
this.log.warn(err, 'SERIAL', false, true);
|
||||
await delay_1.delay(1000);
|
||||
await (0, delay_1.delay)(1000);
|
||||
return this.all([]);
|
||||
}
|
||||
this.log.info(`Found ${devices.length} USB devices`, 'SERIAL', true, true);
|
||||
devices = this.favor(devices);
|
||||
return await this.all(devices);
|
||||
this.log.info(`Found ${serials.length} USB devices`, 'SERIAL', true, true);
|
||||
serials = this.favor(serials);
|
||||
return await this.all(serials);
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
favor(devices) {
|
||||
favor(serials) {
|
||||
const past = this.settings.state.devices.filter((device) => {
|
||||
if (device.arduino) {
|
||||
if (device.serial) {
|
||||
return device;
|
||||
}
|
||||
}).map((device) => {
|
||||
return device.arduino;
|
||||
return device.serial;
|
||||
});
|
||||
if (past.length === 0) {
|
||||
return devices;
|
||||
return serials;
|
||||
}
|
||||
devices.sort((a, b) => {
|
||||
serials.sort((a, b) => {
|
||||
if (past.indexOf(a) !== -1 && past.indexOf(b) === -1) {
|
||||
return 1;
|
||||
}
|
||||
|
@ -85,23 +93,24 @@ class Devices {
|
|||
}
|
||||
return 0;
|
||||
});
|
||||
return devices;
|
||||
return serials;
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
async distinguish(device) {
|
||||
async distinguish(serial) {
|
||||
let connectSuccess;
|
||||
let verifySuccess;
|
||||
let type;
|
||||
let device;
|
||||
//this.log.info(`distinguish() ${serial}`)
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('connect', device, true);
|
||||
connectSuccess = await this.arduino.connect('connect', serial, true);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting', err);
|
||||
return null;
|
||||
}
|
||||
await delay_1.delay(2000);
|
||||
await (0, delay_1.delay)(2000);
|
||||
try {
|
||||
verifySuccess = await this.arduino.verify();
|
||||
}
|
||||
|
@ -109,18 +118,25 @@ class Devices {
|
|||
this.log.error('Error verifying device', err);
|
||||
return null;
|
||||
}
|
||||
this.log.info(`Verified ${device} as mcopy device`, 'SERIAL', true, true);
|
||||
await delay_1.delay(1000);
|
||||
this.log.info(`Verified ${serial} as mcopy device`, 'SERIAL', true, true);
|
||||
await (0, delay_1.delay)(1000);
|
||||
try {
|
||||
type = await this.arduino.distinguish();
|
||||
device = await this.arduino.distinguish();
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error distinguishing device', err);
|
||||
return null;
|
||||
}
|
||||
this.remember('arduino', device, type);
|
||||
this.log.info(`Determined ${device} to be ${type}`, 'SERIAL', true, true);
|
||||
return type;
|
||||
this.remember(device, serial, 'arduino');
|
||||
this.log.info(`Determined ${device} to be ${device}`, 'SERIAL', true, true);
|
||||
await (0, delay_1.delay)(100);
|
||||
try {
|
||||
await this.arduino.state(device, true);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error checking state capability', err);
|
||||
}
|
||||
return device;
|
||||
}
|
||||
/**
|
||||
*
|
||||
|
@ -131,24 +147,24 @@ class Devices {
|
|||
await this.arduino.fakeConnect('projector');
|
||||
}
|
||||
catch (err) {
|
||||
console.error(err);
|
||||
this.log.error(`Error connecting to fake PRONECTOR device`, 'SERIAL', true, true);
|
||||
this.log.error(`Error connecting to fake PROjECTOR device`, 'SERIAL', true, true);
|
||||
this.log.error(err);
|
||||
return false;
|
||||
}
|
||||
this.log.info('Connected to fake PROJECTOR device', 'SERIAL', true, true);
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
*
|
||||
**/
|
||||
async fakeCamera() {
|
||||
this.connected.camera = '/dev/fake';
|
||||
try {
|
||||
await this.arduino.fakeConnect('camera');
|
||||
}
|
||||
catch (err) {
|
||||
console.error(err);
|
||||
this.log.error(`Error connecting to fake CAMERA device`, 'SERIAL', true, true);
|
||||
this.log.error(err);
|
||||
return false;
|
||||
}
|
||||
this.log.info('Connected to fake CAMERA device', 'SERIAL', true, true);
|
||||
|
@ -163,17 +179,33 @@ class Devices {
|
|||
await this.arduino.fakeConnect('light');
|
||||
}
|
||||
catch (err) {
|
||||
console.error(err);
|
||||
this.log.error(`Error connecting to fake LIGHT device`, 'SERIAL', true, true);
|
||||
this.log.error(err);
|
||||
return false;
|
||||
}
|
||||
this.log.info('Connected to fake LIGHT device', 'SERIAL', true, true);
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
async connectDevice(device, type) {
|
||||
*
|
||||
**/
|
||||
async fakeCapper() {
|
||||
this.connected.capper = '/dev/fake';
|
||||
try {
|
||||
await this.arduino.fakeConnect('capper');
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(`Error connecting to fake CAPPER device`, 'SERIAL', true, true);
|
||||
this.log.error(err);
|
||||
return false;
|
||||
}
|
||||
this.log.info('Connected to fake CAPPER device', 'SERIAL', true, true);
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
async connectDevice(device, serial) {
|
||||
let closeSuccess;
|
||||
let connectSuccess;
|
||||
try {
|
||||
|
@ -183,10 +215,10 @@ class Devices {
|
|||
this.log.error('Error closing arduino connection', err);
|
||||
return false;
|
||||
}
|
||||
if (type === 'projector') {
|
||||
this.connected.projector = device;
|
||||
if (device === 'projector') {
|
||||
this.connected.projector = serial;
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('projector', device, false);
|
||||
connectSuccess = await this.arduino.connect('projector', serial, false);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting to projector', err);
|
||||
|
@ -194,10 +226,10 @@ class Devices {
|
|||
}
|
||||
this.log.info(`Connected to ${device} as PROJECTOR`, 'SERIAL', true, true);
|
||||
}
|
||||
else if (type === 'camera') {
|
||||
this.connected.camera = device;
|
||||
else if (device === 'camera') {
|
||||
this.connected.camera = serial;
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('camera', device, false);
|
||||
connectSuccess = await this.arduino.connect('camera', serial, false);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting to camera', err);
|
||||
|
@ -205,10 +237,10 @@ class Devices {
|
|||
}
|
||||
this.log.info(`Connected to ${device} as CAMERA`, 'SERIAL', true, true);
|
||||
}
|
||||
else if (type === 'light') {
|
||||
this.connected.light = device;
|
||||
else if (device === 'light') {
|
||||
this.connected.light = serial;
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('light', device, false);
|
||||
connectSuccess = await this.arduino.connect('light', serial, false);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting to light', err);
|
||||
|
@ -216,12 +248,12 @@ class Devices {
|
|||
}
|
||||
this.log.info(`Connected to ${device} as LIGHT`, 'SERIAL', true, true);
|
||||
}
|
||||
else if (type === 'projector,light') {
|
||||
this.connected.projector = device;
|
||||
this.connected.light = device;
|
||||
this.arduino.aliasSerial('light', device);
|
||||
else if (device === 'projector,light') {
|
||||
this.connected.projector = serial;
|
||||
this.connected.light = serial;
|
||||
this.arduino.aliasSerial('light', serial);
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('projector', device, false);
|
||||
connectSuccess = await this.arduino.connect('projector', serial, false);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting to projector and light', err);
|
||||
|
@ -229,14 +261,14 @@ class Devices {
|
|||
}
|
||||
this.log.info(`Connected to ${device} as PROJECTOR + LIGHT`, 'SERIAL', true, true);
|
||||
}
|
||||
else if (type === 'projector,camera,light') {
|
||||
this.connected.projector = device;
|
||||
this.connected.camera = device;
|
||||
this.connected.light = device;
|
||||
this.arduino.aliasSerial('camera', device);
|
||||
this.arduino.aliasSerial('light', device);
|
||||
else if (device === 'projector,camera,light') {
|
||||
this.connected.projector = serial;
|
||||
this.connected.camera = serial;
|
||||
this.connected.light = serial;
|
||||
this.arduino.aliasSerial('camera', serial);
|
||||
this.arduino.aliasSerial('light', serial);
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('projector', device, false);
|
||||
connectSuccess = await this.arduino.connect('projector', serial, false);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting to projector, camera and light', err);
|
||||
|
@ -244,12 +276,12 @@ class Devices {
|
|||
}
|
||||
this.log.info(`Connected to ${device} as PROJECTOR + CAMERA + LIGHT`, 'SERIAL', true, true);
|
||||
}
|
||||
else if (type === 'projector,camera') {
|
||||
this.connected.projector = device;
|
||||
this.connected.camera = device;
|
||||
this.arduino.aliasSerial('camera', device);
|
||||
else if (device === 'projector,camera') {
|
||||
this.connected.projector = serial;
|
||||
this.connected.camera = serial;
|
||||
this.arduino.aliasSerial('camera', serial);
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('projector', device, false);
|
||||
connectSuccess = await this.arduino.connect('projector', serial, false);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting to projector and camera', err);
|
||||
|
@ -257,10 +289,10 @@ class Devices {
|
|||
}
|
||||
this.log.info(`Connected to ${device} as PROJECTOR + CAMERA`, 'SERIAL', true, true);
|
||||
}
|
||||
else if (type === 'projector_second') {
|
||||
this.connected.projector_second = device;
|
||||
else if (device === 'projector_second') {
|
||||
this.connected.projector_second = serial;
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('projector_second', device, false);
|
||||
connectSuccess = await this.arduino.connect('projector_second', serial, false);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting to secondary projector', err);
|
||||
|
@ -268,115 +300,171 @@ class Devices {
|
|||
}
|
||||
this.log.info(`Connected to ${device} as PROJECTOR_SECOND`, 'SERIAL', true, true);
|
||||
}
|
||||
else if (type === 'projector,projector_second') {
|
||||
this.connected.projector = device;
|
||||
this.connected.projector_second = device;
|
||||
this.arduino.aliasSerial('projector_second', device);
|
||||
else if (device === 'projector,projector_second') {
|
||||
this.connected.projector = serial;
|
||||
this.connected.projector_second = serial;
|
||||
this.arduino.aliasSerial('projector_second', serial);
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('projector', device, false);
|
||||
connectSuccess = await this.arduino.connect('projector', serial, false);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting to projector and secondary projector', err);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (type === 'camera_second') {
|
||||
this.connected.camera_second = device;
|
||||
else if (device === 'camera_second') {
|
||||
this.connected.camera_second = serial;
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('camera_second', device, false);
|
||||
connectSuccess = await this.arduino.connect('camera_second', serial, false);
|
||||
}
|
||||
catch (err) {
|
||||
console.error(err);
|
||||
this.log.error(err);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (type === 'camera,camera_second') {
|
||||
this.connected.camera = device;
|
||||
this.connected.camera_second = device;
|
||||
this.arduino.aliasSerial('camera_second', device);
|
||||
else if (device === 'camera,camera_second') {
|
||||
this.connected.camera = serial;
|
||||
this.connected.camera_second = serial;
|
||||
this.arduino.aliasSerial('camera_second', serial);
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('camera', device, false);
|
||||
connectSuccess = await this.arduino.connect('camera', serial, false);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting to camera, camera_secondary and projector', err);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if ('camera,projector,projector_second') {
|
||||
this.connected.camera = device;
|
||||
this.connected.projector = device;
|
||||
this.connected.projector_second = device;
|
||||
this.arduino.aliasSerial('projector', device);
|
||||
this.arduino.aliasSerial('projector_second', device);
|
||||
else if (device === 'camera,projector,projector_second') {
|
||||
this.connected.camera = serial;
|
||||
this.connected.projector = serial;
|
||||
this.connected.projector_second = serial;
|
||||
this.arduino.aliasSerial('projector', serial);
|
||||
this.arduino.aliasSerial('projector_second', serial);
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('camera', device, false);
|
||||
connectSuccess = await this.arduino.connect('camera', serial, false);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting to camera, projector and projector_second', err);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if ('camera,camera_second,projector') {
|
||||
this.connected.camera = device;
|
||||
this.connected.camera_second = device;
|
||||
this.connected.projector = device;
|
||||
this.arduino.aliasSerial('camera_second', device);
|
||||
this.arduino.aliasSerial('projector', device);
|
||||
else if (device === 'camera,camera_second,projector') {
|
||||
this.connected.camera = serial;
|
||||
this.connected.camera_second = serial;
|
||||
this.connected.projector = serial;
|
||||
this.arduino.aliasSerial('camera_second', serial);
|
||||
this.arduino.aliasSerial('projector', serial);
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('camera', device, false);
|
||||
connectSuccess = await this.arduino.connect('camera', serial, false);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting to camera, camera_second and projector', err);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if ('camera,camera_second,projector,projector_second') {
|
||||
this.connected.camera = device;
|
||||
this.connected.camera_second = device;
|
||||
this.connected.projector = device;
|
||||
this.connected.projector_second = device;
|
||||
this.arduino.aliasSerial('camera_second', device);
|
||||
this.arduino.aliasSerial('projector', device);
|
||||
this.arduino.aliasSerial('projector_second', device);
|
||||
else if (device === 'camera,camera_second,projector,projector_second') {
|
||||
this.connected.camera = serial;
|
||||
this.connected.camera_second = serial;
|
||||
this.connected.projector = serial;
|
||||
this.connected.projector_second = serial;
|
||||
this.arduino.aliasSerial('camera_second', serial);
|
||||
this.arduino.aliasSerial('projector', serial);
|
||||
this.arduino.aliasSerial('projector_second', serial);
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('camera', device, false);
|
||||
connectSuccess = await this.arduino.connect('camera', serial, false);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting to camera, camera_second, projector and projector_second', err);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (device === 'capper') {
|
||||
this.connected.capper = serial;
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('capper', serial, false);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting capper', err);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (device === 'camera,capper') {
|
||||
this.connected.camera = serial;
|
||||
this.connected.capper = serial;
|
||||
this.arduino.aliasSerial('capper', serial);
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('camera', serial, false);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting to camera and capper', err);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (device === 'camera,capper,projector') {
|
||||
this.connected.camera = serial;
|
||||
this.connected.capper = serial;
|
||||
this.connected.projector = serial;
|
||||
this.arduino.aliasSerial('capper', serial);
|
||||
this.arduino.aliasSerial('projector', serial);
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('camera', serial, false);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting to camera, capper and projector', err);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (device === 'camera,capper,projector,projector_second') {
|
||||
this.connected.camera = serial;
|
||||
this.connected.capper = serial;
|
||||
this.connected.projector = serial;
|
||||
this.connected.projector_second = serial;
|
||||
this.arduino.aliasSerial('capper', serial);
|
||||
this.arduino.aliasSerial('projector', serial);
|
||||
this.arduino.aliasSerial('projector_second', serial);
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('camera', serial, false);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting to camera, capper, projector and projector_second', err);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return connectSuccess;
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
*
|
||||
**/
|
||||
//Cases for 1 or 2 arduinos connected
|
||||
async all(devices) {
|
||||
async all(serials) {
|
||||
let c = {};
|
||||
let p = {};
|
||||
let l = {};
|
||||
let type;
|
||||
let device;
|
||||
let d;
|
||||
let cs = {};
|
||||
let ps = {};
|
||||
let capper = {};
|
||||
let checklist = [];
|
||||
let exposure;
|
||||
let parts;
|
||||
this.connected = {
|
||||
projector: false,
|
||||
camera: false,
|
||||
light: false,
|
||||
projector_second: false
|
||||
projector_second: false,
|
||||
capper: false
|
||||
};
|
||||
for (let device of devices) {
|
||||
for (let serial of serials) {
|
||||
try {
|
||||
type = await this.distinguish(device);
|
||||
device = await this.distinguish(serial);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error distinguishing device', err);
|
||||
throw err;
|
||||
}
|
||||
try {
|
||||
await this.connectDevice(device, type);
|
||||
await this.connectDevice(device, serial);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting to device', err);
|
||||
|
@ -387,56 +475,82 @@ class Devices {
|
|||
if (!this.connected.projector) {
|
||||
await this.fakeProjector();
|
||||
}
|
||||
else if (this.arduino.hasState['projector']) {
|
||||
p.state = true;
|
||||
}
|
||||
p.arduino = this.connected.projector;
|
||||
if (!this.connected.camera) {
|
||||
await this.fakeCamera();
|
||||
}
|
||||
else if (this.arduino.hasState['camera']) {
|
||||
if (device.indexOf('camera') !== -1) {
|
||||
parts = this.arduino.stateStr[device].split('G');
|
||||
if (parts.length > 1) {
|
||||
parts = parts[1].split('H');
|
||||
exposure = parseInt(parts[0]);
|
||||
if (!isNaN(exposure)) {
|
||||
this.log.info(`Timing for [${device}] = ${exposure}`);
|
||||
this.ui.send('timing', { c: 'c', ms: exposure });
|
||||
}
|
||||
}
|
||||
}
|
||||
c.state = true;
|
||||
c.exposure = true;
|
||||
}
|
||||
c.arduino = this.connected.camera;
|
||||
if (!this.connected.light) {
|
||||
await this.fakeLight();
|
||||
}
|
||||
l.arduino = this.connected.light;
|
||||
if (this.connected.camera_second) {
|
||||
cs = { arduino: this.connected.camera_second };
|
||||
cs.arduino = this.connected.camera_second;
|
||||
}
|
||||
if (this.connected.projector_second) {
|
||||
ps = { arduino: this.connected.projector_second };
|
||||
ps.arduino = this.connected.projector_second;
|
||||
}
|
||||
if (this.connected.capper) {
|
||||
capper.arduino = this.connected.capper;
|
||||
}
|
||||
if (this.settings.state.camera && this.settings.state.camera.intval) {
|
||||
c.intval = this.settings.state.camera.intval;
|
||||
}
|
||||
return this.ready(p, c, l, cs, ps);
|
||||
return this.ready(p, c, l, cs, ps, capper);
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
remember(which, device, type) {
|
||||
*
|
||||
**/
|
||||
remember(device, serial, type) {
|
||||
let deviceEntry;
|
||||
const match = this.settings.state.devices.filter((dev) => {
|
||||
if (dev[which] && dev[which] === device) {
|
||||
if (typeof dev.device !== 'undefined' && dev.device === device &&
|
||||
typeof dev.serial !== 'undefined' && dev.serial === serial) {
|
||||
return dev;
|
||||
}
|
||||
});
|
||||
if (match.length === 0) {
|
||||
deviceEntry = {
|
||||
type: type
|
||||
device,
|
||||
type,
|
||||
serial
|
||||
};
|
||||
deviceEntry[which] = device;
|
||||
this.settings.state.devices.push(deviceEntry);
|
||||
this.settings.update('devices', this.settings.state.devices);
|
||||
this.settings.save();
|
||||
}
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
ready(projector, camera, light, camera_second, projector_second) {
|
||||
*
|
||||
**/
|
||||
ready(projector, camera, light, camera_second, projector_second, capper) {
|
||||
let args = {
|
||||
camera,
|
||||
projector,
|
||||
light,
|
||||
profile: this.settings.state.profile
|
||||
};
|
||||
if (this.settings.state.timing) {
|
||||
args.timing = this.settings.state.timing;
|
||||
}
|
||||
if (projector_second && projector_second.arduino) {
|
||||
args.projector_second = projector_second;
|
||||
this.settings.update('projector_second', projector_second);
|
||||
|
@ -452,6 +566,11 @@ class Devices {
|
|||
this.mainWindow.setSize(800, 800);
|
||||
}
|
||||
}
|
||||
if (capper && capper.arduino) {
|
||||
args.capper = capper;
|
||||
this.mainWindow.setSize(800, 800);
|
||||
this.settings.update('capper', capper);
|
||||
}
|
||||
this.settings.update('camera', camera);
|
||||
this.settings.update('projector', projector);
|
||||
this.settings.update('light', light);
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1 @@
|
|||
export {};
|
|
@ -4,26 +4,22 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
* @module display
|
||||
* Provides features for displaying a full screen display of images for the digital module.
|
||||
**/
|
||||
const spawn = require("spawn");
|
||||
const path_1 = require("path");
|
||||
const url_1 = require("url");
|
||||
const delay_1 = require("delay");
|
||||
const Log = require("log");
|
||||
const { BrowserWindow } = require('electron');
|
||||
function padded_frame(i) {
|
||||
let len = (i + '').length;
|
||||
let str = i + '';
|
||||
for (let x = 0; x < 5 - len; x++) {
|
||||
str = '0' + str;
|
||||
}
|
||||
return str;
|
||||
}
|
||||
class WebView {
|
||||
constructor(platform, display) {
|
||||
this.opened = false;
|
||||
this.showing = false;
|
||||
this.loadWait = {};
|
||||
const prefs = {
|
||||
webPreferences: {
|
||||
nodeIntegration: true,
|
||||
allowRunningInsecureContent: false
|
||||
allowRunningInsecureContent: false,
|
||||
enableRemoteModule: true,
|
||||
contextIsolation: false
|
||||
},
|
||||
width: 800,
|
||||
height: 600,
|
||||
|
@ -31,12 +27,19 @@ class WebView {
|
|||
minHeight: 600 //,
|
||||
//icon: path.join(__dirname, '../../assets/icons/icon.png')
|
||||
};
|
||||
const pagePath = (0, path_1.normalize)((0, path_1.join)(__dirname, '../../display.html'));
|
||||
const pageUrl = (0, url_1.format)({
|
||||
pathname: pagePath,
|
||||
protocol: 'file:'
|
||||
});
|
||||
this.init();
|
||||
if (!display.primary) {
|
||||
prefs.x = display.x + 50;
|
||||
prefs.y = display.y + 50;
|
||||
}
|
||||
this.digitalWindow = new BrowserWindow(prefs);
|
||||
this.digitalWindow.loadURL('file://' + __dirname + '../../../display.html');
|
||||
require('@electron/remote/main').enable(this.digitalWindow.webContents);
|
||||
this.digitalWindow.loadURL(pageUrl);
|
||||
if (process.argv.indexOf('-d') !== -1 || process.argv.indexOf('--dev') !== -1) {
|
||||
this.digitalWindow.webContents.openDevTools();
|
||||
}
|
||||
|
@ -47,69 +50,82 @@ class WebView {
|
|||
//this.digitalWindow.hide();
|
||||
this.platform = platform;
|
||||
this.display = display;
|
||||
this.ipc = require('electron').ipcMain;
|
||||
this.ipc.on('display_load', this.onLoad.bind(this));
|
||||
}
|
||||
async init() {
|
||||
this.log = await Log({ label: 'devices' });
|
||||
}
|
||||
async open() {
|
||||
this.digitalWindow.show();
|
||||
this.showing = true;
|
||||
this.opened = true;
|
||||
await this.digitalWindow.setFullScreen(true);
|
||||
await delay_1.delay(300);
|
||||
await (0, delay_1.delay)(300);
|
||||
if (this.platform === 'osx') {
|
||||
await delay_1.delay(300); //give macs an extra 300ms to open fullscreen
|
||||
await (0, delay_1.delay)(300); //give macs an extra 300ms to open fullscreen
|
||||
}
|
||||
}
|
||||
async show(src) {
|
||||
const normalSrc = (0, path_1.normalize)((0, path_1.join)(src));
|
||||
if (!this.digitalWindow) {
|
||||
console.warn(`Cannot show "${src}" because window does not exist`);
|
||||
this.log.warn(`Cannot show "${src}" because window does not exist`);
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
this.digitalWindow.webContents.send('display', { src });
|
||||
this.digitalWindow.webContents.send('display', { src: normalSrc });
|
||||
}
|
||||
catch (err) {
|
||||
console.error(err);
|
||||
this.log.error(err);
|
||||
}
|
||||
this.showing = true;
|
||||
await delay_1.delay(200);
|
||||
return true;
|
||||
return new Promise(function (resolve) {
|
||||
this.loadWait[src] = resolve;
|
||||
}.bind(this));
|
||||
}
|
||||
onLoad(evt, arg) {
|
||||
if (this.loadWait[arg.src]) {
|
||||
this.loadWait[arg.src]();
|
||||
delete this.loadWait[arg.src];
|
||||
}
|
||||
}
|
||||
async focus() {
|
||||
if (!this.digitalWindow) {
|
||||
console.warn(`Cannot show focus screen because window does not exist`);
|
||||
this.log.warn(`Cannot show focus screen because window does not exist`);
|
||||
return false;
|
||||
}
|
||||
await delay_1.delay(500);
|
||||
await (0, delay_1.delay)(500);
|
||||
try {
|
||||
this.digitalWindow.webContents.send('focus', { focus: true });
|
||||
}
|
||||
catch (err) {
|
||||
console.error(err);
|
||||
this.log.error(err);
|
||||
}
|
||||
}
|
||||
async field(ratio) {
|
||||
if (!this.digitalWindow) {
|
||||
console.warn(`Cannot show field guide because window does not exist`);
|
||||
this.log.warn(`Cannot show field guide because window does not exist`);
|
||||
return false;
|
||||
}
|
||||
await delay_1.delay(500);
|
||||
await (0, delay_1.delay)(500);
|
||||
try {
|
||||
this.digitalWindow.webContents.send('field', { field: true, ratio });
|
||||
}
|
||||
catch (err) {
|
||||
console.error(err);
|
||||
this.log.error(err);
|
||||
}
|
||||
}
|
||||
async meter() {
|
||||
if (!this.digitalWindow) {
|
||||
console.warn(`Cannot show meter screen because window does not exist`);
|
||||
this.log.warn(`Cannot show meter screen because window does not exist`);
|
||||
return false;
|
||||
}
|
||||
await delay_1.delay(500);
|
||||
await (0, delay_1.delay)(500);
|
||||
try {
|
||||
this.digitalWindow.webContents.send('meter', { meter: true });
|
||||
}
|
||||
catch (err) {
|
||||
console.error(err);
|
||||
this.log.error(err);
|
||||
}
|
||||
}
|
||||
hide() {
|
||||
|
@ -130,33 +146,11 @@ class WebView {
|
|||
return true;
|
||||
}
|
||||
}
|
||||
class EOG {
|
||||
constructor() {
|
||||
}
|
||||
open() {
|
||||
this.hide();
|
||||
}
|
||||
async show(src) {
|
||||
//timeout 3 eog --fullscreen ${src}
|
||||
this.cp = spawn('eog', ['--fullscreen', src]);
|
||||
await delay_1.delay(200);
|
||||
return true;
|
||||
}
|
||||
hide() {
|
||||
if (this.cp) {
|
||||
this.cp.kill();
|
||||
this.cp = null;
|
||||
}
|
||||
}
|
||||
close() {
|
||||
this.hide();
|
||||
}
|
||||
}
|
||||
class Display {
|
||||
constructor(sys) {
|
||||
this.platform = sys.platform;
|
||||
this.displays = sys.displays;
|
||||
this.tmpdir = path_1.join(sys.tmp, 'mcopy_digital');
|
||||
this.tmpdir = (0, path_1.join)(sys.tmp, 'mcopy_digital');
|
||||
this.display = this.displays.find((display) => {
|
||||
if (display.primary)
|
||||
return true;
|
||||
|
@ -171,12 +165,8 @@ class Display {
|
|||
await this.wv.open();
|
||||
}
|
||||
}
|
||||
async show(frame) {
|
||||
let padded = padded_frame(frame);
|
||||
let ext = 'png';
|
||||
let tmppath;
|
||||
tmppath = path_1.join(this.tmpdir, `export-${padded}.${ext}`);
|
||||
await this.wv.show(tmppath);
|
||||
async show(src) {
|
||||
await this.wv.show(src);
|
||||
}
|
||||
async showPath(pathStr) {
|
||||
return await this.wv.show(pathStr);
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1 @@
|
|||
export declare const execRaw: any;
|
|
@ -1,5 +1,7 @@
|
|||
'use strict';
|
||||
const execRaw = require('child_process').exec;
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.execRaw = void 0;
|
||||
exports.execRaw = require('child_process').exec;
|
||||
/**
|
||||
* Promisified child_process.exec
|
||||
*
|
||||
|
@ -28,7 +30,7 @@ async function exec(...args) {
|
|||
opts = { maxBuffer: 1024 * 1024 };
|
||||
}
|
||||
return new Promise((resolve, reject) => {
|
||||
const child = execRaw(cmd, opts, (err, stdout, stderr) => err ? reject(err) : resolve({
|
||||
const child = (0, exports.execRaw)(cmd, opts, (err, stdout, stderr) => err ? reject(err) : resolve({
|
||||
stdout,
|
||||
stderr
|
||||
}));
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/exec/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,IAAI,CAAA;AAE7C;;;;;;;;;;GAUG;AACH,KAAK,UAAU,IAAI,CAAC,GAAG,IAAe;IACrC,IAAI,GAAG,GAAY,IAAI,CAAC,CAAC,CAAC,CAAA;IAC1B,IAAI,IAAI,GAAY,IAAI,CAAA;IACxB,IAAI,IAAI,GAAS,IAAI,CAAA;IAErB,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;QAC1D,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;KACd;IACD,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;QACjD,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;KACd;SAAM,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;QACvC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;KACd;IACD,IAAI,IAAI,KAAK,IAAI,EAAE;QAClB,IAAI,GAAG,EAAE,SAAS,EAAG,IAAI,GAAG,IAAI,EAAE,CAAA;KAClC;IACE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACtC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,EACjC,CAAC,GAAW,EAAE,MAAe,EAAE,MAAc,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC7E,MAAM;YACN,MAAM;SACN,CAAC,CAAC,CAAC;QACC,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAClC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAClC;IACL,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAA"}
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/exec/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;;;AAEC,QAAA,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,IAAI,CAAA;AAEpD;;;;;;;;;;GAUG;AACH,KAAK,UAAU,IAAI,CAAC,GAAG,IAAe;IACrC,IAAI,GAAG,GAAY,IAAI,CAAC,CAAC,CAAC,CAAA;IAC1B,IAAI,IAAI,GAAY,IAAI,CAAA;IACxB,IAAI,IAAI,GAAS,IAAI,CAAA;IAErB,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;QAC1D,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;KACd;IACD,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;QACjD,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;KACd;SAAM,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;QACvC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;KACd;IACD,IAAI,IAAI,KAAK,IAAI,EAAE;QAClB,IAAI,GAAG,EAAE,SAAS,EAAG,IAAI,GAAG,IAAI,EAAE,CAAA;KAClC;IACE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACtC,MAAM,KAAK,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE,IAAI,EACjC,CAAC,GAAW,EAAE,MAAe,EAAE,MAAc,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC7E,MAAM;YACN,MAAM;SACN,CAAC,CAAC,CAAC;QACC,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAClC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAClC;IACL,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAA"}
|
|
@ -0,0 +1,8 @@
|
|||
/**
|
||||
* Exit process with either a 0 code or other
|
||||
* specified failure code. Print message to console first.
|
||||
*
|
||||
* @param {string} msg Reason for exit
|
||||
* @param {integer} code process exit code, default 0
|
||||
**/
|
||||
declare function exit(msg: string, code?: number): void;
|
|
@ -0,0 +1 @@
|
|||
export {};
|
|
@ -1,8 +1,34 @@
|
|||
'use strict';
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
/** @module ffmpeg **/
|
||||
const path_1 = require("path");
|
||||
const fs_extra_1 = require("fs-extra");
|
||||
const exec_1 = require("exec");
|
||||
const child_process_1 = require("child_process");
|
||||
async function spawnAsync(bin, args) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const child = (0, child_process_1.spawn)(bin, args);
|
||||
let stdout = '';
|
||||
let stderr = '';
|
||||
child.on('exit', (code) => {
|
||||
if (code === 0) {
|
||||
return resolve({ stdout, stderr });
|
||||
}
|
||||
else {
|
||||
console.error(`Process exited with code: ${code}`);
|
||||
console.error(stderr);
|
||||
return reject(stderr);
|
||||
}
|
||||
});
|
||||
child.stdout.on('data', (data) => {
|
||||
stdout += data;
|
||||
});
|
||||
child.stderr.on('data', (data) => {
|
||||
stderr += data;
|
||||
});
|
||||
return child;
|
||||
});
|
||||
}
|
||||
/** @class FFMPEG **/
|
||||
class FFMPEG {
|
||||
/**
|
||||
|
@ -13,9 +39,9 @@ class FFMPEG {
|
|||
**/
|
||||
constructor(sys) {
|
||||
this.id = 'ffmpeg';
|
||||
this.onProgress = () => { };
|
||||
this.bin = sys.deps.ffmpeg;
|
||||
this.convert = sys.deps.convert;
|
||||
this.TMPDIR = path_1.join(sys.tmp, 'mcopy_digital');
|
||||
this.TMPDIR = (0, path_1.join)(sys.tmp, 'mcopy_digital');
|
||||
this.init();
|
||||
}
|
||||
/**
|
||||
|
@ -36,11 +62,40 @@ class FFMPEG {
|
|||
padded_frame(i) {
|
||||
let len = (i + '').length;
|
||||
let str = i + '';
|
||||
for (let x = 0; x < 5 - len; x++) {
|
||||
for (let x = 0; x < 8 - len; x++) {
|
||||
str = '0' + str;
|
||||
}
|
||||
return str;
|
||||
}
|
||||
/**
|
||||
* Parse the stderr output of ffmpeg
|
||||
*
|
||||
* @param {string} line Stderr line
|
||||
**/
|
||||
parseStderr(line) {
|
||||
//frame= 6416 fps= 30 q=31.0 size= 10251kB time=00:03:34.32 bitrate= 391.8kbits/s speed= 1x
|
||||
let obj = {};
|
||||
if (line.substring(0, 'frame='.length) === 'frame=') {
|
||||
try {
|
||||
obj.frame = line.split('frame=')[1].split('fps=')[0];
|
||||
obj.frame = parseInt(obj.frame);
|
||||
obj.fps = line.split('fps=')[1].split('q=')[0];
|
||||
obj.fps = parseFloat(obj.fps);
|
||||
obj.time = line.split('time=')[1].split('bitrate=')[0];
|
||||
obj.speed = line.split('speed=')[1].trim().replace('x', '');
|
||||
obj.speed = parseFloat(obj.speed);
|
||||
obj.size = line.split('size=')[1].split('time=')[0].trim();
|
||||
}
|
||||
catch (err) {
|
||||
console.error(err);
|
||||
console.log(line);
|
||||
process.exit();
|
||||
}
|
||||
}
|
||||
else {
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
/**
|
||||
* Render a single frame from a video or image to a png.
|
||||
*
|
||||
|
@ -51,55 +106,62 @@ class FFMPEG {
|
|||
**/
|
||||
async frame(state, light) {
|
||||
const frameNum = state.frame;
|
||||
const video = state.path;
|
||||
const video = state.directory ? state.files[frameNum] : state.path;
|
||||
const w = state.info.width;
|
||||
const h = state.info.height;
|
||||
const padded = this.padded_frame(frameNum);
|
||||
let ext = 'tif';
|
||||
let ext = 'png';
|
||||
let rgb = light.color;
|
||||
let rgba = {};
|
||||
let tmpoutput;
|
||||
let cmd;
|
||||
let output;
|
||||
let cmd2;
|
||||
let output2;
|
||||
let fileExists = false;
|
||||
let scale = '';
|
||||
if (w && h) {
|
||||
scale = `,scale=${w}:${h}`;
|
||||
if (state.directory) {
|
||||
return video;
|
||||
}
|
||||
if (w && h) {
|
||||
scale = `,scale=trunc(ih*dar):${h}`; //:force_original_aspect_ratio=decrease,pad=${w}:${h}:(ow-iw)/2:(oh-ih)/2
|
||||
}
|
||||
tmpoutput = (0, path_1.join)(this.TMPDIR, `${state.hash}-export-${padded}.${ext}`);
|
||||
try {
|
||||
fileExists = await (0, fs_extra_1.exists)(tmpoutput);
|
||||
}
|
||||
catch (err) {
|
||||
//
|
||||
}
|
||||
if (fileExists) {
|
||||
this.log.info(`File ${tmpoutput} exists`);
|
||||
return tmpoutput;
|
||||
}
|
||||
//console.dir(state)
|
||||
//if (system.platform !== 'nix') {
|
||||
ext = 'png';
|
||||
//}
|
||||
tmpoutput = path_1.join(this.TMPDIR, `export-${padded}.${ext}`);
|
||||
rgb = rgb.map((e) => {
|
||||
return parseInt(e);
|
||||
});
|
||||
//
|
||||
cmd = `${this.bin} -y -i "${video}" -vf "select='gte(n\\,${frameNum})'${scale}" -vframes 1 -compression_algo raw -pix_fmt rgb24 "${tmpoutput}"`;
|
||||
cmd2 = `${this.convert} "${tmpoutput}" -resize ${w}x${h} -size ${w}x${h} xc:"rgb(${rgb[0]},${rgb[1]},${rgb[2]})" +swap -compose Darken -composite "${tmpoutput}"`;
|
||||
cmd = `${this.bin} -y -i "${video}" -vf "select='gte(n\\,${frameNum})'${scale}" -vframes 1 -compression_algo raw -pix_fmt rgb24 -crf 0 "${tmpoutput}"`;
|
||||
//cmd2 = `${this.convert} "${tmpoutput}" -resize ${w}x${h} -size ${w}x${h} xc:"rgb(${rgb[0]},${rgb[1]},${rgb[2]})" +swap -compose Darken -composite "${tmpoutput}"`;
|
||||
//ffmpeg -i "${video}" -ss 00:00:07.000 -vframes 1 "export-${time}.jpg"
|
||||
//ffmpeg -i "${video}" -compression_algo raw -pix_fmt rgb24 "export-%05d.tiff"
|
||||
//-vf "select=gte(n\,${frame})" -compression_algo raw -pix_fmt rgb24 "export-${padded}.png"
|
||||
try {
|
||||
this.log.info(cmd);
|
||||
output = await exec_1.exec(cmd);
|
||||
output = await (0, exec_1.exec)(cmd);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err);
|
||||
}
|
||||
if (output && output.stdout)
|
||||
this.log.info(`"${output.stdout}"`);
|
||||
if (this.convert && (rgb[0] !== 255 || rgb[1] !== 255 || rgb[2] !== 255)) {
|
||||
this.log.info(`"${output.stdout.trim()}"`);
|
||||
if (rgb[0] !== 255 || rgb[1] !== 255 || rgb[2] !== 255) {
|
||||
rgb = rgb.map((e) => {
|
||||
return parseInt(e);
|
||||
});
|
||||
rgba = { r: rgb[0], g: rgb[1], b: rgb[2], a: 255 };
|
||||
try {
|
||||
this.log.info(cmd2);
|
||||
output2 = await exec_1.exec(cmd2);
|
||||
//await Frame.blend(tmpoutput, rgba, tmpoutput);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err);
|
||||
}
|
||||
}
|
||||
if (output2 && output2.stdout)
|
||||
this.log.info(`"${output2.stdout}"`);
|
||||
return tmpoutput;
|
||||
}
|
||||
/**
|
||||
|
@ -111,21 +173,93 @@ class FFMPEG {
|
|||
*
|
||||
* @returns {?}
|
||||
**/
|
||||
async frames(video, obj) {
|
||||
async frames(state) {
|
||||
const video = state.path;
|
||||
const w = state.info.width;
|
||||
const h = state.info.height;
|
||||
const tmppath = this.TMPDIR;
|
||||
let ext = 'tif';
|
||||
let tmpoutput;
|
||||
//if (system.platform !== 'nix') {
|
||||
ext = 'png';
|
||||
//}
|
||||
tmpoutput = path_1.join(tmppath, `export-%05d.${ext}`);
|
||||
let ext = 'png';
|
||||
let tmpoutput = (0, path_1.join)(tmppath, `${state.hash}-export-%08d.${ext}`);
|
||||
let args;
|
||||
let output;
|
||||
let estimated = -1;
|
||||
//cmd = `${this.bin} -y -i "${video}" -vf "${scale}" -compression_algo raw -pix_fmt rgb24 -crf 0 "${tmpoutput}"`;
|
||||
args = [
|
||||
'-y',
|
||||
'-i', video
|
||||
];
|
||||
if (w && h) {
|
||||
args.push('-vf');
|
||||
args.push(`scale=${w}:${h}`);
|
||||
}
|
||||
args = args.concat([
|
||||
'-compression_algo', 'raw',
|
||||
'-pix_fmt', 'rgb24',
|
||||
'-crf', '0',
|
||||
tmpoutput
|
||||
]);
|
||||
//console.dir(args)
|
||||
//console.dir(state)
|
||||
try {
|
||||
await fs_extra_1.mkdir(tmppath);
|
||||
await (0, fs_extra_1.mkdir)(tmppath);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err);
|
||||
if (err.code && err.code === 'EEXIST') {
|
||||
//directory exists
|
||||
}
|
||||
else {
|
||||
this.log.error(err);
|
||||
}
|
||||
}
|
||||
//ffmpeg -i "${video}" -compression_algo raw -pix_fmt rgb24 "${tmpoutput}"
|
||||
return new Promise((resolve, reject) => {
|
||||
let stdout = '';
|
||||
let stderr = '';
|
||||
this.log.info(`${this.bin} ${args.join(' ')}`);
|
||||
this.child = (0, child_process_1.spawn)(this.bin, args);
|
||||
this.child.on('exit', (code) => {
|
||||
//console.log('GOT TO EXIT');
|
||||
if (code === 0) {
|
||||
console.log(stderr);
|
||||
console.log(stdout);
|
||||
return resolve(true);
|
||||
}
|
||||
else {
|
||||
console.error(`Process exited with code: ${code}`);
|
||||
console.error(stderr);
|
||||
return reject(stderr + stdout);
|
||||
}
|
||||
});
|
||||
this.child.stdout.on('data', (data) => {
|
||||
const line = data.toString();
|
||||
stdout += line;
|
||||
});
|
||||
this.child.stderr.on('data', (data) => {
|
||||
const line = data.toString();
|
||||
const obj = this.parseStderr(line);
|
||||
if (obj.frame && state.frames) {
|
||||
obj.progress = obj.frame / state.frames;
|
||||
}
|
||||
if (obj.frame && obj.speed && state.frames && state.info.fps) {
|
||||
//scale by speed
|
||||
obj.remaining = ((state.frames - obj.frame) / state.info.fps) / obj.speed;
|
||||
obj.estimated = state.info.seconds / obj.speed;
|
||||
if (obj.estimated > estimated) {
|
||||
estimated = obj.estimated;
|
||||
}
|
||||
}
|
||||
if (obj.frame) {
|
||||
//log.info(`${input.name} ${obj.frame}/${input.frames} ${Math.round(obj.progress * 1000) / 10}% ${Math.round(obj.remaining)} seconds remaining of ${Math.round(obj.estimated)}`);
|
||||
this.onProgress(obj);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
cancel() {
|
||||
if (this.child) {
|
||||
this.child.kill();
|
||||
this.log.info(`Stopped exporting sequence with ffmpeg`);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Clears a specific frame from the tmp directory
|
||||
|
@ -134,27 +268,22 @@ class FFMPEG {
|
|||
*
|
||||
* @returns {boolean} True if successful, false if not
|
||||
**/
|
||||
async clear(frame) {
|
||||
const padded = this.padded_frame(frame);
|
||||
let ext = 'tif';
|
||||
async clear(state) {
|
||||
const padded = this.padded_frame(state.frame);
|
||||
let ext = 'png';
|
||||
let tmppath;
|
||||
let tmpoutput;
|
||||
let cmd;
|
||||
let fileExists;
|
||||
//if (system.platform !== 'nix') {
|
||||
ext = 'png';
|
||||
//}
|
||||
tmppath = path_1.join(this.TMPDIR, `export-${padded}.${ext}`);
|
||||
tmppath = (0, path_1.join)(this.TMPDIR, `${state.hash}-export-${padded}.${ext}`);
|
||||
try {
|
||||
fileExists = await fs_extra_1.exists(tmppath);
|
||||
fileExists = await (0, fs_extra_1.exists)(tmppath);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err);
|
||||
}
|
||||
if (!fs_extra_1.exists)
|
||||
if (!fileExists)
|
||||
return false;
|
||||
try {
|
||||
await fs_extra_1.unlink(tmppath);
|
||||
await (0, fs_extra_1.unlink)(tmppath);
|
||||
this.log.info(`Cleared frame ${tmppath}`);
|
||||
}
|
||||
catch (err) {
|
||||
|
@ -163,22 +292,28 @@ class FFMPEG {
|
|||
return true;
|
||||
}
|
||||
/**
|
||||
* Delete all frames in temp directory.
|
||||
* Deletes all frames in temp directory.
|
||||
*
|
||||
**/
|
||||
async clearAll() {
|
||||
const tmppath = this.TMPDIR;
|
||||
let files;
|
||||
try {
|
||||
files = await fs_extra_1.readdir(tmppath);
|
||||
files = await (0, fs_extra_1.readdir)(tmppath);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err);
|
||||
}
|
||||
files = files.filter((file) => {
|
||||
if (file.indexOf('-export-') !== -1) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
if (files) {
|
||||
files.forEach(async (file, index) => {
|
||||
try {
|
||||
await fs_extra_1.unlink(path_1.join(tmppath, file));
|
||||
await (0, fs_extra_1.unlink)((0, path_1.join)(tmppath, file));
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err);
|
||||
|
@ -188,19 +323,19 @@ class FFMPEG {
|
|||
}
|
||||
/**
|
||||
* Checks if mcopy temp directory exists. If it doesn't,
|
||||
* create it.
|
||||
* creates it.
|
||||
**/
|
||||
async checkDir() {
|
||||
let fileExists;
|
||||
try {
|
||||
fileExists = await fs_extra_1.exists(this.TMPDIR);
|
||||
fileExists = await (0, fs_extra_1.exists)(this.TMPDIR);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error checking for tmp dir', err);
|
||||
}
|
||||
if (!fileExists) {
|
||||
try {
|
||||
await fs_extra_1.mkdir(this.TMPDIR);
|
||||
await (0, fs_extra_1.mkdir)(this.TMPDIR);
|
||||
this.log.info(`Created tmpdir ${this.TMPDIR}`);
|
||||
}
|
||||
catch (err) {
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1 @@
|
|||
export {};
|
|
@ -8,7 +8,22 @@ const exec_1 = require("exec");
|
|||
//const exit = require('exit');
|
||||
class FFPROBE {
|
||||
constructor(sys) {
|
||||
this.system = sys;
|
||||
this.bin = sys.deps.ffprobe;
|
||||
}
|
||||
/**
|
||||
* Parse the fps entry into a float representing the fps of a video
|
||||
**/
|
||||
parseFps(fpsStr) {
|
||||
let fps = 30.0;
|
||||
let parts;
|
||||
if (fpsStr.indexOf('/') !== -1) {
|
||||
parts = fpsStr.split('/');
|
||||
fps = parseFloat(parts[0]) / parseFloat(parts[1]);
|
||||
}
|
||||
else {
|
||||
fps = parseFloat(fpsStr);
|
||||
}
|
||||
return fps;
|
||||
}
|
||||
/**
|
||||
* Get info on a video in json format. Use for filmout.
|
||||
|
@ -18,13 +33,13 @@ class FFPROBE {
|
|||
* @returns {object} Video info in an object
|
||||
**/
|
||||
async info(video) {
|
||||
const cmd = `ffprobe -v quiet -print_format json -show_format -show_streams "${video}"`;
|
||||
const cmd = `${this.bin} -v quiet -print_format json -show_format -show_streams "${video}"`;
|
||||
let fileExists;
|
||||
let raw;
|
||||
let json;
|
||||
let vid; //whether video has stream with video data
|
||||
try {
|
||||
fileExists = await fs_extra_1.exists(video);
|
||||
fileExists = await (0, fs_extra_1.exists)(video);
|
||||
}
|
||||
catch (err) {
|
||||
return exit(err, 5);
|
||||
|
@ -36,7 +51,7 @@ class FFPROBE {
|
|||
}
|
||||
try {
|
||||
console.log(cmd);
|
||||
raw = await exec_1.exec(cmd);
|
||||
raw = await (0, exec_1.exec)(cmd);
|
||||
}
|
||||
catch (err) {
|
||||
//return exit(err, 7);
|
||||
|
@ -49,6 +64,9 @@ class FFPROBE {
|
|||
catch (err) {
|
||||
return raw.stdout;
|
||||
}
|
||||
if (json.format && json.format.duration) {
|
||||
json.seconds = parseFloat(json.format.duration);
|
||||
}
|
||||
if (json && json.streams) {
|
||||
vid = json.streams.find((stream) => {
|
||||
if (stream.width && stream.height)
|
||||
|
@ -58,6 +76,7 @@ class FFPROBE {
|
|||
if (vid) {
|
||||
json.width = vid.width;
|
||||
json.height = vid.height;
|
||||
json.fps = this.parseFps(vid.r_frame_rate);
|
||||
}
|
||||
return json;
|
||||
}
|
||||
|
@ -71,15 +90,15 @@ class FFPROBE {
|
|||
* @returns {integer} Number of frames in video
|
||||
**/
|
||||
async frames(video) {
|
||||
const ext = path_1.extname(video.toLowerCase());
|
||||
let cmd = `ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 "${video}"`;
|
||||
let backup_cmd = `ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 "${video}"`;
|
||||
const ext = (0, path_1.extname)(video.toLowerCase());
|
||||
let cmd = `${this.bin} -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 "${video}"`;
|
||||
let backup_cmd = `${this.bin} -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 "${video}"`;
|
||||
let gif_cmd = `identify -format "%n\n" "${video}" | head -1`;
|
||||
let fileExists;
|
||||
let raw;
|
||||
let frames;
|
||||
try {
|
||||
fileExists = await fs_extra_1.exists(video);
|
||||
fileExists = await (0, fs_extra_1.exists)(video);
|
||||
}
|
||||
catch (err) {
|
||||
//return exit(err, 5);
|
||||
|
@ -99,7 +118,7 @@ class FFPROBE {
|
|||
}
|
||||
try {
|
||||
console.log(cmd);
|
||||
raw = await exec_1.exec(cmd);
|
||||
raw = await (0, exec_1.exec)(cmd);
|
||||
}
|
||||
catch (err) {
|
||||
console.error(err);
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ffprobe/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,uBAAuB;AAEvB,uCAAkC;AAClC,+BAA+B;AAC/B,+BAA4B;AAC5B,iCAAiC;AACjC,+BAA+B;AAE/B,MAAM,OAAO;IAGZ,YAAa,GAAS;QACrB,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;IACnB,CAAC;IACD;;;;;;QAMI;IACG,KAAK,CAAC,IAAI,CAAE,KAAc;QAChC,MAAM,GAAG,GAAY,mEAAmE,KAAK,GAAG,CAAA;QAChG,IAAI,UAAoB,CAAC;QACzB,IAAI,GAAS,CAAC;QACd,IAAI,IAAU,CAAC;QACf,IAAI,GAAS,CAAC,CAAC,0CAA0C;QAEzD,IAAI;YACH,UAAU,GAAG,MAAM,iBAAM,CAAC,KAAK,CAAC,CAAC;SACjC;QAAC,OAAO,GAAG,EAAE;YACb,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;SACpB;QACD,IAAI,CAAC,UAAU,EAAE;YAChB,iDAAiD;YACjD,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACzD,OAAO,KAAK,CAAA;SACZ;QAED,IAAI;YACH,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACjB,GAAG,GAAG,MAAM,WAAI,CAAC,GAAG,CAAC,CAAC;SACtB;QAAC,OAAO,GAAG,EAAE;YACb,sBAAsB;YACtB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnB,OAAO,KAAK,CAAA;SACZ;QAED,IAAI;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;SAC9B;QAAC,OAAO,GAAG,EAAE;YACb,OAAO,GAAG,CAAC,MAAM,CAAC;SAClB;QAED,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE;YACzB,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAY,EAAE,EAAE;gBACxC,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM;oBAAE,OAAO,MAAM,CAAC;YAClD,CAAC,CAAC,CAAC;SACH;QAED,IAAI,GAAG,EAAE;YACR,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;YACvB,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;SACzB;QAED,OAAO,IAAI,CAAC;IACb,CAAC;IACD;;;;;;;;QAQI;IACG,KAAK,CAAC,MAAM,CAAE,KAAc;QAClC,MAAM,GAAG,GAAY,cAAO,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAClD,IAAI,GAAG,GAAY,+GAA+G,KAAK,GAAG,CAAC;QAC3I,IAAI,UAAU,GAAY,kIAAkI,KAAK,GAAG,CAAC;QACrK,IAAI,OAAO,GAAY,4BAA4B,KAAK,aAAa,CAAA;QACrE,IAAI,UAAoB,CAAC;QACzB,IAAI,GAAS,CAAC;QACd,IAAI,MAAe,CAAC;QAEpB,IAAI;YACH,UAAU,GAAG,MAAM,iBAAM,CAAC,KAAK,CAAC,CAAC;SACjC;QAAC,OAAO,GAAG,EAAE;YACb,sBAAsB;YACtB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnB,OAAO,KAAK,CAAA;SACZ;QACD,IAAI,CAAC,UAAU,EAAE;YAChB,iDAAiD;YACjD,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACzD,OAAO,KAAK,CAAC;SACb;QAED,IAAI,GAAG,KAAK,MAAM,EAAE;YACnB,GAAG,GAAG,UAAU,CAAC;SACjB;aAAM,IAAI,GAAG,KAAK,MAAM,EAAE;YAC1B,GAAG,GAAG,OAAO,CAAC;SACd;QACD,IAAI;YACH,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACjB,GAAG,GAAG,MAAM,WAAI,CAAC,GAAG,CAAC,CAAC;SACtB;QAAC,OAAO,GAAG,EAAE;YACb,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnB,OAAO,KAAK,CAAC;SACb;QAED,IAAI;YACH,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;SAC9B;QAAC,OAAO,GAAG,EAAE;YACb,OAAO,GAAG,CAAC,MAAM,CAAC;SAClB;QAED,OAAO,MAAM,CAAC;IACf,CAAC;CACD;AAED;;;;EAIE;AAEF,MAAM,CAAC,OAAO,GAAG,CAAC,GAAS,EAAE,EAAE;IAC9B,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC,CAAA"}
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ffprobe/index.ts"],"names":[],"mappings":"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"}
|
|
@ -0,0 +1 @@
|
|||
export {};
|
|
@ -3,11 +3,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const sharp_1 = __importDefault(require("sharp"));
|
||||
const animated_gif_detector_1 = __importDefault(require("animated-gif-detector"));
|
||||
const path_1 = require("path");
|
||||
const fs_extra_1 = require("fs-extra");
|
||||
const delay_1 = require("delay");
|
||||
const crypto_1 = require("crypto");
|
||||
const frame_1 = __importDefault(require("frame"));
|
||||
/**
|
||||
* @module FilmOut
|
||||
**/
|
||||
|
@ -22,10 +23,11 @@ class FilmOut {
|
|||
* @param {object} ui Electron ui object
|
||||
* @param {object} light Light device object
|
||||
**/
|
||||
constructor(display, ffmpeg, ffprobe, ui, light) {
|
||||
constructor(display, server, ffmpeg, ffprobe, ui, light) {
|
||||
this.id = 'filmout';
|
||||
this.videoExtensions = ['.mpg', '.mpeg', '.mov', '.mkv', '.avi', '.mp4'];
|
||||
this.stillExtensions = ['.tif', '.tiff', '.png', '.jpg', '.jpeg', '.bmp'];
|
||||
this.sequenceExtensions = ['.png', '.jpg', '.jpeg'];
|
||||
this.gifExtension = '.gif';
|
||||
this.state = {
|
||||
frame: 0,
|
||||
|
@ -33,11 +35,14 @@ class FilmOut {
|
|||
still: false,
|
||||
path: null,
|
||||
fileName: null,
|
||||
directory: false,
|
||||
info: {},
|
||||
dir: true,
|
||||
enabled: false
|
||||
enabled: false,
|
||||
files: []
|
||||
};
|
||||
this.display = display;
|
||||
this.server = server;
|
||||
this.ffmpeg = ffmpeg;
|
||||
this.ffprobe = ffprobe;
|
||||
this.ui = ui;
|
||||
|
@ -65,6 +70,18 @@ class FilmOut {
|
|||
this.ipc.on('preview', this.preview.bind(this));
|
||||
this.ipc.on('preview_frame', this.previewFrame.bind(this));
|
||||
this.ipc.on('display', this.onDisplay.bind(this));
|
||||
this.ipc.on('pre_export', this.onPreExport.bind(this));
|
||||
this.ffmpeg.onProgress = (obj) => {
|
||||
this.ui.send('pre_export_progress', { progress: obj });
|
||||
};
|
||||
}
|
||||
/**
|
||||
* Create a hash of a string.
|
||||
*
|
||||
* @param {string} data Data to produce hash of
|
||||
*/
|
||||
hash(data) {
|
||||
return (0, crypto_1.createHash)('sha1').update(data).digest('hex');
|
||||
}
|
||||
/**
|
||||
* Sets filmout direction.
|
||||
|
@ -76,11 +93,13 @@ class FilmOut {
|
|||
}
|
||||
/**
|
||||
* Moves filmout a frame at a time.
|
||||
*
|
||||
* @returns {number} Time since start
|
||||
**/
|
||||
async move() {
|
||||
let start = +new Date();
|
||||
if (this.state.still) {
|
||||
return false;
|
||||
return -1;
|
||||
}
|
||||
if (this.state.dir) {
|
||||
this.state.frame++;
|
||||
|
@ -97,28 +116,26 @@ class FilmOut {
|
|||
* Begin the process of exporting single frames from the video for display.
|
||||
**/
|
||||
async start() {
|
||||
let path;
|
||||
try {
|
||||
await this.ffmpeg.clearAll();
|
||||
path = await this.ffmpeg.frame(this.state, this.light.state);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err, 'FILMOUT', true, true);
|
||||
throw err;
|
||||
}
|
||||
try {
|
||||
await this.ffmpeg.frame(this.state, this.light.state);
|
||||
if (this.server.displayImage(path)) {
|
||||
await (0, delay_1.delay)(20);
|
||||
return;
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err, 'FILMOUT', true, true);
|
||||
throw err;
|
||||
}
|
||||
await this.display.show(this.state.frame);
|
||||
await delay_1.delay(20);
|
||||
await this.display.show(path);
|
||||
await (0, delay_1.delay)(20);
|
||||
}
|
||||
/**
|
||||
* Ends the filmout process and closes the display.
|
||||
**/
|
||||
async end() {
|
||||
await delay_1.delay(20);
|
||||
await (0, delay_1.delay)(20);
|
||||
this.display.hide();
|
||||
}
|
||||
/**
|
||||
|
@ -126,16 +143,29 @@ class FilmOut {
|
|||
*
|
||||
* @param {object} evt Original connect event
|
||||
* @param {object} arg Arguments from ipc message
|
||||
*
|
||||
* @returns {boolean} Success state
|
||||
**/
|
||||
async onConnect(evt, arg) {
|
||||
let frames = 0;
|
||||
let isAnimated = false;
|
||||
let info;
|
||||
let ext;
|
||||
ext = path_1.extname(arg.fileName.toLowerCase());
|
||||
//console.dir(arg)
|
||||
//console.log(ext)
|
||||
if (ext === this.gifExtension) {
|
||||
let stats;
|
||||
let frameList;
|
||||
try {
|
||||
stats = await (0, fs_extra_1.lstat)(arg.path);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err, 'FILMOUT', true, true);
|
||||
return false;
|
||||
}
|
||||
ext = (0, path_1.extname)(arg.fileName.toLowerCase());
|
||||
if (stats.isDirectory()) {
|
||||
this.state.directory = true;
|
||||
this.state.still = false;
|
||||
}
|
||||
else if (ext === this.gifExtension) {
|
||||
try {
|
||||
isAnimated = await this.isGifAnimated(arg.path);
|
||||
}
|
||||
|
@ -148,15 +178,46 @@ class FilmOut {
|
|||
}
|
||||
else if (this.stillExtensions.indexOf(ext) !== -1) {
|
||||
this.state.still = true;
|
||||
this.state.directory = false;
|
||||
}
|
||||
else if (this.videoExtensions.indexOf(ext) !== -1) {
|
||||
this.state.still = false;
|
||||
this.state.directory = false;
|
||||
}
|
||||
else {
|
||||
this.log.error(`File is not of a valid file type`, 'FILMOUT', true, true);
|
||||
return false;
|
||||
}
|
||||
if (this.state.still) {
|
||||
try {
|
||||
await this.ffmpeg.clearAll();
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err, 'FILMOUT', true, true);
|
||||
throw err;
|
||||
}
|
||||
if (this.state.directory) {
|
||||
try {
|
||||
frameList = await this.dirList(arg.path);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err, 'FILMOUT', true, true);
|
||||
this.state.enabled = false;
|
||||
await this.ui.send(this.id, { valid: false });
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
info = await this.dirInfo(frameList);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err, 'FILMOUT', true, true);
|
||||
this.state.enabled = false;
|
||||
await this.ui.send(this.id, { valid: false });
|
||||
return false;
|
||||
}
|
||||
frames = frameList.length;
|
||||
this.state.files = frameList;
|
||||
}
|
||||
else if (this.state.still) {
|
||||
try {
|
||||
info = await this.stillInfo(arg.path);
|
||||
}
|
||||
|
@ -188,16 +249,52 @@ class FilmOut {
|
|||
return false;
|
||||
}
|
||||
}
|
||||
//console.dir(info)
|
||||
this.state.frame = 0;
|
||||
this.state.path = arg.path;
|
||||
this.state.fileName = arg.fileName;
|
||||
this.state.frames = frames;
|
||||
this.state.info = info;
|
||||
this.state.hash = this.hash(arg.path);
|
||||
if (info.fps) {
|
||||
this.state.fps = info.fps;
|
||||
}
|
||||
else {
|
||||
this.state.fps = 24; //default
|
||||
}
|
||||
if (info.seconds) {
|
||||
this.state.seconds = info.seconds;
|
||||
}
|
||||
else if (info.fps && frames) {
|
||||
this.state.seconds = frames / info.fps;
|
||||
}
|
||||
else if (this.state.directory) {
|
||||
this.state.seconds = frames / 24;
|
||||
}
|
||||
this.log.info(`Opened ${this.state.fileName}`, 'FILMOUT', true, true);
|
||||
this.log.info(`Frames : ${frames}`, 'FILMOUT', true, true);
|
||||
this.state.enabled = true;
|
||||
return await this.ui.send(this.id, { valid: true, state: JSON.stringify(this.state) });
|
||||
await this.ui.send(this.id, { valid: true, state: JSON.stringify(this.state) });
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* Pre-export all frames from video for display.
|
||||
*
|
||||
* @param {object} evt IPC event
|
||||
* @param {object} arg IPC args
|
||||
*
|
||||
* @returns {any} UI send call
|
||||
*/
|
||||
async onPreExport(evt, arg) {
|
||||
if (!this.state.path) {
|
||||
return await this.ui.send('pre_export', { complete: false, err: 'No file to pre export.' });
|
||||
}
|
||||
try {
|
||||
await this.ffmpeg.frames(this.state);
|
||||
}
|
||||
catch (err) {
|
||||
return await this.ui.send('pre_export', { complete: false, err });
|
||||
}
|
||||
return await this.ui.send('pre_export', { complete: true });
|
||||
}
|
||||
/**
|
||||
* Return true if gif is animated, false if it is a still
|
||||
|
@ -209,23 +306,77 @@ class FilmOut {
|
|||
async isGifAnimated(pathStr) {
|
||||
let gifBuffer;
|
||||
try {
|
||||
gifBuffer = await fs_extra_1.readFile(pathStr);
|
||||
gifBuffer = await (0, fs_extra_1.readFile)(pathStr);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err, 'FILMOUT', true, true);
|
||||
return false;
|
||||
}
|
||||
return animated_gif_detector_1.default(gifBuffer);
|
||||
return (0, animated_gif_detector_1.default)(gifBuffer);
|
||||
}
|
||||
/**
|
||||
* Return information on a still image using the sharp module
|
||||
* Return information on a still image using the Jimp module
|
||||
*
|
||||
* @param {string} pathStr Path to gif to check
|
||||
*
|
||||
* @returns {object} Info about still from sharp
|
||||
**/
|
||||
async stillInfo(pathStr) {
|
||||
return sharp_1.default(pathStr).metadata();
|
||||
let info;
|
||||
try {
|
||||
info = await frame_1.default.info(pathStr);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err, 'FILMOUT', true, true);
|
||||
}
|
||||
return info;
|
||||
}
|
||||
/**
|
||||
* Return information on the first still image found in a
|
||||
* directory using the Jimp module.
|
||||
*
|
||||
* @param {array} images List of image paths
|
||||
*
|
||||
* @returns {object} Info about first image
|
||||
**/
|
||||
async dirInfo(images) {
|
||||
let info;
|
||||
try {
|
||||
info = await this.stillInfo(images[0]);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err, 'FILMOUT', true, true);
|
||||
}
|
||||
return info;
|
||||
}
|
||||
/**
|
||||
* Returns a list of images within a directory, filtered
|
||||
* for supported types and sorted.
|
||||
*
|
||||
* @param {string} pathStr Path to directory
|
||||
*
|
||||
* @returns {array} Array of image paths
|
||||
**/
|
||||
async dirList(pathStr) {
|
||||
let frameList = [];
|
||||
try {
|
||||
frameList = await (0, fs_extra_1.readdir)(pathStr);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err, 'FILMOUT', true, true);
|
||||
}
|
||||
frameList = frameList.filter((fileName) => {
|
||||
let ext = (0, path_1.extname)(fileName);
|
||||
if (this.sequenceExtensions.indexOf(ext) !== -1) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
frameList.sort();
|
||||
frameList = frameList.map((fileName) => {
|
||||
return (0, path_1.join)(pathStr, fileName);
|
||||
});
|
||||
return frameList;
|
||||
}
|
||||
/**
|
||||
* Preview a frame from the selected video.
|
||||
|
@ -242,13 +393,12 @@ class FilmOut {
|
|||
}
|
||||
catch (err) {
|
||||
this.log.error(err, 'FILMOUT', true, true);
|
||||
;
|
||||
throw err;
|
||||
}
|
||||
this.ui.send('preview_frame', { path, frame: arg.frame });
|
||||
}
|
||||
/**
|
||||
*
|
||||
* Open a single frame in a display window to preview filmout.
|
||||
*
|
||||
* @param {object} evt Original event
|
||||
* @param {object} arg Arguments from message
|
||||
|
@ -266,8 +416,11 @@ class FilmOut {
|
|||
throw err;
|
||||
}
|
||||
try {
|
||||
if (await this.server.displayImage(path)) {
|
||||
return;
|
||||
}
|
||||
await this.display.open();
|
||||
await this.display.show(arg.frame);
|
||||
await this.display.show(path);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err, 'FILMOUT', true, true);
|
||||
|
@ -279,6 +432,9 @@ class FilmOut {
|
|||
async focus(evt, arg) {
|
||||
this.log.info(`Showing focus screen`);
|
||||
try {
|
||||
if (await this.server.cmdAll('focus')) {
|
||||
return;
|
||||
}
|
||||
await this.display.open();
|
||||
await this.display.focus();
|
||||
}
|
||||
|
@ -293,6 +449,9 @@ class FilmOut {
|
|||
const ratio = arg.ratio;
|
||||
this.log.info(`Showing field guide screen`);
|
||||
try {
|
||||
if (await this.server.cmdAll('field', { ratio })) {
|
||||
return;
|
||||
}
|
||||
await this.display.open();
|
||||
await this.display.field(ratio);
|
||||
}
|
||||
|
@ -306,6 +465,9 @@ class FilmOut {
|
|||
async meter(evt, arg) {
|
||||
this.log.info(`Showing meter screen`);
|
||||
try {
|
||||
if (await this.server.cmdAll('meter')) {
|
||||
return;
|
||||
}
|
||||
await this.display.open();
|
||||
await this.display.meter();
|
||||
}
|
||||
|
@ -318,6 +480,9 @@ class FilmOut {
|
|||
**/
|
||||
async close(evt, arg) {
|
||||
try {
|
||||
if (await this.server.cmdAll('blank')) {
|
||||
return;
|
||||
}
|
||||
await this.display.hide();
|
||||
await this.display.close();
|
||||
}
|
||||
|
@ -333,7 +498,7 @@ class FilmOut {
|
|||
this.log.info(`Changing the display to ${arg.display}`);
|
||||
}
|
||||
}
|
||||
module.exports = (display, ffmpeg, ffprobe, ui, light) => {
|
||||
return new FilmOut(display, ffmpeg, ffprobe, ui, light);
|
||||
module.exports = (display, server, ffmpeg, ffprobe, ui, light) => {
|
||||
return new FilmOut(display, server, ffmpeg, ffprobe, ui, light);
|
||||
};
|
||||
//# sourceMappingURL=index.js.map
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,15 @@
|
|||
interface RGBA {
|
||||
r: number;
|
||||
g: number;
|
||||
b: number;
|
||||
a: number;
|
||||
}
|
||||
export default class Frame {
|
||||
static info(imagePath: string): Promise<{
|
||||
width: any;
|
||||
height: any;
|
||||
}>;
|
||||
static solidColor(width: number, height: number, color: RGBA): Promise<unknown>;
|
||||
static blend(inPath: any, color: RGBA, imagePath: string): Promise<string>;
|
||||
}
|
||||
export {};
|
|
@ -0,0 +1,70 @@
|
|||
'use strict';
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const jimp_1 = __importDefault(require("jimp"));
|
||||
class Frame {
|
||||
static async info(imagePath) {
|
||||
let image;
|
||||
try {
|
||||
image = await jimp_1.default.read(imagePath);
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
}
|
||||
return {
|
||||
width: image.bitmap.width,
|
||||
height: image.bitmap.height
|
||||
};
|
||||
}
|
||||
static async solidColor(width, height, color) {
|
||||
//@ts-ignore
|
||||
const colorInt = jimp_1.default.rgbaToInt(color.r, color.g, color.b, color.a);
|
||||
return new Promise((resolve, reject) => {
|
||||
return new jimp_1.default(width, height, colorInt, (err, image) => {
|
||||
if (err) {
|
||||
return reject(err);
|
||||
}
|
||||
return resolve(image);
|
||||
});
|
||||
});
|
||||
}
|
||||
static async blend(inPath, color, imagePath) {
|
||||
//cmd2 = `${this.convert} "${tmpoutput}" -resize ${w}x${h} -size ${w}x${h} xc:"rgb(${rgb[0]},${rgb[1]},${rgb[2]})" +swap -compose Darken -composite "${tmpoutput}"`;
|
||||
const options = {
|
||||
mode: jimp_1.default.BLEND_DARKEN,
|
||||
opacitySource: 1.0,
|
||||
opacityDest: 1.0
|
||||
};
|
||||
let width;
|
||||
let height;
|
||||
let bottom;
|
||||
let top;
|
||||
try {
|
||||
top = await jimp_1.default.read(inPath);
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
}
|
||||
width = top.bitmap.width;
|
||||
height = top.bitmap.height;
|
||||
try {
|
||||
bottom = await Frame.solidColor(width, height, color);
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
}
|
||||
bottom.composite(top, 0, 0, options);
|
||||
try {
|
||||
await bottom.writeAsync(imagePath);
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
}
|
||||
return imagePath;
|
||||
}
|
||||
}
|
||||
exports.default = Frame;
|
||||
module.exports = Frame;
|
||||
//# sourceMappingURL=index.js.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/frame/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;;;AAEb,gDAAwB;AASxB,MAAqB,KAAK;IACzB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAE,SAAkB;QACpC,IAAI,KAAW,CAAC;QAChB,IAAI;YACH,KAAK,GAAG,MAAM,cAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SACnC;QAAC,OAAO,GAAG,EAAE;YACb,MAAM,GAAG,CAAC;SACV;QACD,OAAO;YACN,KAAK,EAAG,KAAK,CAAC,MAAM,CAAC,KAAK;YAC1B,MAAM,EAAG,KAAK,CAAC,MAAM,CAAC,MAAM;SAC5B,CAAC;IACH,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,UAAU,CAAE,KAAc,EAAE,MAAe,EAAE,KAAY;QACrE,YAAY;QACZ,MAAM,QAAQ,GAAY,cAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAkB,EAAE,MAAiB,EAAE,EAAE;YAC5D,OAAO,IAAI,cAAI,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;gBACrD,IAAI,GAAG,EAAE;oBACR,OAAO,MAAM,CAAC,GAAG,CAAC,CAAA;iBAClB;gBACD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,KAAK,CAAE,MAAY,EAAE,KAAY,EAAE,SAAkB;QACjE,oKAAoK;QACpK,MAAM,OAAO,GAAS;YACrB,IAAI,EAAE,cAAI,CAAC,YAAY;YACvB,aAAa,EAAE,GAAG;YAClB,WAAW,EAAE,GAAG;SAChB,CAAC;QACF,IAAI,KAAc,CAAC;QACnB,IAAI,MAAe,CAAC;QACpB,IAAI,MAAY,CAAC;QACjB,IAAI,GAAS,CAAC;QAEd,IAAI;YACH,GAAG,GAAG,MAAM,cAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAC9B;QAAC,OAAO,GAAG,EAAE;YACb,MAAM,GAAG,CAAC;SACV;QAED,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;QACzB,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;QAE3B,IAAI;YACH,MAAM,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;SACtD;QAAC,OAAO,GAAG,EAAE;YACb,MAAM,GAAG,CAAC;SACV;QAED,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QAErC,IAAI;YACH,MAAM,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;SACnC;QAAC,OAAO,GAAG,EAAE;YACb,MAAM,GAAG,CAAC;SACV;QAED,OAAO,SAAS,CAAC;IAClB,CAAC;CACD;AA/DD,wBA+DC;AAED,MAAM,CAAC,OAAO,GAAG,KAAK,CAAA"}
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"name": "exit",
|
||||
"name": "frame",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
|
@ -0,0 +1,9 @@
|
|||
export declare class Intval {
|
||||
private _baseUrl;
|
||||
private req;
|
||||
constructor(url: string);
|
||||
move(): Promise<unknown>;
|
||||
setDir(dir: boolean): Promise<unknown>;
|
||||
setExposure(exposure: number, cb: Function): Promise<unknown>;
|
||||
connect(cb: Function): void;
|
||||
}
|
|
@ -1,4 +1,6 @@
|
|||
'use strict';
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Intval = void 0;
|
||||
class Intval {
|
||||
constructor(url) {
|
||||
this._baseUrl = `http://${url}`;
|
||||
|
@ -64,5 +66,6 @@ class Intval {
|
|||
});
|
||||
}
|
||||
}
|
||||
exports.Intval = Intval;
|
||||
module.exports.Intval = Intval;
|
||||
//# sourceMappingURL=index.js.map
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/intval/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,MAAM,MAAM;IAGX,YAAa,GAAY;QACxB,IAAI,CAAC,QAAQ,GAAG,UAAU,GAAG,EAAE,CAAA;QAC/B,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;IAC9B,CAAC;IACM,KAAK,CAAC,IAAI;QAChB,OAAO,IAAI,OAAO,CAAE,CAAC,OAAa,EAAE,MAAY,EAAE,EAAE;YACnD,MAAM,SAAS,GAAY,CAAC,IAAI,IAAI,EAAE,CAAA;YACtC,MAAM,GAAG,GAAY,GAAG,IAAI,CAAC,QAAQ,QAAQ,CAAA;YAC7C,kBAAkB;YAClB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAW,EAAE,GAAS,EAAE,IAAa,EAAE,EAAE;gBAC9D,IAAI,EAAE,GAAY,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,SAAS,CAAA;gBAC3C,IAAI,GAAG,EAAE;oBACR,OAAO,MAAM,CAAC,GAAG,CAAC,CAAA;iBAClB;gBACD,OAAO,OAAO,CAAC,EAAE,CAAC,CAAA;YACnB,CAAC,CAAC,CAAA;QACH,CAAC,CAAC,CAAA;IACH,CAAC;IACM,KAAK,CAAC,MAAM,CAAE,GAAa;QACjC,OAAO,IAAI,OAAO,CAAE,CAAC,OAAa,EAAE,MAAY,EAAE,EAAE;YACnD,MAAM,SAAS,GAAY,CAAC,IAAI,IAAI,EAAE,CAAA;YACtC,MAAM,GAAG,GAAY,GAAG,IAAI,CAAC,QAAQ,YAAY,GAAG,EAAE,CAAA;YACtD,kBAAkB;YAClB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAW,EAAE,GAAS,EAAE,IAAa,EAAE,EAAE;gBAC9D,IAAI,EAAE,GAAY,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,SAAS,CAAA;gBAC3C,IAAI,GAAG,EAAE;oBACR,OAAO,MAAM,CAAC,GAAG,CAAC,CAAA;iBAClB;gBACD,OAAO,OAAO,CAAC,EAAE,CAAC,CAAA;YACnB,CAAC,CAAC,CAAA;QACH,CAAC,CAAC,CAAA;IACH,CAAC;IACM,KAAK,CAAC,WAAW,CAAE,QAAiB,EAAE,EAAa;QACzD,OAAO,IAAI,OAAO,CAAE,CAAC,OAAa,EAAE,MAAY,EAAE,EAAE;YACnD,MAAM,SAAS,GAAY,CAAC,IAAI,IAAI,EAAE,CAAA;YACtC,MAAM,GAAG,GAAY,GAAG,IAAI,CAAC,QAAQ,sBAAsB,QAAQ,EAAE,CAAA;YACrE,kBAAkB;YAClB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAW,EAAE,GAAS,EAAE,IAAa,EAAE,EAAE;gBAC9D,IAAI,EAAE,GAAY,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,SAAS,CAAA;gBAC3C,IAAI,GAAG,EAAE;oBACR,OAAO,MAAM,CAAC,GAAG,CAAC,CAAA;iBAClB;gBACD,OAAO,OAAO,CAAC,EAAE,CAAC,CAAA;YACnB,CAAC,CAAC,CAAA;QACH,CAAC,CAAC,CAAA;IACH,CAAC;IACM,OAAO,CAAE,EAAa;QAC5B,MAAM,SAAS,GAAY,CAAC,IAAI,IAAI,EAAE,CAAA;QACtC,MAAM,GAAG,GAAY,GAAG,IAAI,CAAC,QAAQ,SAAS,CAAA;QAC9C,MAAM,IAAI,GAAS;YAClB,MAAM,EAAG,KAAK;YACd,GAAG,EAAG,GAAG;YACT,OAAO,EAAE,IAAI;SACb,CAAA;QAED,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAW,EAAE,GAAS,EAAE,IAAa,EAAE,EAAE;YACxD,IAAI,EAAE,GAAY,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,SAAS,CAAA;YAC3C,IAAI,GAAG,EAAE;gBACR,oBAAoB;gBACpB,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;aAClB;YACD,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAA;QACnB,CAAC,CAAC,CAAA;IACH,CAAC;CACD;AAED,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAA"}
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/intval/index.ts"],"names":[],"mappings":"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"}
|
|
@ -0,0 +1 @@
|
|||
export {};
|
|
@ -27,7 +27,7 @@ class Light {
|
|||
*
|
||||
**/
|
||||
listen() {
|
||||
this.ipc.on(this.id, this.listener.bind(this));
|
||||
this.ipc.handle(this.id, this.listener.bind(this));
|
||||
}
|
||||
/**
|
||||
*
|
||||
|
@ -47,29 +47,29 @@ class Light {
|
|||
else if (typeof arg.disable !== 'undefined') {
|
||||
this.enabled = false;
|
||||
}
|
||||
event.returnValue = true;
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
async set(rgb, id, on) {
|
||||
async set(rgb, id, on = true) {
|
||||
const str = rgb.join(',');
|
||||
let ms;
|
||||
this.state.color = rgb;
|
||||
try {
|
||||
ms = this.arduino.send(this.id, this.cfg.arduino.cmd.light);
|
||||
ms = await this.arduino.send(this.id, this.cfg.arduino.cmd.light);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error sending light command', err);
|
||||
}
|
||||
await delay_1.delay(1);
|
||||
await (0, delay_1.delay)(1);
|
||||
try {
|
||||
this.arduino.string(this.id, str);
|
||||
this.arduino.sendString(this.id, str);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error sending light string', err);
|
||||
}
|
||||
await delay_1.delay(1);
|
||||
await (0, delay_1.delay)(1);
|
||||
await ms;
|
||||
return await this.end(rgb, id, ms);
|
||||
}
|
||||
|
@ -77,8 +77,18 @@ class Light {
|
|||
*
|
||||
**/
|
||||
async end(rgb, id, ms) {
|
||||
let res;
|
||||
//console.trace()
|
||||
this.log.info(`Light set to ${rgb.join(',')}`, 'LIGHT', true, true);
|
||||
return await this.ui.send(this.id, { rgb: rgb, id: id, ms: ms });
|
||||
try {
|
||||
//console.dir({ rgb, id, ms })
|
||||
res = await this.ui.send(this.id, { rgb, id, ms });
|
||||
}
|
||||
catch (err) {
|
||||
console.error(err);
|
||||
throw err;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
}
|
||||
module.exports = function (arduino, cfg, ui) {
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/light/index.ts"],"names":[],"mappings":"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"}
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/light/index.ts"],"names":[],"mappings":"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"}
|
|
@ -0,0 +1 @@
|
|||
export {};
|
|
@ -13,23 +13,34 @@ let transport;
|
|||
* @returns {string} Path to log file
|
||||
**/
|
||||
async function logFile() {
|
||||
const homeDir = os_1.homedir();
|
||||
const linuxDir = `/.config/mcopy/`;
|
||||
const homeDir = (0, os_1.homedir)();
|
||||
const linuxDir = `/.mcopy/`;
|
||||
const macDir = `/Library/Logs/mcopy/`;
|
||||
const winDir = `/AppData/Roaming/mcopy/`;
|
||||
let logPath = path_1.join(homeDir, linuxDir);
|
||||
let logPath = (0, path_1.normalize)((0, path_1.join)(homeDir, linuxDir));
|
||||
let dirExists;
|
||||
if (process.platform === 'darwin') {
|
||||
logPath = path_1.join(homeDir, macDir);
|
||||
logPath = (0, path_1.normalize)((0, path_1.join)(homeDir, macDir));
|
||||
}
|
||||
else if (process.platform === 'win32') {
|
||||
logPath = path_1.join(homeDir, winDir);
|
||||
logPath = (0, path_1.normalize)((0, path_1.join)(homeDir, winDir));
|
||||
}
|
||||
try {
|
||||
dirExists = await (0, fs_extra_1.exists)(logPath);
|
||||
}
|
||||
catch (err) {
|
||||
console.error(err);
|
||||
}
|
||||
dirExists = await fs_extra_1.exists(logPath);
|
||||
if (!dirExists) {
|
||||
await fs_extra_1.mkdir(logPath);
|
||||
try {
|
||||
await (0, fs_extra_1.mkdir)(logPath);
|
||||
}
|
||||
catch (err) {
|
||||
console.error(`Error creating directory for mcopy log file, ${logPath}`);
|
||||
console.error(err);
|
||||
}
|
||||
}
|
||||
return path_1.join(logPath, 'mcopy.log');
|
||||
return (0, path_1.join)(logPath, 'mcopy.log');
|
||||
}
|
||||
/**
|
||||
* Create and return the logger transport based on settings determined in
|
||||
|
@ -39,7 +50,7 @@ async function logFile() {
|
|||
*
|
||||
* @returns {object} Logger transport
|
||||
**/
|
||||
module.exports = async function (arg) {
|
||||
module.exports = async function Log(arg) {
|
||||
let consoleFormat = {
|
||||
colorize: true
|
||||
};
|
||||
|
@ -59,7 +70,7 @@ module.exports = async function (arg) {
|
|||
consoleFormat.label = arg.label;
|
||||
fileFormat.label = arg.label;
|
||||
}
|
||||
transport = winston_1.createLogger({
|
||||
transport = (0, winston_1.createLogger)({
|
||||
format: winston_1.format.combine(winston_1.format.label({ label: arg.label || 'mcopy' }), winston_1.format.timestamp({
|
||||
format: 'YYYY-MM-DD HH:mm:ss'
|
||||
}), winston_1.format.printf((info) => `${info.timestamp} [${info.label}] ${info.level}: ${info.message}` + (info.splat !== undefined ? `${info.splat}` : " "))),
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/log/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,qCAA2D;AAC3D,+BAA4B;AAC5B,uCAAyC;AACzC,2BAA6B;AAE7B,MAAM,OAAO,GAAG,mBAAmB,CAAA;AACnC,IAAI,SAAe,CAAA;AAEnB;;;;;IAKI;AACJ,KAAK,UAAU,OAAO;IACrB,MAAM,OAAO,GAAY,YAAO,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAY,iBAAiB,CAAC;IAC5C,MAAM,MAAM,GAAY,sBAAsB,CAAC;IAC/C,MAAM,MAAM,GAAY,yBAAyB,CAAC;IAClD,IAAI,OAAO,GAAY,WAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC/C,IAAI,SAAmB,CAAC;IAExB,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE;QAClC,OAAO,GAAG,WAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;KAChC;SAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE;QACxC,OAAO,GAAG,WAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;KAChC;IACD,SAAS,GAAG,MAAM,iBAAM,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,SAAS,EAAE;QACf,MAAM,gBAAK,CAAC,OAAO,CAAC,CAAC;KACrB;IACD,OAAO,WAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AACnC,CAAC;AACD;;;;;;;IAOI;AACJ,MAAM,CAAC,OAAO,GAAG,KAAK,WAAW,GAAS;IACzC,IAAI,aAAa,GAAS;QACzB,QAAQ,EAAG,IAAI;KACf,CAAA;IACD,IAAI,UAAU,GAAS;QACtB,QAAQ,EAAG,MAAM,OAAO,EAAE;QAC1B,IAAI,EAAG,IAAI;KACX,CAAA;IACD,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE;QACrB,SAAS,GAAG;YACX,IAAI,EAAG,cAAc,OAAO,KAAK,CAAA,CAAC,CAAC;YACnC,IAAI,EAAG,cAAc,OAAO,KAAK,CAAA,CAAC,CAAC;YACnC,KAAK,EAAG,cAAc,OAAO,KAAK,CAAA,CAAC,CAAC;SACpC,CAAA;KACD;SAAM;QACN,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE;YACrB,aAAa,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;YAChC,UAAU,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;SAC7B;QACD,SAAS,GAAG,sBAAY,CAAC;YACxB,MAAM,EAAG,gBAAM,CAAC,OAAO,CACnB,gBAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAG,GAAG,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC,EACjD,gBAAM,CAAC,SAAS,CAAC;gBAChB,MAAM,EAAE,qBAAqB;aAC7B,CAAC,EACF,gBAAM,CAAC,MAAM,CAAC,CAAC,IAAU,EAAG,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,OAAO,EAAE,GAAC,CAAC,IAAI,CAAC,KAAK,KAAG,SAAS,CAAA,CAAC,CAAA,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA,CAAC,CAAA,GAAG,CAAC,CAAC,CAC7I;YACH,UAAU,EAAE;gBACX,IAAI,CAAC,oBAAU,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;gBACvC,IAAI,CAAC,oBAAU,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC;aACjC;SACD,CAAC,CAAA;KACF;IACD,OAAO,SAAS,CAAA;AACjB,CAAC,CAAA"}
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/log/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,qCAA2D;AAC3D,+BAAuC;AACvC,uCAAyC;AACzC,2BAA6B;AAE7B,MAAM,OAAO,GAAG,mBAAmB,CAAA;AACnC,IAAI,SAAe,CAAA;AAEnB;;;;;IAKI;AACJ,KAAK,UAAU,OAAO;IACrB,MAAM,OAAO,GAAY,IAAA,YAAO,GAAE,CAAC;IACnC,MAAM,QAAQ,GAAY,UAAU,CAAC;IACrC,MAAM,MAAM,GAAY,sBAAsB,CAAC;IAC/C,MAAM,MAAM,GAAY,yBAAyB,CAAC;IAClD,IAAI,OAAO,GAAY,IAAA,gBAAS,EAAC,IAAA,WAAI,EAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC1D,IAAI,SAAmB,CAAC;IAExB,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE;QAClC,OAAO,GAAG,IAAA,gBAAS,EAAC,IAAA,WAAI,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;KAC3C;SAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE;QACxC,OAAO,GAAG,IAAA,gBAAS,EAAC,IAAA,WAAI,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;KAC3C;IAED,IAAI;QACH,SAAS,GAAG,MAAM,IAAA,iBAAM,EAAC,OAAO,CAAC,CAAC;KAClC;IAAC,OAAO,GAAG,EAAE;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;KACnB;IAED,IAAI,CAAC,SAAS,EAAE;QACf,IAAI;YACH,MAAM,IAAA,gBAAK,EAAC,OAAO,CAAC,CAAC;SACrB;QAAC,OAAO,GAAG,EAAE;YACb,OAAO,CAAC,KAAK,CAAC,gDAAgD,OAAO,EAAE,CAAC,CAAC;YACzE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SACnB;KACD;IAED,OAAO,IAAA,WAAI,EAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AACnC,CAAC;AACD;;;;;;;IAOI;AACJ,MAAM,CAAC,OAAO,GAAG,KAAK,UAAU,GAAG,CAAE,GAAS;IAC7C,IAAI,aAAa,GAAS;QACzB,QAAQ,EAAG,IAAI;KACf,CAAA;IACD,IAAI,UAAU,GAAS;QACtB,QAAQ,EAAG,MAAM,OAAO,EAAE;QAC1B,IAAI,EAAG,IAAI;KACX,CAAA;IACD,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE;QACrB,SAAS,GAAG;YACX,IAAI,EAAG,cAAc,OAAO,KAAK,CAAA,CAAC,CAAC;YACnC,IAAI,EAAG,cAAc,OAAO,KAAK,CAAA,CAAC,CAAC;YACnC,KAAK,EAAG,cAAc,OAAO,KAAK,CAAA,CAAC,CAAC;SACpC,CAAA;KACD;SAAM;QACN,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE;YACrB,aAAa,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;YAChC,UAAU,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;SAC7B;QACD,SAAS,GAAG,IAAA,sBAAY,EAAC;YACxB,MAAM,EAAG,gBAAM,CAAC,OAAO,CACnB,gBAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAG,GAAG,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC,EACjD,gBAAM,CAAC,SAAS,CAAC;gBAChB,MAAM,EAAE,qBAAqB;aAC7B,CAAC,EACF,gBAAM,CAAC,MAAM,CAAC,CAAC,IAAU,EAAG,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,OAAO,EAAE,GAAC,CAAC,IAAI,CAAC,KAAK,KAAG,SAAS,CAAA,CAAC,CAAA,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA,CAAC,CAAA,GAAG,CAAC,CAAC,CAC7I;YACH,UAAU,EAAE;gBACX,IAAI,CAAC,oBAAU,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;gBACvC,IAAI,CAAC,oBAAU,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC;aACjC;SACD,CAAC,CAAA;KACF;IACD,OAAO,SAAS,CAAA;AACjB,CAAC,CAAA"}
|
|
@ -0,0 +1,249 @@
|
|||
/** @module lib/mscript */
|
||||
interface RGB extends Array<number> {
|
||||
[index: number]: number;
|
||||
}
|
||||
/** class Mscript */
|
||||
export default class Mscript {
|
||||
output: any;
|
||||
lines: string[];
|
||||
cam: number;
|
||||
cam2: number;
|
||||
proj: number;
|
||||
proj2: number;
|
||||
color: string;
|
||||
loops: any[];
|
||||
rec: number;
|
||||
two: string;
|
||||
three: string;
|
||||
four: string;
|
||||
arr: any[];
|
||||
meta: string[];
|
||||
target: number;
|
||||
dist: number;
|
||||
variables: any;
|
||||
/**
|
||||
* @constructor
|
||||
* Create new Mscript interpreter
|
||||
**/
|
||||
constructor();
|
||||
/**
|
||||
* Clear the state of the script
|
||||
*/
|
||||
clear(): void;
|
||||
/**
|
||||
* Main function, accepts multi-line string, parses into lines
|
||||
* and interprets the instructions from the text. Returns an array
|
||||
* of steps to be fed into the mcopy sequence.
|
||||
*
|
||||
* @param {string} text Mscript text to interpret
|
||||
* @param {function} callback Function to call when string is interpreted
|
||||
*
|
||||
* @returns {object} if callback is not provided
|
||||
*/
|
||||
interpret(text: string, callback?: Function): any;
|
||||
/**
|
||||
* Interprets variables for complex sequence behavior.
|
||||
* TODO: Fully implement, add test coverage
|
||||
*
|
||||
* @param {string} line Line containing a variable assignment
|
||||
*
|
||||
**/
|
||||
variable(line: string): void;
|
||||
/**
|
||||
* Replace variable with value at time of interpretation
|
||||
* TODO: Implement this please
|
||||
*
|
||||
* @param {string} line Line containing variable to be replaced with value
|
||||
*
|
||||
* @returns {string} New string to be interpreted
|
||||
**/
|
||||
variable_replace(line: string): string;
|
||||
/**
|
||||
* Interpret a basic two character command
|
||||
*
|
||||
* @param {string} line Line of script to interpret
|
||||
* @param {string} short The short command to use
|
||||
*/
|
||||
basic_cmd(line: string, short: string): void;
|
||||
/**
|
||||
* Start a new loop
|
||||
*
|
||||
* @param {string} line Line to evaluate as either loop or fade
|
||||
* @param {boolean} fade Flag as true if fade
|
||||
*/
|
||||
new_loop(line: string, fade?: boolean): void;
|
||||
/**
|
||||
* Close the most recent loop
|
||||
*
|
||||
* @param {string} line Line to interpret
|
||||
*/
|
||||
end_loop(line: string): void;
|
||||
/**
|
||||
* Move camera to explicitly-defined frame
|
||||
*
|
||||
* @param {string} line Line to interpret with camera move statement
|
||||
*/
|
||||
move_cam(line: string): void;
|
||||
/**
|
||||
* Move secondary camera to explicitly-defined frame
|
||||
*
|
||||
* @param {string} line Line to interpret with camera move statement
|
||||
*/
|
||||
move_cam2(line: string): void;
|
||||
/**
|
||||
* Move projector to explicitly-defined frame
|
||||
*
|
||||
* @param {string} line Line containing `move` statement to interpret
|
||||
*/
|
||||
move_proj(line: string): void;
|
||||
/**
|
||||
* Move projector to explicitly-defined frame
|
||||
*
|
||||
* @param {string} line Line containing `move` statement to interpret
|
||||
*/
|
||||
move_proj2(line: string): void;
|
||||
/**
|
||||
* Set the state of either the cam or projector
|
||||
*
|
||||
* @param line {string} String containing set statement
|
||||
*/
|
||||
set_state(line: string): void;
|
||||
/**
|
||||
* Return the last loop
|
||||
*
|
||||
* @returns {object}
|
||||
*/
|
||||
last_loop(): any;
|
||||
/**
|
||||
* Return the second-last loop
|
||||
*
|
||||
* @returns {object} Loop array
|
||||
*/
|
||||
parent_loop(): any;
|
||||
/**
|
||||
* Extract the loop count integer from a LOOP cmd
|
||||
*
|
||||
* @returns {integer} Loop count in string parsed into integer
|
||||
*/
|
||||
loop_count(str: string): number;
|
||||
/**
|
||||
* Execute a fade of frame length, from color to another color
|
||||
*
|
||||
* @param {string} line Line containing a fade initiator
|
||||
*/
|
||||
fade(line: string): void;
|
||||
/**
|
||||
* Extract the fade length integer from a FADE cmd
|
||||
*
|
||||
* @param {string} str Line containing the length of fade in frames
|
||||
*/
|
||||
fade_count(str: string): number;
|
||||
/**
|
||||
* Extract the start color from a string
|
||||
*
|
||||
* @param {string} str Line containing the start color value in a fade initiator
|
||||
*
|
||||
* @returns {array} Array containing RGB color values
|
||||
*/
|
||||
fade_start(str: string): RGB;
|
||||
/**
|
||||
* Extract the end color from a string
|
||||
*
|
||||
* @param {string} str Line containing the end color value in a fade initiator
|
||||
*
|
||||
* @returns {array} Array containing RGB color values
|
||||
*/
|
||||
fade_end(str: string): RGB;
|
||||
/**
|
||||
* Determine the state of a fade at a particular frame in the sequence, x
|
||||
*
|
||||
* @param {array} start Color the fade starts at
|
||||
* @param {array} end Color the fade finishes at
|
||||
* @param {integer} len Total length of the fade in frames
|
||||
* @param {integer} x Position of the fade to get color value of
|
||||
*
|
||||
* @returns {array} Array containing RGB color values
|
||||
*/
|
||||
fade_rgb(start: RGB, end: RGB, len: number, x: number): string;
|
||||
/**
|
||||
* Parse string into array of RGB color values. 0-255 octet.
|
||||
*
|
||||
* @param {string} str String containing only color values as `#,#,#`
|
||||
**/
|
||||
rgb(str: string): RGB;
|
||||
/**
|
||||
* Cast RGB color values as string
|
||||
*
|
||||
* @param {array} arr Array to join into string
|
||||
*
|
||||
* @returns {string} String of RGB values
|
||||
**/
|
||||
rgb_str(arr: RGB): string;
|
||||
/**
|
||||
* Increase the state of a specific object, such as the camera/projector,
|
||||
* by the value defined in val.
|
||||
*
|
||||
* @param {string} cmd String representing command to interpret and update state
|
||||
*/
|
||||
update(cmd: string, val?: number): void;
|
||||
/**
|
||||
* Split string on command, turn into array of commands
|
||||
* as long as count variable. Default 1.
|
||||
*
|
||||
* @param {string} str String to split
|
||||
* @param {string} cmd String representing command to split at
|
||||
*
|
||||
* @returns {array} Array containing commands
|
||||
*/
|
||||
str_to_arr(str: string, cmd: string): string[];
|
||||
/**
|
||||
* Split a string on a command to extract data for light array
|
||||
*
|
||||
* @param {string} str String containing light command
|
||||
* @param {string} cmd String representing command
|
||||
*
|
||||
* @returns {array} An RGB array containing the color values
|
||||
*/
|
||||
light_to_arr(str: string, cmd: string): RGB;
|
||||
/**
|
||||
* Split a string to extract an rgb color value
|
||||
*
|
||||
* @param {string} Color string assign to color property
|
||||
*/
|
||||
light_state(str: string): void;
|
||||
/**
|
||||
* Interpret a delay command
|
||||
*
|
||||
* @param {string} line String containing delay command
|
||||
**/
|
||||
delay(line: string): void;
|
||||
/**
|
||||
* Interpret an alert command
|
||||
*
|
||||
* @param {string} line String containing alert message
|
||||
**/
|
||||
alert(line: string): void;
|
||||
/**
|
||||
* Interpret an pause command
|
||||
*
|
||||
* @param {string} line String containing alert message
|
||||
**/
|
||||
pause(line: string): void;
|
||||
/**
|
||||
* Throw an error with specific message
|
||||
*
|
||||
* @param {string} msg Error message to print
|
||||
*/
|
||||
fail(msg: string): void;
|
||||
/**
|
||||
* Determine if array contains matching elements of
|
||||
* another array
|
||||
*
|
||||
* @param {Array} arr Original array to compare
|
||||
* @param {Array} arr2 Array to compare elements from
|
||||
*
|
||||
* @returns {boolean} Whether arr contains elements in arr2
|
||||
**/
|
||||
contains(arr: string[], arr2: string[]): boolean;
|
||||
}
|
||||
export {};
|
|
@ -1,4 +1,5 @@
|
|||
'use strict';
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const BLACK = '0,0,0';
|
||||
const WHITE = '255,255,255';
|
||||
const CMD = [
|
||||
|
@ -7,7 +8,35 @@ const CMD = [
|
|||
'BF',
|
||||
'CB',
|
||||
'PB',
|
||||
'BB'
|
||||
'BB',
|
||||
'C2F',
|
||||
'C2B',
|
||||
'CCF',
|
||||
'CCB',
|
||||
'P2F',
|
||||
'P2B',
|
||||
'PPF',
|
||||
'PPB',
|
||||
'CFCB',
|
||||
'CBCF',
|
||||
'PFPB',
|
||||
'PBPF'
|
||||
];
|
||||
const CAMERA_SECONDARY = [
|
||||
'C2F',
|
||||
'C2B',
|
||||
'CCF',
|
||||
'CCB',
|
||||
'CFCB',
|
||||
'CBCF'
|
||||
];
|
||||
const PROJECTOR_SECONDARY = [
|
||||
'P2F',
|
||||
'P2B',
|
||||
'PPF',
|
||||
'PPB',
|
||||
'PFPB',
|
||||
'PBPF'
|
||||
];
|
||||
const ALTS = {
|
||||
'CF': ['CAMERA FORWARD', 'CAM FORWARD'],
|
||||
|
@ -17,8 +46,21 @@ const ALTS = {
|
|||
'PB': ['PROJECTOR FORWARD', 'PROJ FORWARD', 'PROJECTOR BACK', 'PROJ BACK'],
|
||||
'BB': ['BLACK BACKWARD', 'BLACK BACK', 'BLANK BACK'],
|
||||
'L ': ['LIGHT', 'COLOR', 'LAMP'],
|
||||
'F ': ['FADE']
|
||||
'F ': ['FADE'],
|
||||
'C2F': ['CAMERA2 FORWARD', 'CAM2 FORWARD'],
|
||||
'C2B': ['CAMERA2 BACKWARD', 'CAM2 BACKWARD', 'CAMERA2 BACK', 'CAM2 BACK'],
|
||||
'CCF': ['CAMERAS FORWARD', 'CAMS FORWARD'],
|
||||
'CCB': ['CAMERAS BACKWARD', 'CAMS BACKWARD', 'CAMERAS BACK', 'CAMS BACK'],
|
||||
'P2F': ['PROJECTOR2 FORWARD', 'PROJ2 FORWARD'],
|
||||
'P2B': ['PROJECTOR2 BACKWARD', 'PROJ2 BACKWARD', 'PROJECTOR2 BACK', 'PROJ2 BACK'],
|
||||
'PPF': ['PROJECTORS FORWARD', 'PROJS FORWARD'],
|
||||
'PPB': ['PROJECTORS BACKWARD', 'PROJS BACKWARD', 'PROJECTORS BACK', 'PROJS BACK'],
|
||||
'CFCB': [],
|
||||
'CBCF': [],
|
||||
'PFPB': [],
|
||||
'PBPF': []
|
||||
};
|
||||
const DELAY = 'DELAY';
|
||||
const PAUSE = 'PAUSE';
|
||||
const ALERT = 'ALERT';
|
||||
/** helper functions */
|
||||
|
@ -56,11 +98,15 @@ class Mscript {
|
|||
clear() {
|
||||
this.lines = [];
|
||||
this.cam = 0;
|
||||
this.cam2 = 0;
|
||||
this.proj = 0;
|
||||
this.proj2 = 0;
|
||||
this.color = '';
|
||||
this.loops = [];
|
||||
this.rec = -1;
|
||||
this.two = '';
|
||||
this.three = '';
|
||||
this.four = '';
|
||||
this.arr = [];
|
||||
this.meta = [];
|
||||
this.target = 0; //move to target using CAM # or PROJ #
|
||||
|
@ -78,7 +124,7 @@ class Mscript {
|
|||
*
|
||||
* @returns {object} if callback is not provided
|
||||
*/
|
||||
interpret(text, callback) {
|
||||
interpret(text, callback = null) {
|
||||
this.clear();
|
||||
if (typeof text === 'undefined') {
|
||||
return this.fail('No input');
|
||||
|
@ -93,8 +139,19 @@ class Mscript {
|
|||
});
|
||||
for (let line of this.lines) {
|
||||
this.two = line.substring(0, 2);
|
||||
if (CMD.indexOf(this.two) !== -1) {
|
||||
this.basic_cmd(line);
|
||||
this.three = line.substring(0, 3);
|
||||
this.four = line.substring(0, 4);
|
||||
if (CMD.indexOf(this.four) !== -1) {
|
||||
this.basic_cmd(line, this.four);
|
||||
}
|
||||
else if (CMD.indexOf(this.three) !== -1) {
|
||||
this.basic_cmd(line, this.three);
|
||||
}
|
||||
else if (CMD.indexOf(this.two) !== -1) {
|
||||
this.basic_cmd(line, this.two);
|
||||
}
|
||||
else if (startsWith(line, DELAY)) {
|
||||
this.delay(line);
|
||||
}
|
||||
else if (startsWith(line, PAUSE)) {
|
||||
this.pause(line);
|
||||
|
@ -117,9 +174,15 @@ class Mscript {
|
|||
else if (startsWith(line, 'END')) {
|
||||
this.end_loop(line);
|
||||
}
|
||||
else if (startsWith(line, 'CAM')) { //directly go to that frame (black?)
|
||||
else if (startsWith(line, 'CAM2')) { //directly go to that frame
|
||||
this.move_cam2(line);
|
||||
}
|
||||
else if (startsWith(line, 'CAM')) { //directly go to that frame
|
||||
this.move_cam(line);
|
||||
}
|
||||
else if (startsWith(line, 'PROJ2')) { //directly go to that frame
|
||||
this.move_proj2(line);
|
||||
}
|
||||
else if (startsWith(line, 'PROJ')) { //directly go to that frame
|
||||
this.move_proj(line);
|
||||
}
|
||||
|
@ -130,18 +193,19 @@ class Mscript {
|
|||
//comments
|
||||
//ignore while parsing
|
||||
}
|
||||
else if (startsWith(line, 'ALERT')) {
|
||||
}
|
||||
else if (startsWith(line, 'PAUSE')) {
|
||||
this.pause(line);
|
||||
}
|
||||
}
|
||||
this.output.success = true;
|
||||
this.output.arr = this.arr; //all instructions
|
||||
this.output.meta = this.meta; //all metadata for instructions
|
||||
this.output.cam = this.cam;
|
||||
this.output.proj = this.proj;
|
||||
if (typeof callback !== 'undefined') {
|
||||
if (this.contains(this.arr, CAMERA_SECONDARY)) {
|
||||
this.output.cam2 = this.cam2;
|
||||
}
|
||||
if (this.contains(this.arr, PROJECTOR_SECONDARY)) {
|
||||
this.output.proj2 = this.proj2;
|
||||
}
|
||||
if (typeof callback !== 'undefined' && callback != null) {
|
||||
//should only be invoked by running mscript.tests()
|
||||
callback(this.output);
|
||||
}
|
||||
|
@ -203,25 +267,26 @@ class Mscript {
|
|||
* Interpret a basic two character command
|
||||
*
|
||||
* @param {string} line Line of script to interpret
|
||||
* @param {string} short The short command to use
|
||||
*/
|
||||
basic_cmd(line) {
|
||||
basic_cmd(line, short) {
|
||||
if (this.rec !== -1) {
|
||||
//hold generated arr in state loop array
|
||||
this.loops[this.rec].arr
|
||||
.push.apply(this.loops[this.rec].arr, this.str_to_arr(line, this.two));
|
||||
.push.apply(this.loops[this.rec].arr, this.str_to_arr(line, short));
|
||||
this.loops[this.rec].meta
|
||||
.push.apply(this.loops[this.rec].meta, this.light_to_arr(line, this.two));
|
||||
.push.apply(this.loops[this.rec].meta, this.light_to_arr(line, short));
|
||||
}
|
||||
else {
|
||||
this.arr.push.apply(this.arr, this.str_to_arr(line, this.two));
|
||||
this.meta.push.apply(this.meta, this.light_to_arr(line, this.two));
|
||||
this.arr.push.apply(this.arr, this.str_to_arr(line, short));
|
||||
this.meta.push.apply(this.meta, this.light_to_arr(line, short));
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Start a new loop
|
||||
*
|
||||
* @param {string} line Line to evaluate as either loop or fade
|
||||
* @param {boolean} fade Flag as boolean if true
|
||||
* @param {boolean} fade Flag as true if fade
|
||||
*/
|
||||
new_loop(line, fade) {
|
||||
this.rec++;
|
||||
|
@ -230,6 +295,8 @@ class Mscript {
|
|||
meta: [],
|
||||
cam: 0,
|
||||
proj: 0,
|
||||
cam2: 0,
|
||||
proj2: 0,
|
||||
cmd: line + ''
|
||||
};
|
||||
if (fade) {
|
||||
|
@ -315,6 +382,50 @@ class Mscript {
|
|||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Move secondary camera to explicitly-defined frame
|
||||
*
|
||||
* @param {string} line Line to interpret with camera move statement
|
||||
*/
|
||||
move_cam2(line) {
|
||||
this.target = parseInt(line.split('CAM2 ')[1]);
|
||||
if (this.rec !== -1) {
|
||||
if (this.target > this.cam2) {
|
||||
this.dist = this.target - this.cam2;
|
||||
for (let x = 0; x < this.dist; x++) {
|
||||
this.loops[this.rec].arr.push('C2F');
|
||||
this.loops[this.rec].meta.push(BLACK);
|
||||
this.update('C2F');
|
||||
}
|
||||
}
|
||||
else {
|
||||
this.dist = this.cam2 - this.target;
|
||||
for (let x = 0; x < this.dist; x++) {
|
||||
this.loops[this.rec].arr.push('C2B');
|
||||
this.loops[this.rec].meta.push(BLACK);
|
||||
this.update('C2B');
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (this.target > this.cam2) {
|
||||
this.dist = this.target - this.cam2;
|
||||
for (let x = 0; x < this.dist; x++) {
|
||||
this.arr.push('C2F');
|
||||
this.meta.push(BLACK);
|
||||
this.update('C2F');
|
||||
}
|
||||
}
|
||||
else {
|
||||
this.dist = this.cam2 - this.target;
|
||||
for (let x = 0; x < this.dist; x++) {
|
||||
this.arr.push('C2B');
|
||||
this.meta.push(BLACK);
|
||||
this.update('C2B');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Move projector to explicitly-defined frame
|
||||
*
|
||||
|
@ -359,13 +470,63 @@ class Mscript {
|
|||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Move projector to explicitly-defined frame
|
||||
*
|
||||
* @param {string} line Line containing `move` statement to interpret
|
||||
*/
|
||||
move_proj2(line) {
|
||||
this.target = parseInt(line.split('PROJ2 ')[1]);
|
||||
if (this.rec !== -1) {
|
||||
if (this.target > this.proj2) {
|
||||
this.dist = this.target - this.proj2;
|
||||
for (let x = 0; x < this.dist; x++) {
|
||||
this.loops[this.rec].arr.push('P2F');
|
||||
this.loops[this.rec].meta.push('');
|
||||
this.update('P2F');
|
||||
}
|
||||
}
|
||||
else {
|
||||
this.dist = this.proj2 - this.target;
|
||||
for (let x = 0; x < this.dist; x++) {
|
||||
this.loops[this.rec].arr.push('P2B');
|
||||
this.loops[this.rec].meta.push('');
|
||||
this.update('P2B');
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (this.target > this.proj2) {
|
||||
this.dist = this.target - this.proj2;
|
||||
for (let x = 0; x < this.dist; x++) {
|
||||
this.arr.push('P2F');
|
||||
this.meta.push('');
|
||||
this.update('P2F');
|
||||
}
|
||||
}
|
||||
else {
|
||||
this.dist = this.proj2 - this.target;
|
||||
for (let x = 0; x < this.dist; x++) {
|
||||
this.arr.push('P2B');
|
||||
this.meta.push('');
|
||||
this.update('P2B');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Set the state of either the cam or projector
|
||||
*
|
||||
* @param line {string} String containing set statement
|
||||
*/
|
||||
set_state(line) {
|
||||
if (startsWith(line, 'SET CAM')) {
|
||||
if (startsWith(line, 'SET CAM2')) {
|
||||
parseInt(line.split('SET CAM2')[1]);
|
||||
}
|
||||
else if (startsWith(line, 'SET PROJ2')) {
|
||||
this.cam2 = parseInt(line.split('SET PROJ2')[1]);
|
||||
}
|
||||
else if (startsWith(line, 'SET CAM')) {
|
||||
this.cam = parseInt(line.split('SET CAM')[1]);
|
||||
}
|
||||
else if (startsWith(line, 'SET PROJ')) {
|
||||
|
@ -523,7 +684,7 @@ class Mscript {
|
|||
this.cam -= val;
|
||||
}
|
||||
else {
|
||||
this.loops[this.rec].cam--;
|
||||
this.loops[this.rec].cam -= val;
|
||||
}
|
||||
}
|
||||
else if (cmd === 'PF') {
|
||||
|
@ -539,7 +700,7 @@ class Mscript {
|
|||
this.proj -= val;
|
||||
}
|
||||
else {
|
||||
this.loops[this.rec].proj--;
|
||||
this.loops[this.rec].proj -= val;
|
||||
}
|
||||
}
|
||||
else if (cmd === 'BF') {
|
||||
|
@ -558,6 +719,118 @@ class Mscript {
|
|||
this.loops[this.rec].cam -= val;
|
||||
}
|
||||
}
|
||||
else if (cmd === 'C2F') {
|
||||
if (this.rec === -1) {
|
||||
this.cam2 += val;
|
||||
}
|
||||
else {
|
||||
this.loops[this.rec].cam2 += val;
|
||||
}
|
||||
}
|
||||
else if (cmd === 'C2B') {
|
||||
if (this.rec === -1) {
|
||||
this.cam2 -= val;
|
||||
}
|
||||
else {
|
||||
this.loops[this.rec].cam2 -= val;
|
||||
}
|
||||
}
|
||||
else if (cmd === 'CCF') {
|
||||
if (this.rec === -1) {
|
||||
this.cam += val;
|
||||
this.cam2 += val;
|
||||
}
|
||||
else {
|
||||
this.loops[this.rec].cam2 += val;
|
||||
this.loops[this.rec].cam2 += val;
|
||||
}
|
||||
}
|
||||
else if (cmd === 'CCB') {
|
||||
if (this.rec === -1) {
|
||||
this.cam -= val;
|
||||
this.cam2 -= val;
|
||||
}
|
||||
else {
|
||||
this.loops[this.rec].cam2 -= val;
|
||||
this.loops[this.rec].cam2 -= val;
|
||||
}
|
||||
}
|
||||
else if (cmd === 'P2F') {
|
||||
if (this.rec === -1) {
|
||||
this.proj2 += val;
|
||||
}
|
||||
else {
|
||||
this.loops[this.rec].proj2 += val;
|
||||
}
|
||||
}
|
||||
else if (cmd === 'P2B') {
|
||||
if (this.rec === -1) {
|
||||
this.proj2 -= val;
|
||||
}
|
||||
else {
|
||||
this.loops[this.rec].proj2 -= val;
|
||||
}
|
||||
}
|
||||
else if (cmd === 'PPF') {
|
||||
if (this.rec === -1) {
|
||||
this.proj += val;
|
||||
this.proj2 += val;
|
||||
}
|
||||
else {
|
||||
this.loops[this.rec].proj += val;
|
||||
this.loops[this.rec].proj2 += val;
|
||||
}
|
||||
}
|
||||
else if (cmd === 'PPB') {
|
||||
if (this.rec === -1) {
|
||||
this.proj -= val;
|
||||
this.proj2 -= val;
|
||||
}
|
||||
else {
|
||||
this.loops[this.rec].proj -= val;
|
||||
this.loops[this.rec].proj2 -= val;
|
||||
}
|
||||
}
|
||||
else if (cmd === 'CFCB') {
|
||||
if (this.rec === -1) {
|
||||
this.cam += val;
|
||||
this.cam2 -= val;
|
||||
}
|
||||
else {
|
||||
this.loops[this.rec].cam += val;
|
||||
this.loops[this.rec].cam2 -= val;
|
||||
}
|
||||
}
|
||||
else if (cmd === 'CBCF') {
|
||||
if (this.rec === -1) {
|
||||
this.cam -= val;
|
||||
this.cam2 += val;
|
||||
}
|
||||
else {
|
||||
this.loops[this.rec].cam -= val;
|
||||
this.loops[this.rec].cam2 += val;
|
||||
}
|
||||
}
|
||||
else if (cmd === 'PFPB') {
|
||||
if (this.rec === -1) {
|
||||
this.proj += val;
|
||||
this.proj2 -= val;
|
||||
}
|
||||
else {
|
||||
this.loops[this.rec].proj += val;
|
||||
this.loops[this.rec].proj2 -= val;
|
||||
}
|
||||
}
|
||||
else if (cmd === 'PBPF') {
|
||||
if (this.rec === -1) {
|
||||
this.proj -= val;
|
||||
this.proj2 += val;
|
||||
}
|
||||
else {
|
||||
this.loops[this.rec].proj -= val;
|
||||
this.loops[this.rec].proj2 += val;
|
||||
}
|
||||
}
|
||||
else if (cmd === 'L ') {
|
||||
}
|
||||
}
|
||||
|
@ -628,11 +901,11 @@ class Mscript {
|
|||
this.color = color;
|
||||
}
|
||||
/**
|
||||
* Interpret a pause command
|
||||
* Interpret a delay command
|
||||
*
|
||||
* @param {string} line String containing pause command
|
||||
* @param {string} line String containing delay command
|
||||
**/
|
||||
pause(line) {
|
||||
delay(line) {
|
||||
let lenStr = line.split(' ')[1] || '';
|
||||
let len;
|
||||
lenStr = lenStr.trim();
|
||||
|
@ -649,23 +922,42 @@ class Mscript {
|
|||
if (this.rec !== -1) {
|
||||
//hold generated arr in state loop array
|
||||
this.loops[this.rec].arr
|
||||
.push('PA');
|
||||
.push('DE');
|
||||
this.loops[this.rec].meta
|
||||
.push(lenStr);
|
||||
}
|
||||
else {
|
||||
this.arr.push('AL');
|
||||
this.arr.push('DE');
|
||||
this.meta.push(lenStr);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Interpret an alert command
|
||||
*
|
||||
* @param {string} line String containing pause command
|
||||
* @param {string} line String containing alert message
|
||||
**/
|
||||
alert(line) {
|
||||
let msg = line.split(' ')[1] || '';
|
||||
msg = msg.trim();
|
||||
if (this.rec !== -1) {
|
||||
//hold generated arr in state loop array
|
||||
this.loops[this.rec].arr
|
||||
.push('AL');
|
||||
this.loops[this.rec].meta
|
||||
.push(line);
|
||||
}
|
||||
else {
|
||||
this.arr.push('AL');
|
||||
this.meta.push(line);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Interpret an pause command
|
||||
*
|
||||
* @param {string} line String containing alert message
|
||||
**/
|
||||
pause(line) {
|
||||
const msg = "Paused script. Click OK to continue.";
|
||||
if (this.rec !== -1) {
|
||||
//hold generated arr in state loop array
|
||||
this.loops[this.rec].arr
|
||||
|
@ -686,6 +978,19 @@ class Mscript {
|
|||
fail(msg) {
|
||||
throw new Error(msg);
|
||||
}
|
||||
/**
|
||||
* Determine if array contains matching elements of
|
||||
* another array
|
||||
*
|
||||
* @param {Array} arr Original array to compare
|
||||
* @param {Array} arr2 Array to compare elements from
|
||||
*
|
||||
* @returns {boolean} Whether arr contains elements in arr2
|
||||
**/
|
||||
contains(arr, arr2) {
|
||||
return arr.some(r => arr2.includes(r));
|
||||
}
|
||||
}
|
||||
exports.default = Mscript;
|
||||
module.exports = Mscript;
|
||||
//# sourceMappingURL=index.js.map
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1 @@
|
|||
export {};
|
|
@ -0,0 +1,33 @@
|
|||
'use strict';
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const exec_1 = require("exec");
|
||||
class Processing {
|
||||
constructor(url) {
|
||||
this._baseUrl = (url.indexOf('http') === -1 && url.indexOf('://') === -1) ? `http://${url}` : url;
|
||||
}
|
||||
async move() {
|
||||
return new Promise(async (resolve, reject) => {
|
||||
const timeStart = +new Date();
|
||||
const url = `${this._baseUrl}`;
|
||||
const cmd = `curl --http0.9 ${url}`;
|
||||
let res;
|
||||
let ms;
|
||||
//console.log(url)
|
||||
try {
|
||||
res = await (0, exec_1.exec)(cmd);
|
||||
}
|
||||
catch (err) {
|
||||
return reject(err);
|
||||
}
|
||||
ms = (+new Date()) - timeStart;
|
||||
return resolve(ms);
|
||||
});
|
||||
}
|
||||
async setDir(dir) {
|
||||
return new Promise((resolve, reject) => {
|
||||
return resolve(0);
|
||||
});
|
||||
}
|
||||
}
|
||||
module.exports.Processing = Processing;
|
||||
//# sourceMappingURL=index.js.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/processing/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,+BAA4B;AAE5B,MAAM,UAAU;IAEf,YAAa,GAAY;QACxB,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAA;IAClG,CAAC;IAEM,KAAK,CAAC,IAAI;QAChB,OAAO,IAAI,OAAO,CAAE,KAAK,EAAE,OAAa,EAAE,MAAY,EAAE,EAAE;YACzD,MAAM,SAAS,GAAY,CAAC,IAAI,IAAI,EAAE,CAAA;YACtC,MAAM,GAAG,GAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;YACvC,MAAM,GAAG,GAAY,kBAAkB,GAAG,EAAE,CAAA;YAC5C,IAAI,GAAY,CAAA;YAChB,IAAI,EAAW,CAAA;YACf,kBAAkB;YAClB,IAAI;gBACH,GAAG,GAAG,MAAM,IAAA,WAAI,EAAC,GAAG,CAAC,CAAA;aACrB;YAAC,OAAO,GAAG,EAAE;gBACb,OAAO,MAAM,CAAC,GAAG,CAAC,CAAA;aAClB;YACD,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,SAAS,CAAA;YAC9B,OAAO,OAAO,CAAC,EAAE,CAAC,CAAA;QACnB,CAAC,CAAC,CAAA;IACH,CAAC;IACM,KAAK,CAAC,MAAM,CAAE,GAAa;QACjC,OAAO,IAAI,OAAO,CAAE,CAAC,OAAa,EAAE,MAAY,EAAE,EAAE;YACnD,OAAO,OAAO,CAAC,CAAC,CAAC,CAAA;QAClB,CAAC,CAAC,CAAA;IACH,CAAC;CACD;AAED,MAAM,CAAC,OAAO,CAAC,UAAU,GAAG,UAAU,CAAA"}
|
|
@ -0,0 +1,2 @@
|
|||
/** class representing the Projector features **/
|
||||
export {};
|
|
@ -59,6 +59,7 @@ class Projector {
|
|||
this.log.error(`Error setting ${this.id} direction`, err);
|
||||
}
|
||||
}
|
||||
console.dir(ms);
|
||||
return await this.end(cmd, id, ms);
|
||||
}
|
||||
/**
|
||||
|
@ -166,7 +167,7 @@ class Projector {
|
|||
}
|
||||
message += ` ${ms}ms`;
|
||||
this.log.info(message, 'PROJECTOR');
|
||||
return await this.ui.send(this.id, { cmd: cmd, id: id, ms: ms });
|
||||
return await this.ui.send(this.id, { cmd, id, ms });
|
||||
}
|
||||
}
|
||||
module.exports = function (arduino, cfg, ui, filmout, second) {
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1 @@
|
|||
export {};
|
|
@ -1,7 +1,11 @@
|
|||
'use strict';
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const Log = require("log");
|
||||
const electron_1 = require("electron");
|
||||
const delay_1 = __importDefault(require("delay"));
|
||||
/** @module lib/sequencer **/
|
||||
let seq;
|
||||
class Sequencer {
|
||||
|
@ -126,9 +130,9 @@ class Sequencer {
|
|||
* @param {object} arg Arguments from ipc message
|
||||
**/
|
||||
async start(arg) {
|
||||
const psbId = electron_1.powerSaveBlocker.start('prevent-display-sleep');
|
||||
let startTime = +new Date();
|
||||
let ms;
|
||||
this.psbId = electron_1.powerSaveBlocker.start('prevent-display-sleep');
|
||||
if (arg && arg.arr) {
|
||||
this.arr = arg.arr; //overwrite sequence
|
||||
}
|
||||
|
@ -146,7 +150,7 @@ class Sequencer {
|
|||
//start sequence
|
||||
this.log.info(`Starting sequence...`);
|
||||
this.ui.send(this.id, { start: true });
|
||||
if (this.cmd.proj.filmout.state.enabled === true) {
|
||||
if (this.cmd.proj.filmout.state.enabled === true && !this.cmd.proj.filmout.server.useServer()) {
|
||||
await this.cmd.proj.filmout.display.open();
|
||||
}
|
||||
for (let x = 0; x < this.loops; x++) {
|
||||
|
@ -160,7 +164,7 @@ class Sequencer {
|
|||
}
|
||||
//UI initiates pause, not planned
|
||||
while (this.paused) {
|
||||
await delay(42);
|
||||
await (0, delay_1.default)(42);
|
||||
}
|
||||
if (typeof this.arr[y] === 'undefined') {
|
||||
continue;
|
||||
|
@ -179,10 +183,10 @@ class Sequencer {
|
|||
this.log.info(`Ended loop ${x + 1}`);
|
||||
this.ui.send(this.id, { loop: x, stop: true });
|
||||
}
|
||||
if (this.cmd.proj.filmout.state.enabled === true) {
|
||||
if (this.cmd.proj.filmout.state.enabled === true && !this.cmd.proj.filmout.server.useServer()) {
|
||||
await this.cmd.proj.filmout.display.close();
|
||||
}
|
||||
electron_1.powerSaveBlocker.stop(this.psbId);
|
||||
electron_1.powerSaveBlocker.stop(psbId);
|
||||
this.psbId = null;
|
||||
ms = (+new Date()) - startTime;
|
||||
//end sequence
|
||||
|
@ -230,8 +234,7 @@ class Sequencer {
|
|||
const cmdOriginal = this.arr[x].cmd;
|
||||
const cmd = this.CMDS[cmdOriginal];
|
||||
this.log.info(`CMD: '${cmdOriginal}' -> ${cmd}`);
|
||||
//I wrote this when I was very tired and delirious
|
||||
return await this.cmd[cmd]();
|
||||
return await this.cmd[cmd](this.arr[x]);
|
||||
}
|
||||
}
|
||||
module.exports = function (cfg, cmd, ui) {
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1 @@
|
|||
export {};
|
|
@ -1,90 +1,204 @@
|
|||
'use script'
|
||||
|
||||
let os
|
||||
let restify
|
||||
let app
|
||||
|
||||
let cam
|
||||
let proj
|
||||
let light
|
||||
|
||||
const PACKAGE = require('../../package.json')
|
||||
|
||||
'use strict';
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const ws_1 = require("ws");
|
||||
const express_1 = __importDefault(require("express"));
|
||||
const promises_1 = require("fs/promises");
|
||||
const path_1 = require("path");
|
||||
const uuid_1 = require("uuid");
|
||||
const Log = require("log");
|
||||
class Server {
|
||||
constructor (camera, projector, light) {
|
||||
restify = require('restify')
|
||||
os = require('os')
|
||||
app = restify.createServer({
|
||||
name: 'mcopy-server',
|
||||
version: PACKAGE.version
|
||||
})
|
||||
|
||||
this.ip = this.getIp()
|
||||
|
||||
/*app.get('/', function (req, res) {
|
||||
mcopy.mobile.log('Device connected');
|
||||
res.send(fs.readFileSync('tmpl/mcopy_index.html', 'utf8'));
|
||||
})
|
||||
app.get('/js/mcopy_mobile.js', function (req, res) {
|
||||
res.send(fs.readFileSync('js/mcopy_mobile.js', 'utf8'));
|
||||
});
|
||||
app.get('/js/jquery.js', function (req, res) {
|
||||
res.send(fs.readFileSync('js/jquery.js', 'utf8'));
|
||||
});
|
||||
app.get('/cmd/:cmd', function (req, res) {
|
||||
var cmd,
|
||||
success = function (res) {
|
||||
var obj = {
|
||||
success: true,
|
||||
cmd : cmd,
|
||||
cam: {
|
||||
dir : cam.dir,
|
||||
pos : cam.pos
|
||||
},
|
||||
proj: {
|
||||
dir : proj.dir,
|
||||
pos : proj.pos
|
||||
}
|
||||
}
|
||||
res.json(obj);
|
||||
};
|
||||
if (typeof req.params.cmd !== 'undefined') {
|
||||
mcopy.log('Receiving command from mobile: ' + req.params.cmd);
|
||||
cmd = req.params.cmd;
|
||||
if (cmd === 'CF'){
|
||||
mcopy.cmd.camera_forward(success);
|
||||
} else if (cmd === 'CB') {
|
||||
mcopy.cmd.camera_backward(success);
|
||||
} else if (cmd === 'PF') {
|
||||
mcopy.cmd.projector_forward(success);
|
||||
} else if (cmd === 'PB') {
|
||||
mcopy.cmd.projector_backward(success);
|
||||
} else {
|
||||
mcopy.mobile.fail(res, 'Command ' + cmd + ' not found');
|
||||
}
|
||||
} else {
|
||||
mcopy.mobile.fail(res, 'No command provided');
|
||||
}
|
||||
});
|
||||
app.get('/state', function (req, res) {
|
||||
res.json({
|
||||
cam: {
|
||||
dir : cam.dir,
|
||||
pos : cam.pos
|
||||
},
|
||||
proj: {
|
||||
dir : proj.dir,
|
||||
pos : proj.pos
|
||||
}
|
||||
});
|
||||
});*/
|
||||
|
||||
|
||||
}
|
||||
end () {
|
||||
app.close()
|
||||
app = null
|
||||
}
|
||||
constructor(uiInput) {
|
||||
this.id = 'server';
|
||||
this.isActive = false;
|
||||
this.templates = [
|
||||
{
|
||||
name: 'index',
|
||||
path: 'server.html'
|
||||
},
|
||||
{
|
||||
name: 'script',
|
||||
path: 'lib/client/index.js'
|
||||
}
|
||||
];
|
||||
this.port = 9900;
|
||||
this.wsPort = 9901;
|
||||
this.proxy = {};
|
||||
this.queue = {};
|
||||
this.intervalPeriod = 10000; //10 sec
|
||||
this.init();
|
||||
this.ui = uiInput;
|
||||
}
|
||||
async init() {
|
||||
this.log = await Log({ label: this.id });
|
||||
await this.load();
|
||||
await this.start();
|
||||
}
|
||||
async load() {
|
||||
this.http = (0, express_1.default)();
|
||||
for (let tmpl of this.templates) {
|
||||
tmpl.data = await (0, promises_1.readFile)(tmpl.path, 'utf8');
|
||||
}
|
||||
this.http.get('/', this.index.bind(this));
|
||||
this.http.get('/image/:key', this.image.bind(this));
|
||||
this.log.info("Server assets loaded");
|
||||
}
|
||||
template(name, data) {
|
||||
let html = this.templates.find(el => el.name === name).data;
|
||||
for (let key of Object.keys(data)) {
|
||||
html = html.replace(`{{${key}}}`, data[key]);
|
||||
}
|
||||
return html;
|
||||
}
|
||||
async startWss() {
|
||||
try {
|
||||
this.wss = new ws_1.WebSocketServer({ port: this.wsPort });
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err);
|
||||
return;
|
||||
}
|
||||
this.wss.on('connection', async function (ws, req) {
|
||||
const address = req.socket.remoteAddress;
|
||||
ws.on('message', function (data) {
|
||||
let obj = JSON.parse(data);
|
||||
//this.log.info(data)
|
||||
if (obj.id && this.queue[obj.id]) {
|
||||
this.queue[obj.id](obj);
|
||||
delete this.queue[obj.id];
|
||||
if (obj.action !== 'ping') {
|
||||
this.log.info(`${obj.action} ACK`);
|
||||
}
|
||||
}
|
||||
}.bind(this));
|
||||
ws.on('close', function () {
|
||||
this.log.info('Client disconnected');
|
||||
this.notify('Client disconnected', `No longer forwarding digital display to client ${address}`);
|
||||
}.bind(this));
|
||||
await this.cmd(ws, 'mcopy');
|
||||
this.log.info('Client connected');
|
||||
this.notify('Client connected', `Forwarding digital display to client: ${address}`);
|
||||
}.bind(this));
|
||||
this.log.info(`Websocket server started!`);
|
||||
this.log.info(`WSS [ ws://localhost:${this.wsPort} ]`);
|
||||
}
|
||||
async startHttp() {
|
||||
return new Promise(function (resolve, reject) {
|
||||
this.httpd = this.http.listen(this.port, function () {
|
||||
this.log.info(`HTTP server started!`);
|
||||
this.log.info(`URL [ http://localhost:${this.port} ]`);
|
||||
return resolve(true);
|
||||
}.bind(this));
|
||||
}.bind(this));
|
||||
}
|
||||
async start() {
|
||||
await this.startHttp();
|
||||
await this.startWss();
|
||||
this.interval = setInterval(async function () {
|
||||
await this.cmdAll('ping');
|
||||
}.bind(this), this.intervalPeriod);
|
||||
this.isActive = true;
|
||||
}
|
||||
async stopHttp() {
|
||||
return new Promise(function (resolve, reject) {
|
||||
return this.httpd.close(function () {
|
||||
this.log.info(`HTTP server stopped :(`);
|
||||
return resolve(false);
|
||||
}.bind(this));
|
||||
}.bind(this));
|
||||
}
|
||||
async stop() {
|
||||
await this.stopHttp();
|
||||
clearInterval(this.interval);
|
||||
this.isActive = false;
|
||||
}
|
||||
index(req, res, next) {
|
||||
const SCRIPT = this.template('script', { PORT: `${this.wsPort}` });
|
||||
const html = this.template('index', { SCRIPT });
|
||||
this.log.info('GET /');
|
||||
return res.send(html);
|
||||
}
|
||||
async image(req, res, next) {
|
||||
let filePath;
|
||||
if (req.params && req.params.key) {
|
||||
if (this.proxy[req.params.key]) {
|
||||
filePath = this.proxy[req.params.key].path;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
return new Promise(function (resolve, reject) {
|
||||
return res.sendFile(filePath, function (err) {
|
||||
if (err) {
|
||||
res.status(err.status).end();
|
||||
return reject(err);
|
||||
}
|
||||
return resolve(true);
|
||||
});
|
||||
}.bind(this));
|
||||
}
|
||||
addProxy(key, filePath) {
|
||||
//wipe every time
|
||||
this.proxy = {};
|
||||
this.proxy[key] = {
|
||||
path: filePath
|
||||
};
|
||||
this.log.info(`Added proxy image [${key}]`);
|
||||
}
|
||||
async cmdAll(action, options = {}) {
|
||||
const cmds = [];
|
||||
if (this.useServer()) {
|
||||
this.wss.clients.forEach(function (ws) {
|
||||
cmds.push(this.cmd(ws, action, options));
|
||||
}.bind(this));
|
||||
await Promise.all(cmds);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
async displayImage(src) {
|
||||
let key;
|
||||
if (this.useServer()) {
|
||||
key = (0, path_1.basename)(src);
|
||||
this.addProxy(key, src);
|
||||
await this.cmdAll('image', { image: `/image/${key}` });
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
useServer() {
|
||||
return this.isActive && this.wss.clients.size > 0;
|
||||
}
|
||||
/**
|
||||
* WSS
|
||||
**/
|
||||
async cmd(ws, action, options = {}) {
|
||||
const id = (0, uuid_1.v4)();
|
||||
let obj = {
|
||||
id, action
|
||||
};
|
||||
let str;
|
||||
obj = Object.assign(obj, options);
|
||||
str = JSON.stringify(obj);
|
||||
ws.send(str);
|
||||
return new Promise(function (resolve, reject) {
|
||||
this.queue[id] = function (obj) {
|
||||
return resolve(obj);
|
||||
};
|
||||
//setTimeout() ?
|
||||
}.bind(this));
|
||||
}
|
||||
notify(title, message) {
|
||||
this.ui.send('gui', { notify: { title, message } });
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = Server
|
||||
module.exports = function (ui) {
|
||||
return new Server(ui);
|
||||
};
|
||||
//# sourceMappingURL=index.js.map
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1 @@
|
|||
export {};
|
|
@ -18,7 +18,9 @@ class Settings {
|
|||
profile: 'mcopy',
|
||||
camera: {},
|
||||
projector: {},
|
||||
light: {}
|
||||
light: {},
|
||||
capper: {},
|
||||
timing: {}
|
||||
};
|
||||
this.state = this.freshState();
|
||||
}
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/settings/index.ts"],"names":[],"mappings":"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"}
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/settings/index.ts"],"names":[],"mappings":"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"}
|
|
@ -0,0 +1 @@
|
|||
export {};
|
|
@ -16,26 +16,33 @@ const exec_1 = require("exec");
|
|||
async function dependencies(platform) {
|
||||
let obj = {};
|
||||
let ffmpeg = require('ffmpeg-static');
|
||||
let ffprobe = require('ffprobe-static');
|
||||
let ffoutput;
|
||||
let imoutput;
|
||||
//let imoutput : ExecOutput;
|
||||
let eogoutput;
|
||||
obj.ffmpeg = ffmpeg;
|
||||
obj.ffmpeg = ffmpeg; /*.replace(
|
||||
'app.asar',
|
||||
'app.asar.unpacked'
|
||||
);*/
|
||||
obj.ffprobe = ffprobe.path; /*.replace(
|
||||
'app.asar',
|
||||
'app.asar.unpacked'
|
||||
);*/
|
||||
try {
|
||||
imoutput = await exec_1.exec('which convert');
|
||||
//imoutput = await exec('which convert');
|
||||
}
|
||||
catch (err) {
|
||||
console.error('imagemagick is not installed', err);
|
||||
}
|
||||
if (!imoutput || imoutput.stdout.trim() === '') {
|
||||
/*if (!imoutput || imoutput.stdout.trim() === '') {
|
||||
console.error('imagemagick is not installed');
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
obj.convert = imoutput.stdout.trim();
|
||||
}
|
||||
}*/
|
||||
//if linux
|
||||
if (platform === 'nix') {
|
||||
try {
|
||||
eogoutput = await exec_1.exec('which eog');
|
||||
eogoutput = await (0, exec_1.exec)('which eog');
|
||||
}
|
||||
catch (err) {
|
||||
console.error('eog is not installed', err);
|
||||
|
@ -89,12 +96,12 @@ async function system(ui) {
|
|||
const obj = {};
|
||||
let platform;
|
||||
try {
|
||||
obj.tmp = os_1.tmpdir();
|
||||
obj.tmp = (0, os_1.tmpdir)();
|
||||
}
|
||||
catch (err) {
|
||||
obj.tmp = '/tmp';
|
||||
}
|
||||
platform = os_1.type();
|
||||
platform = (0, os_1.type)();
|
||||
if (platform === 'Darwin') {
|
||||
obj.platform = 'osx';
|
||||
}
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/system/index.ts"],"names":[],"mappings":"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"}
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/system/index.ts"],"names":[],"mappings":"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"}
|
|
@ -0,0 +1,27 @@
|
|||
'use strict';
|
||||
let alertObj;
|
||||
class Alert {
|
||||
constructor() {
|
||||
this.id = 'alert';
|
||||
}
|
||||
init() {
|
||||
this.listen();
|
||||
}
|
||||
start(msg) {
|
||||
alert(msg);
|
||||
this.end();
|
||||
}
|
||||
end() {
|
||||
const obj = {};
|
||||
ipcRenderer.sendSync(this.id, obj);
|
||||
}
|
||||
listen() {
|
||||
ipcRenderer.on(this.id, (function (event, arg) {
|
||||
this.start(arg.msg);
|
||||
}).bind(this));
|
||||
}
|
||||
;
|
||||
}
|
||||
alertObj = new Alert();
|
||||
module.exports = alertObj;
|
||||
//# sourceMappingURL=alert.js.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"alert.js","sourceRoot":"","sources":["../../src/lib/ui/alert.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAOb,IAAI,QAAgB,CAAC;AAErB,MAAM,KAAK;IAGV;QAFA,OAAE,GAAY,OAAO,CAAC;IAGtB,CAAC;IAEM,IAAI;QACV,IAAI,CAAC,MAAM,EAAE,CAAC;IACf,CAAC;IAEM,KAAK,CAAE,GAAY;QACzB,KAAK,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC;IAEO,GAAG;QACV,MAAM,GAAG,GAAS,EAAE,CAAC;QAErB,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACpC,CAAC;IAEO,MAAM;QACb,WAAW,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,UAAU,KAAa,EAAE,GAAS;YAC1D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAChB,CAAC;IAAA,CAAC;CAEF;AAED,QAAQ,GAAG,IAAI,KAAK,EAAE,CAAC;AACvB,MAAM,CAAC,OAAO,GAAG,QAAQ,CAAC"}
|
|
@ -80,7 +80,8 @@ cam.end = function (c, id, ms) {
|
|||
}
|
||||
gui.counterUpdate('cam2', cam.second.pos);
|
||||
}
|
||||
gui.counterUpdate('cam', cam.pos)
|
||||
timing.update(c, ms);
|
||||
gui.counterUpdate('cam', cam.pos);
|
||||
if (typeof cam.queue[id] !== 'undefined') {
|
||||
if (typeof cam.queue[id].callback !== 'undefined') {
|
||||
cam.queue[id].callback(ms);
|
||||
|
@ -89,6 +90,26 @@ cam.end = function (c, id, ms) {
|
|||
cam.lock = false;
|
||||
}
|
||||
};
|
||||
|
||||
cam.exposure = async function (exposure) {
|
||||
var obj = {
|
||||
id : uuid(),
|
||||
exposure
|
||||
};
|
||||
var change = false;
|
||||
try {
|
||||
change = await gui.confirm(`Are you sure you want to set camera exposure to ${exposure}ms?`);
|
||||
} catch (err) {
|
||||
log.error(err);
|
||||
}
|
||||
if (change) {
|
||||
log.info(`Setting exposure: ${exposure}`);
|
||||
ipcRenderer.sendSync(cam.id, obj);
|
||||
} else {
|
||||
timing.updateUI('#cam_time', timing.data['cam']);
|
||||
}
|
||||
}
|
||||
|
||||
cam.listen = function () {
|
||||
'use strict';
|
||||
ipcRenderer.on(cam.id, function (event, arg) {
|
||||
|
@ -182,6 +203,7 @@ cam.second.end = function (c, id, ms) {
|
|||
cam.second.pos -= 1;
|
||||
}
|
||||
}
|
||||
timing.update(c, ms);
|
||||
gui.counterUpdate('cam2', cam.second.pos)
|
||||
if (typeof cam.second.queue[id] !== 'undefined') {
|
||||
if (typeof cam.queue[id].callback !== 'undefined') {
|
||||
|
|
|
@ -0,0 +1,72 @@
|
|||
'use strict';
|
||||
let capper;
|
||||
class Capper {
|
||||
constructor() {
|
||||
this.enabled = false;
|
||||
this.queue = {};
|
||||
this.lock = false;
|
||||
this.id = 'capper';
|
||||
this.state = false;
|
||||
}
|
||||
init() {
|
||||
this.listen();
|
||||
}
|
||||
enable() {
|
||||
$('.black').addClass('on');
|
||||
$('#cmd_black_forward').parent().removeClass('hide');
|
||||
$('#cmd_black_backward').parent().removeClass('hide');
|
||||
$('#cmd_capper_on').parent().removeClass('hide');
|
||||
$('#cmd_capper_off').parent().removeClass('hide');
|
||||
this.enabled = true;
|
||||
}
|
||||
capper(state, callback) {
|
||||
let obj;
|
||||
if (this.lock) {
|
||||
return false;
|
||||
}
|
||||
obj = {
|
||||
state,
|
||||
id: uuid()
|
||||
};
|
||||
ipcRenderer.sendSync(this.id, obj);
|
||||
if (typeof callback !== 'undefined') {
|
||||
obj.callback = callback;
|
||||
}
|
||||
this.queue[obj.id] = obj;
|
||||
this.lock = true;
|
||||
this.state = state;
|
||||
if (state) {
|
||||
$('#cmd_capper_on').addClass('active');
|
||||
$('#cmd_capper_off').removeClass('active');
|
||||
}
|
||||
else {
|
||||
$('#cmd_capper_off').addClass('active');
|
||||
$('#cmd_capper_on').removeClass('active');
|
||||
}
|
||||
}
|
||||
end(c, id, ms) {
|
||||
if (c === cfg.arduino.cmd.capper_on) {
|
||||
this.state = true;
|
||||
}
|
||||
else if (c === cfg.arduino.cmd.capper_off) {
|
||||
this.state = false;
|
||||
}
|
||||
if (typeof this.queue[id] !== 'undefined') {
|
||||
if (typeof this.queue[id].callback !== 'undefined') {
|
||||
this.queue[id].callback(ms);
|
||||
}
|
||||
delete this.queue[id];
|
||||
this.lock = false;
|
||||
}
|
||||
}
|
||||
listen() {
|
||||
ipcRenderer.on(this.id, function (event, arg) {
|
||||
capper.end(arg.cmd, arg.id, arg.ms);
|
||||
return event.returnValue = true;
|
||||
});
|
||||
}
|
||||
;
|
||||
}
|
||||
capper = new Capper();
|
||||
module.exports = capper;
|
||||
//# sourceMappingURL=capper.js.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"capper.js","sourceRoot":"","sources":["../../src/lib/ui/capper.ts"],"names":[],"mappings":"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"}
|
|
@ -155,24 +155,63 @@ cmd.black_forward = function (callback) {
|
|||
if (callback) { callback(ms); }
|
||||
};
|
||||
$('#cmd_black_forward').addClass('active');
|
||||
|
||||
if (!cam.dir) {
|
||||
cam.set(true, function () {
|
||||
setTimeout( function () {
|
||||
light.display(off);
|
||||
light.set(off, function () {
|
||||
setTimeout( function () {
|
||||
cam.move(res);
|
||||
}, cfg.arduino.serialDelay);
|
||||
});
|
||||
}, cfg.arduino.serialDelay);
|
||||
});
|
||||
if (capper.enabled) {
|
||||
cam.set(true, function () {
|
||||
setTimeout( function () {
|
||||
capper.capper(true, function () {
|
||||
setTimeout( function () {
|
||||
light.display(off);
|
||||
light.set(off, function () {
|
||||
setTimeout( function () {
|
||||
cam.move(function () {
|
||||
setTimeout(function () {
|
||||
capper.capper(false, res);
|
||||
}, cfg.arduino.serialDelay);
|
||||
});
|
||||
}, cfg.arduino.serialDelay);
|
||||
});
|
||||
}, cfg.arduino.serialDelay)
|
||||
})
|
||||
}, cfg.arduino.serialDelay);
|
||||
});
|
||||
} else {
|
||||
cam.set(true, function () {
|
||||
setTimeout( function () {
|
||||
light.display(off);
|
||||
light.set(off, function () {
|
||||
setTimeout( function () {
|
||||
cam.move(res);
|
||||
}, cfg.arduino.serialDelay);
|
||||
});
|
||||
}, cfg.arduino.serialDelay);
|
||||
});
|
||||
}
|
||||
} else {
|
||||
light.display(off);
|
||||
light.set(off, function () {
|
||||
setTimeout(function () {
|
||||
cam.move(res);
|
||||
}, cfg.arduino.serialDelay);
|
||||
});
|
||||
if (capper.enabled) {
|
||||
capper.capper(true, function () {
|
||||
setTimeout( function () {
|
||||
light.display(off);
|
||||
light.set(off, function () {
|
||||
setTimeout( function () {
|
||||
cam.move(function () {
|
||||
setTimeout(function () {
|
||||
capper.capper(false, res);
|
||||
}, cfg.arduino.serialDelay);
|
||||
});
|
||||
}, cfg.arduino.serialDelay);
|
||||
});
|
||||
}, cfg.arduino.serialDelay);
|
||||
});
|
||||
} else {
|
||||
light.display(off);
|
||||
light.set(off, function () {
|
||||
setTimeout(function () {
|
||||
cam.move(res);
|
||||
}, cfg.arduino.serialDelay);
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
/**
|
||||
|
@ -226,21 +265,57 @@ cmd.black_backward = function (callback) {
|
|||
};
|
||||
$('#cmd_black_backward').addClass('active');
|
||||
if (cam.dir) {
|
||||
cam.set(false, function () {
|
||||
if (capper.enabled) {
|
||||
cam.set(false, function () {
|
||||
setTimeout( function () {
|
||||
capper.capper(true, function () {
|
||||
setTimeout(function () {
|
||||
light.display(off);
|
||||
light.set(off, function () {
|
||||
cam.move(function () {
|
||||
setTimeout(function () {
|
||||
capper.capper(false, res);
|
||||
}, cfg.arduino.serialDelay);
|
||||
});
|
||||
});
|
||||
}, cfg.arduino.serialDelay);
|
||||
});
|
||||
}, cfg.arduino.serialDelay);
|
||||
});
|
||||
} else {
|
||||
cam.set(false, function () {
|
||||
setTimeout(function () {
|
||||
light.display(off);
|
||||
light.set(off, function () {
|
||||
cam.move(res);
|
||||
});
|
||||
}, cfg.arduino.serialDelay);
|
||||
});
|
||||
}
|
||||
} else {
|
||||
if (capper.enabled) {
|
||||
capper.capper(true, function () {
|
||||
setTimeout( function () {
|
||||
light.display(off);
|
||||
light.set(off, function () {
|
||||
setTimeout( function () {
|
||||
cam.move(function () {
|
||||
setTimeout(function () {
|
||||
capper.capper(false, res);
|
||||
}, cfg.arduino.serialDelay);
|
||||
});
|
||||
}, cfg.arduino.serialDelay);
|
||||
});
|
||||
}, cfg.arduino.serialDelay);
|
||||
});
|
||||
} else {
|
||||
setTimeout(function () {
|
||||
light.display(off);
|
||||
light.set(off, function () {
|
||||
cam.move(res);
|
||||
});
|
||||
}, cfg.arduino.serialDelay);
|
||||
});
|
||||
} else {
|
||||
setTimeout(function () {
|
||||
light.display(off);
|
||||
light.set(off, function () {
|
||||
cam.move(res);
|
||||
});
|
||||
}, cfg.arduino.serialDelay);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -419,7 +494,7 @@ cmd.camera_to = function (t) {
|
|||
cont = confirm(`Do you want to ${(total > 0 ? 'advance' : 'rewind')} the camera ${total} frame${(total === 1 ? '' : 's')} to frame ${val}?`)
|
||||
if (cont) {
|
||||
gui.overlay(true);
|
||||
gui.spinner(true, `Camera ${(total > 0 ? 'advancing' : 'rewinding')} ${total} frame${(total === 1 ? '' : 's')} `, true, true);
|
||||
gui.spinner(true, `Camera ${(total > 0 ? 'advancing' : 'rewinding')} ${total} frame${(total === 1 ? '' : 's')} `, true, false);
|
||||
seq.exec(steps, Math.abs(total));
|
||||
}
|
||||
}
|
||||
|
@ -534,4 +609,32 @@ cmd.projector_second_to = function (t) {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Turn the capper on (block the camera)
|
||||
*
|
||||
* @param {function} callback Function to call after capper is on
|
||||
**/
|
||||
cmd.capper_on = function (callback) {
|
||||
'use strict';
|
||||
var res = function (ms) {
|
||||
gui.updateState();
|
||||
if (callback) { callback(ms); }
|
||||
};
|
||||
capper.capper(true, res);
|
||||
};
|
||||
|
||||
/**
|
||||
* Turn the capper off (not blocking the camera)
|
||||
*
|
||||
* @param {function} callback Function to call after capper is off
|
||||
**/
|
||||
cmd.capper_off = function (callback) {
|
||||
'use strict';
|
||||
var res = function (ms) {
|
||||
gui.updateState();
|
||||
if (callback) { callback(ms); }
|
||||
};
|
||||
capper.capper(false, res);
|
||||
};
|
||||
|
||||
module.exports = cmd;
|
|
@ -16,33 +16,30 @@ class Devices {
|
|||
}
|
||||
init() {
|
||||
this.listen();
|
||||
this.profiles();
|
||||
this.layoutProfiles();
|
||||
gui.overlay(true);
|
||||
gui.spinner(true, 'Checking for connected devices...');
|
||||
}
|
||||
listen() {
|
||||
ipcRenderer.on('ready', this.ready.bind(this));
|
||||
ipcRenderer.on('intval', this.intvalCb.bind(this));
|
||||
ipcRenderer.on('processing', this.processingCb.bind(this));
|
||||
ipcRenderer.on('error_state', this.errorState.bind(this));
|
||||
}
|
||||
ready(event, arg) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
//console.dir(arg)
|
||||
log.info("Devices ready");
|
||||
let opt;
|
||||
let devs = [];
|
||||
let notify = 'Connected to ';
|
||||
let p;
|
||||
//@ts-ignore
|
||||
yield delay(1000);
|
||||
try {
|
||||
gui.spinner(false);
|
||||
gui.overlay(false);
|
||||
}
|
||||
catch (err) {
|
||||
log.error(err);
|
||||
if (typeof arg.camera !== 'undefined' && typeof arg.camera.exposure !== undefined) {
|
||||
$('#submit_cam_time').removeClass('hide');
|
||||
$('#cam_time').removeAttr('readonly');
|
||||
}
|
||||
for (let i in arg) {
|
||||
devs.push(arg[i].arduino);
|
||||
if (arg[i].arduino && arg[i].arduino !== '/dev/fake') {
|
||||
if (typeof arg[i].arduino !== 'undefined' && arg[i].arduino !== '/dev/fake') {
|
||||
devs.push(arg[i].arduino);
|
||||
if (notify === 'Connected to ') {
|
||||
notify += arg[i].arduino + ' ';
|
||||
}
|
||||
|
@ -71,35 +68,60 @@ class Devices {
|
|||
$('#devices').append(opt);
|
||||
}
|
||||
}
|
||||
if (arg && arg.profile) {
|
||||
$('#profile').val(arg.profile);
|
||||
log.info(`Using configuration profile "${arg.profile}"`, 'DEVICES', true, true);
|
||||
p = cfg.profiles[arg.profile];
|
||||
if (typeof p.light !== 'undefined' && p.light === false) {
|
||||
light.disable();
|
||||
}
|
||||
else {
|
||||
light.enable();
|
||||
}
|
||||
//devices.profile(arg.profile)
|
||||
if (typeof arg !== 'undefined' && typeof arg.profile !== 'undefined') {
|
||||
yield devices.profile(arg.profile);
|
||||
}
|
||||
if (typeof arg !== 'undefined' && typeof arg.timing !== 'undefined') {
|
||||
timing.restore(arg.timing);
|
||||
}
|
||||
if (typeof arg !== 'undefined' && typeof arg.projector_second !== 'undefined') {
|
||||
//add second row of projector pads to grid
|
||||
proj.second.enable();
|
||||
}
|
||||
if (typeof arg !== 'undefined' && typeof arg.camera_second !== 'undefined') {
|
||||
//add second row of camera pads to grid
|
||||
cam.second.enable();
|
||||
}
|
||||
if (typeof arg !== 'undefined' && typeof arg.capper !== 'undefined') {
|
||||
//add capper features to grid
|
||||
capper.enable();
|
||||
}
|
||||
seq.set(0, cfg.cmd.camera_forward);
|
||||
seq.set(1, cfg.cmd.projector_forward);
|
||||
grid.state(0);
|
||||
grid.state(1);
|
||||
seq.stats();
|
||||
if (arg.projector_second) {
|
||||
//add second row of projector pads to grid
|
||||
proj.second.enable();
|
||||
try {
|
||||
gui.spinner(false);
|
||||
gui.overlay(false);
|
||||
}
|
||||
if (arg.camera_second) {
|
||||
//add second row of camera pads to grid
|
||||
cam.second.enable();
|
||||
catch (err) {
|
||||
log.error(err);
|
||||
}
|
||||
return event.returnValue = true;
|
||||
});
|
||||
}
|
||||
profiles() {
|
||||
profile(profile) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
log.info(`Changed configuration profile to "${profile}"`, 'DEVICES', true, true);
|
||||
const p = cfg.profiles[profile];
|
||||
const keys = Object.keys(p);
|
||||
for (let key of keys) {
|
||||
cfg[key] = keys[key];
|
||||
}
|
||||
$('#profile').val(profile);
|
||||
timing.reset(p);
|
||||
if (typeof p.light !== 'undefined' && p.light === false) {
|
||||
yield light.disable();
|
||||
}
|
||||
else {
|
||||
yield light.enable();
|
||||
}
|
||||
yield ipcRenderer.invoke('profile', { profile });
|
||||
yield timing.store();
|
||||
});
|
||||
}
|
||||
layoutProfiles() {
|
||||
const keys = Object.keys(cfg.profiles);
|
||||
const elem = $('#profile');
|
||||
let opt;
|
||||
|
@ -115,33 +137,18 @@ class Devices {
|
|||
this.profile(val);
|
||||
});
|
||||
}
|
||||
profile(profile) {
|
||||
log.info(`Changed configuration profile to "${profile}"`, 'DEVICES', true, true);
|
||||
const p = cfg.profiles[profile];
|
||||
const keys = Object.keys(p);
|
||||
for (let key of keys) {
|
||||
cfg[key] = keys[key];
|
||||
}
|
||||
if (typeof p.light !== 'undefined' && p.light === false) {
|
||||
light.disable();
|
||||
}
|
||||
else {
|
||||
light.enable();
|
||||
}
|
||||
ipcRenderer.send('profile', { profile });
|
||||
}
|
||||
intval() {
|
||||
const url = $('#intval').val();
|
||||
let proceed = false;
|
||||
let obj = {
|
||||
connect: true,
|
||||
url: url
|
||||
url
|
||||
};
|
||||
if (url !== '' && typeof url !== 'undefined') {
|
||||
proceed = confirm(`Are you sure you want to connect to INTVAL3 @ ${url}?`);
|
||||
}
|
||||
else {
|
||||
alert('Cannot connect to INTVAL3 url as entered.');
|
||||
alert('Cannot connect to INTVAL3 URL as entered.');
|
||||
}
|
||||
if (proceed) {
|
||||
gui.overlay(true);
|
||||
|
@ -173,6 +180,38 @@ class Devices {
|
|||
$('#intval').removeClass('active');
|
||||
}
|
||||
}
|
||||
processing() {
|
||||
const url = $('#processing').val();
|
||||
let proceed = false;
|
||||
let obj = {
|
||||
url
|
||||
};
|
||||
if (url !== '' && typeof url !== 'undefined') {
|
||||
proceed = confirm(`Are you sure you want to connect to Processing @ ${url}?`);
|
||||
}
|
||||
else {
|
||||
alert('Cannot connect to Processing URL as entered.');
|
||||
}
|
||||
if (proceed) {
|
||||
gui.overlay(true);
|
||||
gui.spinner(true, `Connecting to Processing @ ${url}`);
|
||||
ipcRenderer.send('processing', obj);
|
||||
}
|
||||
else {
|
||||
$('#camera_type_arduino').prop('checked', 'checked');
|
||||
$('#processing').removeClass('active');
|
||||
}
|
||||
}
|
||||
processingCb() {
|
||||
gui.spinner(false);
|
||||
gui.overlay(false);
|
||||
}
|
||||
errorState() {
|
||||
gui.spinner(false);
|
||||
gui.overlay(false);
|
||||
gui.notify('DEVICES', `Hardware error detected`);
|
||||
gui.warn('Error', 'Hardware error detected. Please address before continuing.');
|
||||
}
|
||||
}
|
||||
devices = new Devices();
|
||||
module.exports = devices;
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -46,9 +46,10 @@ let filmout;
|
|||
class FilmOut {
|
||||
constructor() {
|
||||
this.id = 'filmout';
|
||||
this.extensions = ['.mpg', '.mpeg', '.mov', '.mkv', '.avi', '.mp4',
|
||||
'.gif',
|
||||
'.tif', '.tiff', '.png', '.jpg', '.jpeg', '.bmp'];
|
||||
this.videoExtensions = ['.mpg', '.mpeg', '.mov', '.mkv', '.avi', '.mp4',
|
||||
'.gif'];
|
||||
this.stillExtensions = ['.tif', '.tiff', '.png', '.jpg', '.jpeg', '.bmp'];
|
||||
this.sequenceExtensions = ['.png', '.jpg', '.jpeg'];
|
||||
this.displays = [];
|
||||
this.state = {
|
||||
frame: 0,
|
||||
|
@ -62,6 +63,8 @@ class FilmOut {
|
|||
ipcRenderer.on(this.id, this.onFilmout.bind(this));
|
||||
ipcRenderer.on('system', this.onSystem.bind(this));
|
||||
ipcRenderer.on('preview_frame', this.onFrame.bind(this));
|
||||
ipcRenderer.on('pre_export', this.onPreExport.bind(this));
|
||||
ipcRenderer.on('pre_export_progress', this.onPreExportProgress.bind(this));
|
||||
}
|
||||
onSystem(evt, args) {
|
||||
let option;
|
||||
|
@ -118,12 +121,17 @@ class FilmOut {
|
|||
this.state.display = id;
|
||||
ipcRenderer.send('display', { display: id });
|
||||
}
|
||||
/**
|
||||
* Select a file from the showOpenDialog method. Save the file
|
||||
* to an <input type=file> element if the selection is valid.
|
||||
**/
|
||||
selectFile() {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
const elem = $('#digital');
|
||||
const properties = [`openFile`, `openDirectory`];
|
||||
const options = {
|
||||
title: `Select video or image sequence`,
|
||||
properties: [`openFile`],
|
||||
properties,
|
||||
defaultPath: 'c:/',
|
||||
filters: [
|
||||
{
|
||||
|
@ -133,6 +141,25 @@ class FilmOut {
|
|||
]
|
||||
};
|
||||
let files;
|
||||
let valid = false;
|
||||
let pathStr;
|
||||
let displayName;
|
||||
let ext;
|
||||
const linuxMessage = `Do you want to use a single file (video or still image) or a folder containing an image sequence?`;
|
||||
const linuxChoices = ['File', 'Folder', 'Cancel'];
|
||||
let linuxChoice = 0;
|
||||
if (process.platform === 'linux') {
|
||||
linuxChoice = yield gui.choice(linuxMessage, linuxChoices);
|
||||
if (linuxChoice === 0) {
|
||||
options.properties = ['openFile'];
|
||||
}
|
||||
else if (linuxChoice === 1) {
|
||||
options.properties = ['openDirectory'];
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
try {
|
||||
files = yield dialog.showOpenDialog(options);
|
||||
}
|
||||
|
@ -142,51 +169,98 @@ class FilmOut {
|
|||
}
|
||||
if (!files)
|
||||
return false;
|
||||
let valid = false;
|
||||
let pathStr = files.filePaths[0];
|
||||
let displayName;
|
||||
let ext;
|
||||
if (pathStr && pathStr !== '') {
|
||||
ext = path.extname(pathStr.toLowerCase());
|
||||
valid = this.extensions.indexOf(ext) === -1 ? false : true;
|
||||
log.info(pathStr);
|
||||
if (!valid) {
|
||||
return false;
|
||||
if (files.filePaths.length > 0) {
|
||||
pathStr = files.filePaths[0];
|
||||
displayName = path.basename(pathStr);
|
||||
valid = this.validateSelection(files);
|
||||
if (valid) {
|
||||
log.info(`Selected "${displayName}"`, 'FILMOUT', true);
|
||||
elem.attr('data-file', pathStr);
|
||||
elem.val(displayName);
|
||||
$('#filmout_file').val(displayName);
|
||||
this.useFile();
|
||||
}
|
||||
log.info(`Selected video ${pathStr.split('/').pop()}`, 'DIGITAL', true);
|
||||
elem.attr('data-file', pathStr);
|
||||
displayName = pathStr.split('/').pop();
|
||||
elem.val(displayName);
|
||||
$('#filmout_file').val(displayName);
|
||||
this.useFile();
|
||||
}
|
||||
if (!valid && typeof files.cancelled !== 'undefined') {
|
||||
gui.warn('Invalid selection', `The selection "${displayName}" is not an accepted video, image or folder containing an image sequence.`);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Validate the selection to be of an approved selection or a directory
|
||||
* containing images of an approved extension.
|
||||
*
|
||||
* @param {array} files List of files to validate their types
|
||||
*
|
||||
* @returns {boolean} Whether or not the selection is valid
|
||||
**/
|
||||
validateSelection(files) {
|
||||
let ext;
|
||||
let pathStr;
|
||||
let dir = false;
|
||||
let valid = false;
|
||||
let fileList = [];
|
||||
if (files.filePaths.length === 1) {
|
||||
pathStr = files.filePaths[0];
|
||||
dir = fs.lstatSync(pathStr).isDirectory();
|
||||
if (dir) {
|
||||
log.info('The selection is a directory');
|
||||
fileList = fs.readdirSync(pathStr);
|
||||
fileList = fileList.filter((file) => {
|
||||
let ext = path.extname(file).toLowerCase();
|
||||
if (this.sequenceExtensions.indexOf(ext) !== -1) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
if (fileList.length > 0) {
|
||||
valid = true;
|
||||
}
|
||||
else {
|
||||
valid = false;
|
||||
}
|
||||
}
|
||||
else {
|
||||
ext = path.extname(pathStr.toLowerCase());
|
||||
valid = this.videoExtensions.indexOf(ext) === -1;
|
||||
if (!valid) {
|
||||
valid = this.stillExtensions.indexOf(ext) === -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return valid;
|
||||
}
|
||||
/**
|
||||
* Prompt the user to use the selected file/files or cancel
|
||||
**/
|
||||
useFile() {
|
||||
const elem = $('#digital');
|
||||
const filePath = elem.attr('data-file');
|
||||
const fileName = elem.val();
|
||||
let proceed = false;
|
||||
let obj = {
|
||||
path: filePath,
|
||||
fileName
|
||||
};
|
||||
if (filePath && filePath !== '') {
|
||||
proceed = confirm(`Are you sure you want to use ${fileName}?`);
|
||||
}
|
||||
else {
|
||||
this.selectFile();
|
||||
}
|
||||
if (proceed) {
|
||||
gui.overlay(true);
|
||||
gui.spinner(true, `Getting info about ${fileName}`);
|
||||
ipcRenderer.send('filmout', obj);
|
||||
}
|
||||
else {
|
||||
$('#projector_type_digital').prop('checked', 'checked');
|
||||
$('#digital').removeClass('active');
|
||||
}
|
||||
//cancel video
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
const elem = $('#digital');
|
||||
const filePath = elem.attr('data-file');
|
||||
const fileName = elem.val();
|
||||
let proceed = false;
|
||||
let obj = {
|
||||
path: filePath,
|
||||
fileName
|
||||
};
|
||||
if (filePath && filePath !== '') {
|
||||
proceed = yield gui.confirm(`Are you sure you want to use ${fileName}?`, 'No');
|
||||
}
|
||||
else {
|
||||
this.selectFile();
|
||||
}
|
||||
if (proceed) {
|
||||
gui.overlay(true);
|
||||
gui.spinner(true, `Getting info about ${fileName}`);
|
||||
ipcRenderer.send(this.id, obj);
|
||||
}
|
||||
else {
|
||||
$('#projector_type_digital').prop('checked', 'checked');
|
||||
$('#digital').removeClass('active');
|
||||
}
|
||||
//cancel video
|
||||
});
|
||||
}
|
||||
//callback after
|
||||
onFilmout(evt, args) {
|
||||
|
@ -198,7 +272,7 @@ class FilmOut {
|
|||
state = JSON.parse(args.state);
|
||||
$('#digital').addClass('active');
|
||||
$('#projector_type_digital').prop('checked', 'checked');
|
||||
gui.notify('DEVICES', `Using video ${state.fileName}`);
|
||||
gui.notify('FILMOUT', `Using video ${state.fileName}`);
|
||||
seq.set(0, 'PF');
|
||||
grid.state(0);
|
||||
seq.set(1, 'CF');
|
||||
|
@ -209,15 +283,23 @@ class FilmOut {
|
|||
}
|
||||
this.state.frame = 0;
|
||||
this.state.frames = state.frames;
|
||||
this.state.seconds = state.seconds;
|
||||
this.state.fps = state.fps;
|
||||
this.state.width = state.info.width;
|
||||
this.state.height = state.info.height;
|
||||
this.state.name = state.fileName;
|
||||
this.state.path = state.path;
|
||||
this.state.directory = state.directory;
|
||||
$('#seq_loop').val(`${state.frames - 1}`).trigger('change');
|
||||
$('#filmout_stats_video_name').text(state.fileName);
|
||||
$('#filmout_stats_video_size').text(`${state.info.width} x ${state.info.height}`);
|
||||
$('#filmout_stats_video_frames').text(`${state.frames} frames`);
|
||||
this.reset();
|
||||
gui.updateState();
|
||||
this.previewFrame();
|
||||
if (!this.state.directory) {
|
||||
this.preExport();
|
||||
}
|
||||
}
|
||||
else {
|
||||
$('#projector_type_digital').prop('checked', 'checked');
|
||||
|
@ -235,6 +317,41 @@ class FilmOut {
|
|||
elem[0].style.backgroundImage = `url('${args.path}')`;
|
||||
elem.addClass('on');
|
||||
}
|
||||
preExport() {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
let proceed = false;
|
||||
if (this.state.path && this.state.path !== '') {
|
||||
proceed = yield gui.confirm(`Export all frames of ${this.state.name}? This may take a while, but will allow filmout sequences to run faster.`, 'No');
|
||||
}
|
||||
if (proceed) {
|
||||
gui.overlay(true);
|
||||
gui.spinner(true, `Exporting frames of ${this.state.name}`, true, false);
|
||||
ipcRenderer.send('pre_export', { state: this.state });
|
||||
}
|
||||
});
|
||||
}
|
||||
onPreExport(evt, args) {
|
||||
if (args.completed && args.completed === true) {
|
||||
gui.notify('FILMOUT', `Exported frames of ${this.state.name}`);
|
||||
log.info(`Exported frames of ${this.state.name}`, 'FILMOUT', true);
|
||||
}
|
||||
else {
|
||||
log.info('onPreExport Error');
|
||||
log.error(JSON.stringify(args));
|
||||
}
|
||||
gui.overlay(false);
|
||||
gui.spinner(false);
|
||||
}
|
||||
onPreExportProgress(evt, args) {
|
||||
const elem = $('.progress-bar');
|
||||
let progress = 0;
|
||||
if (args.progress.progress) {
|
||||
progress = args.progress.progress * 100;
|
||||
}
|
||||
elem.attr('aria-valuenow', progress);
|
||||
elem.css('width', `${progress}%`);
|
||||
gui.spinner(true, `Exporting frames of ${this.state.name} in ${humanizeDuration(Math.round(args.progress.estimated) * 1000)}`, true, false);
|
||||
}
|
||||
advance() {
|
||||
this.state.frame++;
|
||||
if (this.state.frame >= this.state.frames) {
|
||||
|
@ -249,6 +366,10 @@ class FilmOut {
|
|||
}
|
||||
$('#filmout_position').val(this.state.frame).trigger('change');
|
||||
}
|
||||
reset() {
|
||||
this.state.frame = 0;
|
||||
$('#filmout_position').val(this.state.frame).trigger('change');
|
||||
}
|
||||
preview() {
|
||||
const frame = this.state.frame;
|
||||
ipcRenderer.send('preview', { frame });
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -6,6 +6,9 @@ let grid;
|
|||
class Grid {
|
||||
constructor() {
|
||||
this.swatchesElem = {};
|
||||
this.projector_cmds = [
|
||||
'PF', 'PB', 'P2F', 'P2B', 'PPF', 'PPB'
|
||||
];
|
||||
}
|
||||
init() {
|
||||
this.refresh();
|
||||
|
@ -24,8 +27,8 @@ class Grid {
|
|||
const step = seq.grid[x];
|
||||
let className;
|
||||
let className2;
|
||||
elem.prop('checked', false);
|
||||
if (typeof step !== 'undefined') {
|
||||
elem.prop('checked', false);
|
||||
if (step.cmd === cfg.cmd.cameras_forward) {
|
||||
className = cfg.cmd.camera_forward;
|
||||
className2 = cfg.cmd.camera_second_forward;
|
||||
|
@ -58,6 +61,14 @@ class Grid {
|
|||
className = cfg.cmd.projector_backward;
|
||||
className2 = cfg.cmd.projector_second_forward;
|
||||
}
|
||||
else if (step.cmd === cfg.cmd.black_forward) {
|
||||
className = cfg.cmd.camera_forward;
|
||||
className2 = 'black';
|
||||
}
|
||||
else if (step.cmd === cfg.cmd.black_backward) {
|
||||
className = cfg.cmd.camera_backward;
|
||||
className2 = 'black';
|
||||
}
|
||||
else {
|
||||
className = step.cmd;
|
||||
}
|
||||
|
@ -75,6 +86,12 @@ class Grid {
|
|||
.removeClass('a')
|
||||
.prop('title', '');
|
||||
}
|
||||
if (capper.enabled && this.projector_cmds.indexOf(step.cmd) !== -1) {
|
||||
$(`.black[x=${x}]`).addClass('disabled');
|
||||
}
|
||||
else if (capper.enabled) {
|
||||
$(`.black[x=${x}]`).removeClass('disabled');
|
||||
}
|
||||
}
|
||||
else {
|
||||
lightElem.css('background', 'transparent')
|
||||
|
@ -113,6 +130,7 @@ class Grid {
|
|||
'camera_second_backward',
|
||||
'projector_backward',
|
||||
'projector_second_backward',
|
||||
'black',
|
||||
'light_set',
|
||||
'numbers'
|
||||
];
|
||||
|
@ -132,6 +150,10 @@ class Grid {
|
|||
elem = `<div x="${x}" class="L"></div>`;
|
||||
$(cmd).append($(elem));
|
||||
}
|
||||
else if (cmds[i] === 'black') {
|
||||
elem = `<input type="checkbox" x="${x}" class="black" />`;
|
||||
$(cmd).append($(elem));
|
||||
}
|
||||
else {
|
||||
elem = `<input type="checkbox" x="${x}" />`;
|
||||
$(cmd).append($(elem).addClass(cfg.cmd[cmds[i]]));
|
||||
|
@ -159,7 +181,24 @@ class Grid {
|
|||
current = seq.grid[x].cmd + ''; // cast to string, bad hack
|
||||
}
|
||||
if (checked) {
|
||||
if (cam.second.enabled && current.indexOf('C') !== -1) {
|
||||
if (c.indexOf('black') !== -1) {
|
||||
if (other === '') {
|
||||
c = cfg.cmd.black_forward;
|
||||
}
|
||||
else if (current.indexOf('C') !== -1) {
|
||||
if (other == cfg.cmd.camera_forward) {
|
||||
c = cfg.cmd.black_forward;
|
||||
}
|
||||
else if (other === cfg.cmd.camera_backward) {
|
||||
c = cfg.cmd.black_backward;
|
||||
}
|
||||
}
|
||||
else if (current.indexOf('P') !== -1) {
|
||||
$(elem).prop('checked', false);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (cam.second.enabled && current.indexOf('C') !== -1) {
|
||||
if (c === cfg.cmd.camera_forward) {
|
||||
if (other === cfg.cmd.camera_second_forward) {
|
||||
c = cfg.cmd.cameras_forward;
|
||||
|
@ -254,7 +293,27 @@ class Grid {
|
|||
seq.set(x, c);
|
||||
}
|
||||
else {
|
||||
if (cam.second.enabled && current.indexOf('C') !== -1) {
|
||||
if (c.indexOf('black') !== -1) {
|
||||
if (current === 'BF' || current === 'BB') {
|
||||
if (other === cfg.cmd.camera_forward) {
|
||||
c = cfg.cmd.camera_forward;
|
||||
}
|
||||
else if (other === cfg.cmd.camera_backward) {
|
||||
c = cfg.cmd.camera_backward;
|
||||
}
|
||||
}
|
||||
else if (current.indexOf('P') !== -1) {
|
||||
$(elem).prop('checked', false);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (other === 'black' && current === cfg.cmd.camera_forward) {
|
||||
c = '';
|
||||
}
|
||||
else if (other === 'black' && current === cfg.cmd.camera_backward) {
|
||||
c = '';
|
||||
}
|
||||
else if (cam.second.enabled && current.indexOf('C') !== -1) {
|
||||
if (current === cfg.cmd.cameras_forward) {
|
||||
if (other === cfg.cmd.camera_second_forward) {
|
||||
c = cfg.cmd.camera_second_forward;
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue