Testing cli_video script that might actually be more useful than the GUI...

This commit is contained in:
Matt McWilliams 2026-03-01 21:58:12 -05:00
parent 69fb063ac0
commit 74c24215cf
10 changed files with 645 additions and 146 deletions

3
dist/cli/index.js vendored
View File

@ -38,12 +38,11 @@ class CLI {
this.image = new image_1.Image(this.fiBin);
this.fd = new fd_1.FD(this.fdBin, this.width, this.height, this.host, this.port, this.displayStr, this.mock);
this.camera = new camera_1.Camera(this.mock);
this.main();
setTimeout(this.main.bind(this), 4000);
}
async main() {
if (typeof this.args.input !== 'undefined') {
this.log.info(`Loading ${(0, path_1.basename)(this.args.input)}`);
await (0, delay_1.delay)(2000);
await this.parse(this.args.input);
await (0, delay_1.delay)(2000);
}

File diff suppressed because one or more lines are too long

172
less/style.less Normal file
View File

@ -0,0 +1,172 @@
html, body{
margin: 0px;
padding: 0px;
background: black;
overflow: hidden;
min-width: 640px;
min-height: 480px;
}
#main{
width: 99vw;
height: 99vh;
}
#status {
position: absolute;
bottom: 10px;
width: 97vw;
}
#overlay{
position: fixed;
background: rgba(0, 0, 0, 0.5);
left: 0;
right: 0;
top: 0;
bottom: 0;
display: block;
}
#overlay.active{
display: none;
}
#overlayWrapper {
display: flex;
justify-content: center;
align-items: center;
width: 100vw;
height: 100vh;
overflow: hidden;
}
#overlayMessage{
display: inline-block;
color: #fff;
background: rgba(125, 125, 125, 0.5);
border-radius: 8px;
padding: 10px 20px;
margin: 25vh auto;
cursor: pointer;
}
#frame{
text-align: center !important;
font-family: monospace;
padding: 0;
text-indent: 5px;
}
#display{
background: black;
min-height: 50vh;
max-height: 50vh;
}
#displayAdjust {
min-height: 112px;
}
#displayAdjustForm{
span {
display: inline-block;
vertical-align: top;
div{
min-height : 23px;
max-height: 23px;
text-align: center;
line-height: 23px;
&.check{
text-align: left;
padding-left: 15px;
}
}
}
}
#statisticsForm div div label {
width: 80px;
text-align: right;
display: inline-block;
padding-right: 3px;
}
.half{
box-sizing: border-box;
flex: 0 0 50%;
}
.third{
box-sizing: border-box;
flex: 0 0 33.33333%;
}
.quarter{
box-sizing: border-box;
flex: 0 0 25%;
}
.flex {
display: flex;
}
.edited {
background-color: yellow !important;
color: rgb(0, 0, 0) !important;
}
fieldset.inline .field-row {
display: inline-block;
}
fieldset.inline .field-row input{
max-width: 50px;
}
fieldset.inline input.medium {
max-width: 70px;
}
progress {
width: 97vw;
background-color: silver;
box-shadow: inset -1px -1px #fff,inset 1px 1px grey, inset -2px -2px #dfdfdf,inset 2px 2px #0a0a0a;
box-sizing: border-box;
padding: 3px 4px;
bottom: 31px;
position: absolute;
appearance: none;
padding: 2px;
}
button.small,
input.small {
width: 35px;
max-width: 35px;
min-width: 35px;
padding: 0 6px;
}
button.medium,
input.medium {
width: 50px;
max-width: 50px;
min-width: 50px;
padding: 0 6px;
}
button.large,
input.large {
width: 75px;
min-width: 75px;
max-width: 75px;
padding: 0 6px;
}
button.xlarge,
input.xlarge{
width: 125px;
min-width: 125px;
max-width: 125px;
padding: 0 6px;
}

334
package-lock.json generated
View File

@ -35,6 +35,7 @@
"@types/opentype.js": "^1.3.8",
"@types/uuid": "^9.0.8",
"@types/ws": "^8.5.10",
"less": "^4.5.1",
"typescript": "^5.4.5"
}
},
@ -1409,6 +1410,19 @@
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
},
"node_modules/copy-anything": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz",
"integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==",
"dev": true,
"license": "MIT",
"dependencies": {
"is-what": "^3.14.1"
},
"funding": {
"url": "https://github.com/sponsors/mesqueeb"
}
},
"node_modules/core-util-is": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
@ -1570,6 +1584,20 @@
"integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
"optional": true
},
"node_modules/errno": {
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
"integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
"prr": "~1.0.1"
},
"bin": {
"errno": "cli.js"
}
},
"node_modules/es-define-property": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
@ -2011,6 +2039,20 @@
}
]
},
"node_modules/image-size": {
"version": "0.5.5",
"resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
"integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
"dev": true,
"license": "MIT",
"optional": true,
"bin": {
"image-size": "bin/image-size.js"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
@ -2107,6 +2149,13 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-what": {
"version": "3.14.1",
"resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz",
"integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
"dev": true,
"license": "MIT"
},
"node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
@ -2135,6 +2184,34 @@
"resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
"integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A=="
},
"node_modules/less": {
"version": "4.5.1",
"resolved": "https://registry.npmjs.org/less/-/less-4.5.1.tgz",
"integrity": "sha512-UKgI3/KON4u6ngSsnDADsUERqhZknsVZbnuzlRZXLQCmfC/MDld42fTydUE9B+Mla1AL6SJ/Pp6SlEFi/AVGfw==",
"dev": true,
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
"copy-anything": "^2.0.1",
"parse-node-version": "^1.0.1",
"tslib": "^2.3.0"
},
"bin": {
"lessc": "bin/lessc"
},
"engines": {
"node": ">=14"
},
"optionalDependencies": {
"errno": "^0.1.1",
"graceful-fs": "^4.1.2",
"image-size": "~0.5.0",
"make-dir": "^2.1.0",
"mime": "^1.4.1",
"needle": "^3.1.0",
"source-map": "~0.6.0"
}
},
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
@ -2172,6 +2249,32 @@
"node": ">=10"
}
},
"node_modules/make-dir": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
"integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
"pify": "^4.0.1",
"semver": "^5.6.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/make-dir/node_modules/semver": {
"version": "5.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true,
"license": "ISC",
"optional": true,
"bin": {
"semver": "bin/semver"
}
},
"node_modules/make-fetch-happen": {
"version": "9.1.0",
"resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz",
@ -2220,6 +2323,18 @@
"node": ">= 0.6"
}
},
"node_modules/mime": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
"license": "MIT",
"bin": {
"mime": "cli.js"
},
"engines": {
"node": ">=4"
}
},
"node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
@ -2412,6 +2527,38 @@
"resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz",
"integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg=="
},
"node_modules/needle": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz",
"integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
"iconv-lite": "^0.6.3",
"sax": "^1.2.4"
},
"bin": {
"needle": "bin/needle"
},
"engines": {
"node": ">= 4.4.x"
}
},
"node_modules/needle/node_modules/iconv-lite": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/negotiator": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
@ -2583,6 +2730,16 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/parse-node-version": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
"integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.10"
}
},
"node_modules/parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@ -2605,6 +2762,17 @@
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
},
"node_modules/pify": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
"integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
"dev": true,
"license": "MIT",
"optional": true,
"engines": {
"node": ">=6"
}
},
"node_modules/pngjs": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz",
@ -2675,6 +2843,14 @@
"node": ">= 0.10"
}
},
"node_modules/prr": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
"integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
"dev": true,
"license": "MIT",
"optional": true
},
"node_modules/pump": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
@ -2817,6 +2993,17 @@
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"node_modules/sax": {
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz",
"integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==",
"dev": true,
"license": "BlueOak-1.0.0",
"optional": true,
"engines": {
"node": ">=11.0.0"
}
},
"node_modules/semver": {
"version": "7.6.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
@ -2854,17 +3041,6 @@
"node": ">= 0.8.0"
}
},
"node_modules/send/node_modules/mime": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
"bin": {
"mime": "cli.js"
},
"engines": {
"node": ">=4"
}
},
"node_modules/send/node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@ -3360,8 +3536,8 @@
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
"integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==",
"license": "0BSD",
"optional": true
"devOptional": true,
"license": "0BSD"
},
"node_modules/tunnel-agent": {
"version": "0.6.0",
@ -4436,6 +4612,15 @@
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
},
"copy-anything": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz",
"integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==",
"dev": true,
"requires": {
"is-what": "^3.14.1"
}
},
"core-util-is": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
@ -4559,6 +4744,16 @@
"integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
"optional": true
},
"errno": {
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
"integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
"dev": true,
"optional": true,
"requires": {
"prr": "~1.0.1"
}
},
"es-define-property": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
@ -4888,6 +5083,13 @@
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
},
"image-size": {
"version": "0.5.5",
"resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
"integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
"dev": true,
"optional": true
},
"imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
@ -4963,6 +5165,12 @@
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="
},
"is-what": {
"version": "3.14.1",
"resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz",
"integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
"dev": true
},
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
@ -4990,6 +5198,24 @@
"resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
"integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A=="
},
"less": {
"version": "4.5.1",
"resolved": "https://registry.npmjs.org/less/-/less-4.5.1.tgz",
"integrity": "sha512-UKgI3/KON4u6ngSsnDADsUERqhZknsVZbnuzlRZXLQCmfC/MDld42fTydUE9B+Mla1AL6SJ/Pp6SlEFi/AVGfw==",
"dev": true,
"requires": {
"copy-anything": "^2.0.1",
"errno": "^0.1.1",
"graceful-fs": "^4.1.2",
"image-size": "~0.5.0",
"make-dir": "^2.1.0",
"mime": "^1.4.1",
"needle": "^3.1.0",
"parse-node-version": "^1.0.1",
"source-map": "~0.6.0",
"tslib": "^2.3.0"
}
},
"lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
@ -5023,6 +5249,26 @@
"yallist": "^4.0.0"
}
},
"make-dir": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
"integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
"dev": true,
"optional": true,
"requires": {
"pify": "^4.0.1",
"semver": "^5.6.0"
},
"dependencies": {
"semver": {
"version": "5.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true,
"optional": true
}
}
},
"make-fetch-happen": {
"version": "9.1.0",
"resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz",
@ -5062,6 +5308,11 @@
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
"integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="
},
"mime": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
},
"mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
@ -5203,6 +5454,29 @@
"resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz",
"integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg=="
},
"needle": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz",
"integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==",
"dev": true,
"optional": true,
"requires": {
"iconv-lite": "^0.6.3",
"sax": "^1.2.4"
},
"dependencies": {
"iconv-lite": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"dev": true,
"optional": true,
"requires": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
}
}
}
},
"negotiator": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
@ -5323,6 +5597,12 @@
"aggregate-error": "^3.0.0"
}
},
"parse-node-version": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
"integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
"dev": true
},
"parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@ -5339,6 +5619,13 @@
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
},
"pify": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
"integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
"dev": true,
"optional": true
},
"pngjs": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz",
@ -5393,6 +5680,13 @@
"ipaddr.js": "1.9.1"
}
},
"prr": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
"integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
"dev": true,
"optional": true
},
"pump": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
@ -5487,6 +5781,13 @@
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"sax": {
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz",
"integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==",
"dev": true,
"optional": true
},
"semver": {
"version": "7.6.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
@ -5515,11 +5816,6 @@
"statuses": "2.0.1"
},
"dependencies": {
"mime": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
},
"ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@ -5884,7 +6180,7 @@
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
"integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==",
"optional": true
"devOptional": true
},
"tunnel-agent": {
"version": "0.6.0",

View File

@ -5,9 +5,7 @@
"main": "dist/index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"compile": "bash ./scripts/compile.sh",
"compile_node": "./node_modules/.bin/tsc -p tsconfig.json",
"compile_browser": "./node_modules/.bin/tsc -p tsconfig-browser.json"
"compile": "bash ./scripts/compile.sh"
},
"author": "",
"license": "MIT",
@ -20,6 +18,7 @@
"@types/opentype.js": "^1.3.8",
"@types/uuid": "^9.0.8",
"@types/ws": "^8.5.10",
"less": "^4.5.1",
"typescript": "^5.4.5"
},
"dependencies": {

31
scripts/cli_video.sh Normal file
View File

@ -0,0 +1,31 @@
#!/bin/bash
VIDEO="${1}"
EXPOSURE="${2}"
if [[ -z "${1}" ]]; then
echo "Please include path to video as the first argument"
exit 1
fi
if [[ -z "${2}" ]]; then
echo "Please include an exposure time in ms as the second argument"
exit 2
fi
TMPDIR=$(mktemp -d)
TMPFILE=$(mktemp)
#-vf fps=24
ffmpeg -hwaccel auto -i "${VIDEO}" -vf "scale=iw*sar:ih,setsar=1" -pix_fmt rgba "${TMPDIR}/frame-%08d.tif"
ls -1 "${TMPDIR}" | while IFS= read -r line; do
echo "RGB,${TMPDIR}/${line},${EXPOSURE}" >> "${TMPFILE}"
echo "D,100" >> "${TMPFILE}"
done
node dist/cli -i "${TMPFILE}"
#cat "${TMPFILE}"
rm -rf "${TMPDIR}"
rm -f "${TMPFILE}"

View File

@ -1,5 +1,10 @@
#!/bin/bash
echo "Copy shared globals.d.ts to browser"
cp src/globals.d.ts browser/globals.d.ts
npm run compile_node
npm run compile_browser
echo "Compiling server code..."
./node_modules/.bin/tsc -p tsconfig.json
echo "Compiling browser code..."
./node_modules/.bin/tsc -p tsconfig-browser.json
echo "Compiling LESS..."
./node_modules/.bin/lessc less/style.less static/css/style.css

View File

@ -81,14 +81,13 @@ export class CLI {
this.image = new Image(this.fiBin);
this.fd = new FD(this.fdBin, this.width, this.height, this.host, this.port, this.displayStr, this.mock);
this.camera = new Camera(this.mock);
this.main();
setTimeout(this.main.bind(this), 4000);
}
private async main () {
if (typeof this.args.input !== 'undefined') {
this.log.info(`Loading ${basename(this.args.input)}`);
await delay(2000);
await this.parse(this.args.input);
await delay(2000);
}

View File

@ -1,132 +1,116 @@
html, body{
margin: 0px;
padding: 0px;
background: black;
overflow: hidden;
min-width: 640px;
min-height: 480px;
html,
body {
margin: 0px;
padding: 0px;
background: black;
overflow: hidden;
min-width: 640px;
min-height: 480px;
}
#main{
width: 99vw;
height: 99vh;
#main {
width: 99vw;
height: 99vh;
}
#status {
position: absolute;
bottom: 10px;
width: 97vw;
position: absolute;
bottom: 10px;
width: 97vw;
}
#overlay{
position: fixed;
background: rgba(0, 0, 0, 0.5);
left: 0;
right: 0;
top: 0;
bottom: 0;
display: block;
#overlay {
position: fixed;
background: rgba(0, 0, 0, 0.5);
left: 0;
right: 0;
top: 0;
bottom: 0;
display: block;
}
#overlay.active{
display: none;
#overlay.active {
display: none;
}
#overlayWrapper {
display: flex;
justify-content: center;
align-items: center;
width: 100vw;
height: 100vh;
overflow: hidden;
width: 100vw;
height: 100vh;
overflow: hidden;
}
#overlayMessage{
display: inline-block;
color: #fff;
background: rgba(125, 125, 125, 0.5);
border-radius: 8px;
padding: 10px 20px;
margin: 25vh auto;
cursor: pointer;
#overlayMessage {
display: inline-block;
color: #fff;
background: rgba(125, 125, 125, 0.5);
border-radius: 8px;
padding: 10px 20px;
margin: 25vh auto;
cursor: pointer;
}
#frame{
text-align: center !important;
font-family: monospace;
padding: 0;
text-indent: 5px;
#frame {
text-align: center !important;
font-family: monospace;
padding: 0;
text-indent: 5px;
}
#display{
background: black;
min-height: 50vh;
max-height: 50vh;
#display {
background: black;
min-height: 50vh;
max-height: 50vh;
}
#displayAdjust {
min-height: 112px;
min-height: 112px;
}
#displayAdjustForm{
span {
display: inline-block;
vertical-align: top;
div{
min-height : 23px;
max-height: 23px;
text-align: center;
line-height: 23px;
}
}
#displayAdjustForm span {
display: inline-block;
vertical-align: top;
}
#displayAdjustForm span div {
min-height: 23px;
max-height: 23px;
text-align: center;
line-height: 23px;
}
#displayAdjustForm span div.check {
text-align: left;
padding-left: 15px;
}
#statisticsForm div div label {
width: 80px;
text-align: right;
display: inline-block;
padding-right: 3px;
width: 80px;
text-align: right;
display: inline-block;
padding-right: 3px;
}
.half{
box-sizing: border-box;
flex: 0 0 50%;
.half {
box-sizing: border-box;
flex: 0 0 50%;
}
.third{
box-sizing: border-box;
flex: 0 0 33.33333%;
.third {
box-sizing: border-box;
flex: 0 0 33.33333%;
}
.quarter{
box-sizing: border-box;
flex: 0 0 25%;
.quarter {
box-sizing: border-box;
flex: 0 0 25%;
}
.flex {
display: flex;
display: flex;
}
.edited {
background-color: yellow !important;
color: rgb(0, 0, 0) !important;
background-color: yellow !important;
color: #000000 !important;
}
fieldset.inline .field-row {
display: inline-block;
display: inline-block;
}
fieldset.inline .field-row input{
max-width: 50px;
fieldset.inline .field-row input {
max-width: 50px;
}
fieldset.inline input.medium {
max-width: 70px;
max-width: 70px;
}
progress {
width: 97vw;
background-color: silver;
box-shadow: inset -1px -1px #fff,inset 1px 1px grey, inset -2px -2px #dfdfdf,inset 2px 2px #0a0a0a;
box-shadow: inset -1px -1px #fff, inset 1px 1px grey, inset -2px -2px #dfdfdf, inset 2px 2px #0a0a0a;
box-sizing: border-box;
padding: 3px 4px;
bottom: 31px;
@ -134,35 +118,31 @@ progress {
appearance: none;
padding: 2px;
}
button.small,
input.small {
width: 35px;
max-width: 35px;
min-width: 35px;
padding: 0 6px;
width: 35px;
max-width: 35px;
min-width: 35px;
padding: 0 6px;
}
button.medium,
input.medium {
width: 50px;
max-width: 50px;
min-width: 50px;
padding: 0 6px;
width: 50px;
max-width: 50px;
min-width: 50px;
padding: 0 6px;
}
button.large,
input.large {
width: 75px;
min-width: 75px;
max-width: 75px;
padding: 0 6px;
width: 75px;
min-width: 75px;
max-width: 75px;
padding: 0 6px;
}
button.xlarge,
input.xlarge{
width: 125px;
min-width: 125px;
max-width: 125px;
padding: 0 6px;
}
input.xlarge {
width: 125px;
min-width: 125px;
max-width: 125px;
padding: 0 6px;
}

View File

@ -193,6 +193,24 @@
<button class="small manualCtrl" id="scaleMinus" onclick="client.sendScale(-2);" disabled>S -</button>
</div>
</span>
<span>
<div class="check">
<input type="radio" name="imageMode" id="imageMode-8bit" value="8bit" checked />
<label for="imageMode-8bit">Positive 8bit</label>
</div>
<div class="check">
<input type="radio" name="imageMode" id="imageMode-inverted" value="inverted" />
<label for="imageMode-inverted">Negative 8bit</label>
</div>
<div class="check">
<input type="radio" name="imageMode" id="imageMode-rgb" value="rgb" />
<label for="imageMode-rgb">Positive RGB</label>
</div>
<div class="check">
<input type="radio" name="imageMode" id="imageMode-irgb" value="irgb" />
<label for="imageMode-irgb">Negative RGB</label>
</div>
</span>
</form>
</fieldset>
</div>