Compare commits
No commits in common. "main" and "1.6.4" have entirely different histories.
|
@ -4,11 +4,3 @@
|
|||
|
||||
node_modules
|
||||
dist
|
||||
|
||||
*.svd
|
||||
*debug_custom.json
|
||||
*debug.cfg
|
||||
|
||||
notes/mphd
|
||||
|
||||
./lib
|
|
@ -1,9 +0,0 @@
|
|||
[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
|
10
Readme.md
10
Readme.md
|
@ -2,11 +2,6 @@
|
|||
|
||||
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>
|
||||
|
@ -35,13 +30,10 @@ The `mcopy` project is comprised of software and hardware for optical printers,
|
|||
## Downloads <a name="downloads"></a>
|
||||
|
||||
### Latest Installers
|
||||
* [1.6.2](https://github.com/sixteenmillimeter/mcopy/releases/tag/1.6.2) for macOS, Linux (.deb) and Windows (.msi)
|
||||
|
||||
* [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,6 +1,3 @@
|
|||
node_modules/*
|
||||
logs/*
|
||||
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: 14px / 2;
|
||||
left: 14px / 2;
|
||||
top: 7px;
|
||||
left: 7px;
|
||||
}
|
||||
.dial-wrapper input {
|
||||
margin-top: 94px;
|
||||
|
@ -210,10 +210,10 @@ button:focus {
|
|||
top: 0;
|
||||
bottom: 0;
|
||||
overflow: hidden;
|
||||
width: 80px / 2;
|
||||
width: 40px;
|
||||
}
|
||||
.dial-container.dial-container1 {
|
||||
left: 80px / 2;
|
||||
left: 40px;
|
||||
}
|
||||
.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: 80px/2 80px/2;
|
||||
transform-origin: 40px 40px;
|
||||
}
|
||||
.dial-wedge {
|
||||
height: 80px;
|
||||
width: 80px / 2;
|
||||
width: 40px;
|
||||
}
|
||||
.dial-marker {
|
||||
border-radius: 50%;
|
||||
height: 14px / 2;
|
||||
width: 14px / 2;
|
||||
height: 7px;
|
||||
width: 7px;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: calc(50% - (14px * 2));
|
||||
|
@ -367,7 +367,6 @@ button:focus {
|
|||
float: right;
|
||||
width: 90px;
|
||||
margin-right: 60px;
|
||||
height: 32px;
|
||||
}
|
||||
#seq_stats {
|
||||
width: 40%;
|
||||
|
@ -485,9 +484,6 @@ 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;
|
||||
|
@ -504,10 +500,6 @@ 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;
|
||||
|
@ -635,11 +627,6 @@ 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;
|
||||
|
@ -663,44 +650,14 @@ button:focus {
|
|||
::-webkit-scrollbar-thumb:window-inactive {
|
||||
background: rgba(0, 0, 0, 0.05);
|
||||
}
|
||||
#settings h4 {
|
||||
margin-bottom: 1px;
|
||||
}
|
||||
#settings > div {
|
||||
width: 300px;
|
||||
}
|
||||
#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;
|
||||
margin: 0 auto;
|
||||
}
|
||||
#settings > div > div {
|
||||
width: 360px;
|
||||
}
|
||||
#settings input[type=text],
|
||||
#settings input[type=number],
|
||||
#settings select {
|
||||
display: block;
|
||||
border-radius: 5px;
|
||||
|
@ -715,43 +672,33 @@ 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: 0px;
|
||||
margin-top: -1px;
|
||||
float: right;
|
||||
padding: 8px 16px 9px;
|
||||
}
|
||||
#settings input[type=radio] {
|
||||
float: right;
|
||||
|
@ -760,17 +707,6 @@ 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;
|
||||
}
|
||||
|
@ -859,11 +795,9 @@ button:focus {
|
|||
}
|
||||
#path_bar select {
|
||||
line-height: 41px;
|
||||
height: 37px;
|
||||
height: 41px;
|
||||
margin-right: 5px;
|
||||
float: right;
|
||||
box-sizing: content-box;
|
||||
padding: 0 0 0 8px;
|
||||
}
|
||||
#filmout_monitor {
|
||||
display: none;
|
||||
|
@ -903,22 +837,20 @@ 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: 425px;
|
||||
width: 410px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
#filmout_functions {
|
||||
padding-top: 5px;
|
||||
}
|
||||
#filmout_functions > div {
|
||||
width: 425px;
|
||||
width: 410px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
#filmout_stats_video,
|
||||
|
@ -940,12 +872,6 @@ button:focus {
|
|||
#filmout_stats_monitor {
|
||||
right: 5px;
|
||||
}
|
||||
.hide {
|
||||
display: none;
|
||||
}
|
||||
.show {
|
||||
display: block;
|
||||
}
|
||||
#screens {
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
@ -1198,23 +1124,19 @@ button:focus {
|
|||
float: right;
|
||||
}
|
||||
.cam2,
|
||||
.proj2,
|
||||
.black {
|
||||
.proj2 {
|
||||
display: none;
|
||||
}
|
||||
.cam2 > *,
|
||||
.proj2 > *,
|
||||
.black > * {
|
||||
.proj2 > * {
|
||||
visibility: hidden;
|
||||
}
|
||||
.cam2.on,
|
||||
.proj2.on,
|
||||
.black.on {
|
||||
.proj2.on {
|
||||
display: block;
|
||||
}
|
||||
.cam2.on > *,
|
||||
.proj2.on > *,
|
||||
.black.on > * {
|
||||
.proj2.on > * {
|
||||
visibility: visible;
|
||||
}
|
||||
#overlay {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"version": "1.8.133",
|
||||
"version": "1.6.7",
|
||||
"ext_port": 1111,
|
||||
"profiles": {
|
||||
"mcopy": {
|
||||
|
@ -15,8 +15,8 @@
|
|||
"momentary": 0
|
||||
},
|
||||
"black": {
|
||||
"before": 100,
|
||||
"after": 100
|
||||
"before": 0,
|
||||
"after": 0
|
||||
},
|
||||
"light": false
|
||||
},
|
||||
|
@ -178,22 +178,7 @@
|
|||
"cameras": "4",
|
||||
"camera_projectors_identifier": "5",
|
||||
"cameras_projector_identifier": "6",
|
||||
"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",
|
||||
"camera_open": "J",
|
||||
"camera_close": "K",
|
||||
"takeup_forward": "D",
|
||||
"takeup_backward": "F",
|
||||
"error": "E",
|
||||
"camera_exposure": "G",
|
||||
"state": "H",
|
||||
"home": "I",
|
||||
"offset": "O"
|
||||
"cameras_projectors_identifier": "7"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,16 +13,6 @@
|
|||
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");*/
|
||||
|
@ -56,48 +46,35 @@
|
|||
</canvas>
|
||||
<script>
|
||||
'use strict';
|
||||
const { ipcRenderer } = require('electron')
|
||||
const remote = require('@electron/remote')
|
||||
const { remote, ipcRenderer } = require('electron')
|
||||
let imgTmp;
|
||||
function delay (ms) {
|
||||
return new Promise((resolve) => {
|
||||
return setTimeout(resolve, ms)
|
||||
})
|
||||
}
|
||||
async function setImage (src) {
|
||||
return new Promise(async (resolve, reject) => {
|
||||
imgTmp = new Image()
|
||||
let img = document.getElementById('img')
|
||||
let body = document.querySelector('body')
|
||||
body.className = ''
|
||||
body.classList.add('image')
|
||||
imgTmp.onload = function () {
|
||||
img.style.backgroundImage = `url('${src}')`
|
||||
return resolve(src)
|
||||
if (body.classList.contains('meter')) {
|
||||
body.classList.remove('meter')
|
||||
}
|
||||
imgTmp.src = src
|
||||
})
|
||||
}
|
||||
|
||||
function setBlank () {
|
||||
let img = document.getElementById('img')
|
||||
img.style.background = ''
|
||||
img.style.backgroundUrl = ''
|
||||
img.style.backgroundColor = 'black'
|
||||
imgTmp.onload = function () {
|
||||
img.style.backgroundImage = `url('${src}')`;
|
||||
return resolve(src);
|
||||
};
|
||||
imgTmp.src = src;
|
||||
});
|
||||
}
|
||||
async function onMeter () {
|
||||
console.log('meter')
|
||||
const body = document.querySelector('body')
|
||||
body.className = ''
|
||||
body.classList.add('meter')
|
||||
if (!body.classList.contains('meter')) {
|
||||
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')
|
||||
}
|
||||
|
@ -145,9 +122,7 @@
|
|||
const can = document.getElementById('can')
|
||||
const dpr = window.devicePixelRatio || 1
|
||||
const screen = window.outerWidth / window.outerHeight
|
||||
const body = document.querySelector('body')
|
||||
let ctx
|
||||
body.className = ''
|
||||
let ctx;
|
||||
if (!can.classList.contains('show')) {
|
||||
can.classList.add('show')
|
||||
}
|
||||
|
@ -156,7 +131,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 {
|
||||
|
@ -170,7 +145,7 @@
|
|||
can.style.width = `${window.innerHeight * arg.ratio}px`
|
||||
can.style.height = `${window.innerHeight}px`
|
||||
} else {
|
||||
can.style.width = `${window.innerWidth}px`
|
||||
can.style.width = `${window.inneWidth}px`
|
||||
can.style.height = `${window.innerWidth / arg.ratio}px`
|
||||
}
|
||||
} else {
|
||||
|
@ -233,28 +208,18 @@
|
|||
}
|
||||
async function onDigital (event, arg) {
|
||||
if (arg.src) {
|
||||
if (arg.exposure) {
|
||||
setBlank()
|
||||
await delay(10)
|
||||
}
|
||||
try {
|
||||
await setImage(arg.src)
|
||||
} catch (err) {
|
||||
console.error(err)
|
||||
}
|
||||
if (arg.exposure) {
|
||||
await delay(arg.exposure)
|
||||
setBlank()
|
||||
}
|
||||
ipcRenderer.send('display_load', { src : arg.src })
|
||||
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) {
|
||||
|
@ -262,7 +227,6 @@
|
|||
} else {
|
||||
isEscape = (evt.keyCode == 27)
|
||||
}
|
||||
|
||||
if (isEscape) {
|
||||
win = remote.getCurrentWindow()
|
||||
win.close()
|
||||
|
|
|
@ -1,12 +0,0 @@
|
|||
<?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>
|
|
@ -13,7 +13,7 @@
|
|||
</head>
|
||||
<body onload="init();" style="background:#272b30;">
|
||||
<nav id="toolbar"></nav>
|
||||
<div id="screens" class="hide">
|
||||
<div id="screens">
|
||||
<div id="sequencer" class="screen" style="display: block;">
|
||||
<div id="counters">
|
||||
<div class="cam">
|
||||
|
@ -46,8 +46,6 @@
|
|||
<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>
|
||||
</div>
|
||||
|
@ -62,8 +60,6 @@
|
|||
<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>
|
||||
|
@ -148,34 +144,20 @@
|
|||
<i class="fa fa-step-backward"></i>
|
||||
</button>
|
||||
</div>
|
||||
<div class="hide">
|
||||
<div>
|
||||
<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 class="hide">
|
||||
<div>
|
||||
<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>
|
||||
|
@ -407,7 +389,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<div id="settings" class="screen">
|
||||
<div class="left">
|
||||
<div>
|
||||
<div>
|
||||
<h4>Devices</h4>
|
||||
<select id="devices">
|
||||
|
@ -437,13 +419,6 @@
|
|||
<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">
|
||||
|
@ -457,19 +432,6 @@
|
|||
</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,9 +2474,8 @@ 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 = require('@electron/remote');
|
||||
const { ipcRenderer } = require('electron');
|
||||
const { dialog } = remote;
|
||||
const { remote, ipcRenderer } = require('electron');
|
||||
const dialog = require('electron').remote.dialog;
|
||||
const notifier = require('node-notifier');
|
||||
const fs = require('fs');
|
||||
const uuid = require('uuid').v4;
|
||||
|
@ -2496,13 +2495,8 @@ 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');
|
||||
const { Log } = require('./lib/log');
|
||||
|
||||
let log;
|
||||
|
||||
/******
|
||||
|
@ -2516,10 +2510,9 @@ mcopy.state = {
|
|||
async function init () {
|
||||
'use strict';
|
||||
|
||||
log = await Log({ label : 'ui' })
|
||||
log = await require('log')({})
|
||||
|
||||
nav.init();
|
||||
gui.init();
|
||||
grid.init();
|
||||
mse.mscript.init();
|
||||
mse.console.init();
|
||||
|
@ -2530,7 +2523,4 @@ async function init () {
|
|||
proj.init();
|
||||
cam.init();
|
||||
seq.init();
|
||||
capper.init();
|
||||
alertObj.init();
|
||||
timing.init();
|
||||
};
|
|
@ -10,13 +10,6 @@
|
|||
@import "./mscript.less";
|
||||
@import "./filmout.less";
|
||||
|
||||
.hide {
|
||||
display: none;
|
||||
}
|
||||
.show {
|
||||
display: block;
|
||||
}
|
||||
|
||||
#screens{
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
@ -175,8 +168,7 @@
|
|||
}
|
||||
|
||||
.cam2,
|
||||
.proj2,
|
||||
.black{
|
||||
.proj2{
|
||||
display : none;
|
||||
> * {
|
||||
visibility: hidden;
|
||||
|
|
|
@ -42,10 +42,6 @@
|
|||
background: @BACKWARD;
|
||||
border-color: @BACKWARD;
|
||||
}
|
||||
&.capper{
|
||||
background: white;
|
||||
color: @BG;
|
||||
}
|
||||
i{
|
||||
color: @BG;
|
||||
}
|
||||
|
|
|
@ -27,11 +27,9 @@
|
|||
}
|
||||
select{
|
||||
line-height: 41px;
|
||||
height: 37px;
|
||||
height: 41px;
|
||||
margin-right: 5px;
|
||||
float: right;
|
||||
box-sizing: content-box;
|
||||
padding: 0 0 0 8px;
|
||||
}
|
||||
}
|
||||
#filmout_file {
|
||||
|
@ -75,14 +73,12 @@
|
|||
input{
|
||||
margin-right: 5px;
|
||||
margin-left: 5px;
|
||||
width: 308px !important;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
button, input{
|
||||
float: left;
|
||||
}
|
||||
> div{
|
||||
width: 425px;
|
||||
width: 410px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
}
|
||||
|
@ -90,7 +86,7 @@
|
|||
#filmout_functions{
|
||||
padding-top: 5px;
|
||||
> div{
|
||||
width: 425px;
|
||||
width: 410px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,7 +28,6 @@
|
|||
float: right;
|
||||
width: 90px;
|
||||
margin-right: 60px;
|
||||
height: 32px;
|
||||
}
|
||||
}
|
||||
#seq_stats{
|
||||
|
@ -127,13 +126,6 @@
|
|||
color: @BACKWARD + @SECOND;
|
||||
}
|
||||
}
|
||||
#black{
|
||||
input[type=checkbox]{
|
||||
&:checked{
|
||||
background: white;
|
||||
}
|
||||
}
|
||||
}
|
||||
input[type=checkbox]{
|
||||
-webkit-appearance: none;
|
||||
-moz-appearance: none;
|
||||
|
@ -149,10 +141,6 @@
|
|||
display: inline-block;
|
||||
box-sizing: border-box;
|
||||
cursor: pointer;
|
||||
&.disabled{
|
||||
cursor: not-allowed;
|
||||
border-color: rgb(100, 100, 100);
|
||||
}
|
||||
}
|
||||
.L{
|
||||
display: inline-block;
|
||||
|
|
|
@ -1,61 +1,25 @@
|
|||
#settings{
|
||||
h4{
|
||||
margin-bottom: 1px;
|
||||
}
|
||||
> div{
|
||||
width: 300px;
|
||||
&.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;
|
||||
}
|
||||
}
|
||||
margin: 0 auto;
|
||||
}
|
||||
> div > div{
|
||||
width: 360px;
|
||||
}
|
||||
input[type=text],
|
||||
input[type=number],
|
||||
select{
|
||||
input[type=text], 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: 0px;
|
||||
float: right;
|
||||
padding: 8px 16px 9px;
|
||||
margin-top: -1px;
|
||||
float: right;
|
||||
}
|
||||
input[type=radio]{
|
||||
float: right;
|
||||
|
@ -64,15 +28,4 @@
|
|||
.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;
|
||||
}
|
||||
}
|
|
@ -1,40 +0,0 @@
|
|||
<a name="module_lib/alert"></a>
|
||||
|
||||
## lib/alert
|
||||
|
||||
* [lib/alert](#module_lib/alert)
|
||||
* [~Alert](#module_lib/alert..Alert)
|
||||
* [.init()](#module_lib/alert..Alert+init)
|
||||
* [.listen()](#module_lib/alert..Alert+listen)
|
||||
* [.listener()](#module_lib/alert..Alert+listener)
|
||||
* [.start()](#module_lib/alert..Alert+start)
|
||||
|
||||
<a name="module_lib/alert..Alert"></a>
|
||||
|
||||
### lib/alert~Alert
|
||||
Class for pushing an alert to the UI from the backend.
|
||||
|
||||
**Kind**: inner class of [<code>lib/alert</code>](#module_lib/alert)
|
||||
|
||||
* [~Alert](#module_lib/alert..Alert)
|
||||
* [.init()](#module_lib/alert..Alert+init)
|
||||
* [.listen()](#module_lib/alert..Alert+listen)
|
||||
* [.listener()](#module_lib/alert..Alert+listener)
|
||||
* [.start()](#module_lib/alert..Alert+start)
|
||||
|
||||
<a name="module_lib/alert..Alert+init"></a>
|
||||
|
||||
#### alert.init()
|
||||
**Kind**: instance method of [<code>Alert</code>](#module_lib/alert..Alert)
|
||||
<a name="module_lib/alert..Alert+listen"></a>
|
||||
|
||||
#### alert.listen()
|
||||
**Kind**: instance method of [<code>Alert</code>](#module_lib/alert..Alert)
|
||||
<a name="module_lib/alert..Alert+listener"></a>
|
||||
|
||||
#### alert.listener()
|
||||
**Kind**: instance method of [<code>Alert</code>](#module_lib/alert..Alert)
|
||||
<a name="module_lib/alert..Alert+start"></a>
|
||||
|
||||
#### alert.start()
|
||||
**Kind**: instance method of [<code>Alert</code>](#module_lib/alert..Alert)
|
|
@ -1,29 +0,0 @@
|
|||
import type { WebContents } from 'electron';
|
||||
/** @module lib/alert */
|
||||
/**
|
||||
* Class for pushing an alert to the UI from the backend.
|
||||
*/
|
||||
export declare class Alert {
|
||||
private ipc;
|
||||
private log;
|
||||
private id;
|
||||
private cb;
|
||||
private ui;
|
||||
constructor(ui: WebContents);
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private init;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private listen;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private listener;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
start(cmd: string): Promise<number>;
|
||||
}
|
|
@ -1,62 +0,0 @@
|
|||
'use strict';
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Alert = void 0;
|
||||
const electron_1 = require("electron");
|
||||
const log_1 = require("log");
|
||||
/** @module lib/alert */
|
||||
/**
|
||||
* Class for pushing an alert to the UI from the backend.
|
||||
*/
|
||||
class Alert {
|
||||
constructor(ui) {
|
||||
this.ipc = electron_1.ipcMain;
|
||||
this.id = 'alert';
|
||||
this.cb = null;
|
||||
this.ui = ui;
|
||||
this.init();
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
async init() {
|
||||
this.log = await (0, log_1.Log)({ label: this.id });
|
||||
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));
|
||||
}
|
||||
}
|
||||
exports.Alert = Alert;
|
||||
module.exports = { Alert };
|
||||
//# sourceMappingURL=index.js.map
|
|
@ -1 +0,0 @@
|
|||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/alert/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;AAEb,uCAAmC;AAEnC,6BAA0B;AAI1B,wBAAwB;AAExB;;GAEG;AAEH,MAAa,KAAK;IAOjB,YAAc,EAAgB;QANtB,QAAG,GAAoB,kBAAO,CAAA;QAE9B,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,IAAI,CAAC,GAAG,GAAG,MAAM,IAAA,SAAG,EAAC,EAAE,KAAK,EAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;QACzC,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,KAAoB,EAAE,GAAS;QACtD,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,GAAY,CAAC,IAAI,IAAI,EAAE,CAAC;QACnC,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,GAAY,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC;gBAC1C,OAAO,OAAO,CAAC,EAAE,CAAC,CAAC;YACpB,CAAC,CAAA;QACF,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACf,CAAC;CACD;AAvDD,sBAuDC;AAED,MAAM,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,CAAA"}
|
|
@ -1,146 +1,43 @@
|
|||
## Modules
|
||||
<a name="Arduino"></a>
|
||||
|
||||
<dl>
|
||||
<dt><a href="#module_lib/arduino">lib/arduino</a></dt>
|
||||
<dd></dd>
|
||||
</dl>
|
||||
## Arduino
|
||||
Class representing the arduino communication features
|
||||
|
||||
## Constants
|
||||
**Kind**: global class
|
||||
|
||||
<dl>
|
||||
<dt><a href="#delay_1">delay_1</a></dt>
|
||||
<dd><p>2023-07-16 Clarification</p>
|
||||
<p>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:</p>
|
||||
<p>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</p>
|
||||
</dd>
|
||||
</dl>
|
||||
* [Arduino](#Arduino)
|
||||
* [.enumerate()](#Arduino+enumerate) ⇒ <code>Promise</code>
|
||||
* [.sendAsync(device, cmd)](#Arduino+sendAsync) ⇒ <code>Promise</code>
|
||||
* [.writeAsync(device, str)](#Arduino+writeAsync) ⇒ <code>Promise</code>
|
||||
* [.openArduino(device)](#Arduino+openArduino) ⇒ <code>Promise</code>
|
||||
* [.closeArduino(device)](#Arduino+closeArduino) ⇒ <code>Promise</code>
|
||||
|
||||
<a name="module_lib/arduino"></a>
|
||||
<a name="Arduino+enumerate"></a>
|
||||
|
||||
## lib/arduino
|
||||
|
||||
* [lib/arduino](#module_lib/arduino)
|
||||
* [~Arduino](#module_lib/arduino..Arduino)
|
||||
* [.enumerate()](#module_lib/arduino..Arduino+enumerate) ⇒ <code>Promise</code>
|
||||
* [.sendAsync(device, cmd)](#module_lib/arduino..Arduino+sendAsync) ⇒ <code>Promise</code>
|
||||
* [.send(device, cmd)](#module_lib/arduino..Arduino+send) ⇒ <code>Promise.<(boolean\|string)></code>
|
||||
* [.sendString(device, str)](#module_lib/arduino..Arduino+sendString) ⇒ <code>Promise.<(boolean\|string)></code>
|
||||
* [.stateAsync()](#module_lib/arduino..Arduino+stateAsync)
|
||||
* [.state()](#module_lib/arduino..Arduino+state)
|
||||
* [.writeAsync(device, str)](#module_lib/arduino..Arduino+writeAsync) ⇒ <code>Promise</code>
|
||||
* [.end(serial, data)](#module_lib/arduino..Arduino+end) ⇒ <code>any</code>
|
||||
* [.aliasSerial(device, serial)](#module_lib/arduino..Arduino+aliasSerial)
|
||||
* [.connect(device, serial, confirm)](#module_lib/arduino..Arduino+connect) ⇒ <code>Promise.<string></code>
|
||||
* [.confirmEnd(data)](#module_lib/arduino..Arduino+confirmEnd)
|
||||
* [.verify()](#module_lib/arduino..Arduino+verify) ⇒ <code>Promise.<boolean></code>
|
||||
* [.distinguish()](#module_lib/arduino..Arduino+distinguish) ⇒ <code>Promise.<string></code>
|
||||
* [.close()](#module_lib/arduino..Arduino+close) ⇒ <code>Promise.<boolean></code>
|
||||
* [.fakeConnect(serial)](#module_lib/arduino..Arduino+fakeConnect) ⇒ <code>Promise.<boolean></code>
|
||||
* [.openArduino(device)](#module_lib/arduino..Arduino+openArduino) ⇒ <code>Promise</code>
|
||||
* [.closeArduino(device)](#module_lib/arduino..Arduino+closeArduino) ⇒ <code>Promise</code>
|
||||
|
||||
<a name="module_lib/arduino..Arduino"></a>
|
||||
|
||||
### lib/arduino~Arduino
|
||||
Class representing the arduino communication features.
|
||||
|
||||
**Kind**: inner class of [<code>lib/arduino</code>](#module_lib/arduino)
|
||||
|
||||
* [~Arduino](#module_lib/arduino..Arduino)
|
||||
* [.enumerate()](#module_lib/arduino..Arduino+enumerate) ⇒ <code>Promise</code>
|
||||
* [.sendAsync(device, cmd)](#module_lib/arduino..Arduino+sendAsync) ⇒ <code>Promise</code>
|
||||
* [.send(device, cmd)](#module_lib/arduino..Arduino+send) ⇒ <code>Promise.<(boolean\|string)></code>
|
||||
* [.sendString(device, str)](#module_lib/arduino..Arduino+sendString) ⇒ <code>Promise.<(boolean\|string)></code>
|
||||
* [.stateAsync()](#module_lib/arduino..Arduino+stateAsync)
|
||||
* [.state()](#module_lib/arduino..Arduino+state)
|
||||
* [.writeAsync(device, str)](#module_lib/arduino..Arduino+writeAsync) ⇒ <code>Promise</code>
|
||||
* [.end(serial, data)](#module_lib/arduino..Arduino+end) ⇒ <code>any</code>
|
||||
* [.aliasSerial(device, serial)](#module_lib/arduino..Arduino+aliasSerial)
|
||||
* [.connect(device, serial, confirm)](#module_lib/arduino..Arduino+connect) ⇒ <code>Promise.<string></code>
|
||||
* [.confirmEnd(data)](#module_lib/arduino..Arduino+confirmEnd)
|
||||
* [.verify()](#module_lib/arduino..Arduino+verify) ⇒ <code>Promise.<boolean></code>
|
||||
* [.distinguish()](#module_lib/arduino..Arduino+distinguish) ⇒ <code>Promise.<string></code>
|
||||
* [.close()](#module_lib/arduino..Arduino+close) ⇒ <code>Promise.<boolean></code>
|
||||
* [.fakeConnect(serial)](#module_lib/arduino..Arduino+fakeConnect) ⇒ <code>Promise.<boolean></code>
|
||||
* [.openArduino(device)](#module_lib/arduino..Arduino+openArduino) ⇒ <code>Promise</code>
|
||||
* [.closeArduino(device)](#module_lib/arduino..Arduino+closeArduino) ⇒ <code>Promise</code>
|
||||
|
||||
<a name="module_lib/arduino..Arduino+enumerate"></a>
|
||||
|
||||
#### arduino.enumerate() ⇒ <code>Promise</code>
|
||||
### arduino.enumerate() ⇒ <code>Promise</code>
|
||||
Enumerate all connected devices that might be Arduinos
|
||||
|
||||
**Kind**: instance method of [<code>Arduino</code>](#module_lib/arduino..Arduino)
|
||||
**Kind**: instance method of [<code>Arduino</code>](#Arduino)
|
||||
**Returns**: <code>Promise</code> - Resolves after enumerating
|
||||
<a name="module_lib/arduino..Arduino+sendAsync"></a>
|
||||
<a name="Arduino+sendAsync"></a>
|
||||
|
||||
#### arduino.sendAsync(device, cmd) ⇒ <code>Promise</code>
|
||||
### arduino.sendAsync(device, cmd) ⇒ <code>Promise</code>
|
||||
Send a command to an Arduino using async/await
|
||||
|
||||
**Kind**: instance method of [<code>Arduino</code>](#module_lib/arduino..Arduino)
|
||||
**Kind**: instance method of [<code>Arduino</code>](#Arduino)
|
||||
**Returns**: <code>Promise</code> - Resolves after sending
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| device | <code>string</code> | The Arduino device identifier |
|
||||
| device | <code>string</code> | Arduino identifier |
|
||||
| cmd | <code>string</code> | Single character command to send |
|
||||
|
||||
<a name="module_lib/arduino..Arduino+send"></a>
|
||||
<a name="Arduino+writeAsync"></a>
|
||||
|
||||
#### arduino.send(device, cmd) ⇒ <code>Promise.<(boolean\|string)></code>
|
||||
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.
|
||||
|
||||
**Kind**: instance method of [<code>Arduino</code>](#module_lib/arduino..Arduino)
|
||||
**Returns**: <code>Promise.<(boolean\|string)></code> - Returns 'false' if the communication is locked, otherwise returns the response from the device.
|
||||
**Throws**:
|
||||
|
||||
- <code>Error</code> Throws an error if the sendAsync method encounters an error.
|
||||
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| device | <code>string</code> | The Arduino device identifier. |
|
||||
| cmd | <code>string</code> | The command to be sent to the Arduino. |
|
||||
|
||||
<a name="module_lib/arduino..Arduino+sendString"></a>
|
||||
|
||||
#### arduino.sendString(device, str) ⇒ <code>Promise.<(boolean\|string)></code>
|
||||
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.
|
||||
|
||||
**Kind**: instance method of [<code>Arduino</code>](#module_lib/arduino..Arduino)
|
||||
**Returns**: <code>Promise.<(boolean\|string)></code> - Returns 'true' if the string is sent successfully, otherwise returns an error message.
|
||||
**Throws**:
|
||||
|
||||
- <code>Error</code> Throws an error if the writeAsync method encounters an error.
|
||||
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| device | <code>string</code> | The Arduino device identifier. |
|
||||
| str | <code>string</code> | The string to be sent to the Arduino. |
|
||||
|
||||
<a name="module_lib/arduino..Arduino+stateAsync"></a>
|
||||
|
||||
#### arduino.stateAsync()
|
||||
**Kind**: instance method of [<code>Arduino</code>](#module_lib/arduino..Arduino)
|
||||
<a name="module_lib/arduino..Arduino+state"></a>
|
||||
|
||||
#### arduino.state()
|
||||
**Kind**: instance method of [<code>Arduino</code>](#module_lib/arduino..Arduino)
|
||||
<a name="module_lib/arduino..Arduino+writeAsync"></a>
|
||||
|
||||
#### arduino.writeAsync(device, str) ⇒ <code>Promise</code>
|
||||
### arduino.writeAsync(device, str) ⇒ <code>Promise</code>
|
||||
Send a string to an Arduino using async/await
|
||||
|
||||
**Kind**: instance method of [<code>Arduino</code>](#module_lib/arduino..Arduino)
|
||||
**Kind**: instance method of [<code>Arduino</code>](#Arduino)
|
||||
**Returns**: <code>Promise</code> - Resolves after sending
|
||||
|
||||
| Param | Type | Description |
|
||||
|
@ -148,149 +45,27 @@ Send a string to an Arduino using async/await
|
|||
| device | <code>string</code> | Arduino identifier |
|
||||
| str | <code>string</code> | String to send |
|
||||
|
||||
<a name="module_lib/arduino..Arduino+end"></a>
|
||||
<a name="Arduino+openArduino"></a>
|
||||
|
||||
#### arduino.end(serial, data) ⇒ <code>any</code>
|
||||
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.
|
||||
|
||||
**Kind**: instance method of [<code>Arduino</code>](#module_lib/arduino..Arduino)
|
||||
**Returns**: <code>any</code> - The time taken for the communication in milliseconds.
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| serial | <code>string</code> | The serial address of the Arduino device. |
|
||||
| data | <code>string</code> | The data received from the Arduino. |
|
||||
|
||||
<a name="module_lib/arduino..Arduino+aliasSerial"></a>
|
||||
|
||||
#### arduino.aliasSerial(device, serial)
|
||||
Associates an alias with an Arduinos serial address.
|
||||
Used to map multi-purpose devices onto the same serial connection.
|
||||
|
||||
**Kind**: instance method of [<code>Arduino</code>](#module_lib/arduino..Arduino)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| device | <code>string</code> | The serial number of the target Arduino. |
|
||||
| serial | <code>string</code> | The alias to be associated with the target device. |
|
||||
|
||||
<a name="module_lib/arduino..Arduino+connect"></a>
|
||||
|
||||
#### arduino.connect(device, serial, confirm) ⇒ <code>Promise.<string></code>
|
||||
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.
|
||||
|
||||
**Kind**: instance method of [<code>Arduino</code>](#module_lib/arduino..Arduino)
|
||||
**Returns**: <code>Promise.<string></code> - Resolves with the device path if the connection is successful.
|
||||
**Throws**:
|
||||
|
||||
- <code>Error</code> Rejects with an error message if the connection fails.
|
||||
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| device | <code>string</code> | The device identifier (common name). |
|
||||
| serial | <code>string</code> | The serial address of the target Arduino (e.g., COM port on Windows). |
|
||||
| confirm | <code>function</code> | A callback function to be executed upon receiving confirmation data. |
|
||||
|
||||
<a name="module_lib/arduino..Arduino+confirmEnd"></a>
|
||||
|
||||
#### arduino.confirmEnd(data)
|
||||
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.
|
||||
|
||||
**Kind**: instance method of [<code>Arduino</code>](#module_lib/arduino..Arduino)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| data | <code>string</code> | The data received from the Arduino. |
|
||||
|
||||
<a name="module_lib/arduino..Arduino+verify"></a>
|
||||
|
||||
#### arduino.verify() ⇒ <code>Promise.<boolean></code>
|
||||
Verifies the connection to an Arduino by sending a connect command.
|
||||
The confirmation callback checks if the received data matches the expected connect command.
|
||||
|
||||
**Kind**: instance method of [<code>Arduino</code>](#module_lib/arduino..Arduino)
|
||||
**Returns**: <code>Promise.<boolean></code> - Resolves with 'true' if the connection is verified successfully.
|
||||
**Throws**:
|
||||
|
||||
- <code>Error</code> Rejects with an error message if the connection verification fails.
|
||||
|
||||
<a name="module_lib/arduino..Arduino+distinguish"></a>
|
||||
|
||||
#### arduino.distinguish() ⇒ <code>Promise.<string></code>
|
||||
Distinguishes the type of Arduino connected.
|
||||
Sends a command to the device to identify its type and resolves the promise with the received type.
|
||||
|
||||
**Kind**: instance method of [<code>Arduino</code>](#module_lib/arduino..Arduino)
|
||||
**Returns**: <code>Promise.<string></code> - Resolves with the type of the connected Arduino-based device.
|
||||
**Throws**:
|
||||
|
||||
- <code>Error</code> Rejects with an error message if the distinguish operation fails.
|
||||
|
||||
<a name="module_lib/arduino..Arduino+close"></a>
|
||||
|
||||
#### arduino.close() ⇒ <code>Promise.<boolean></code>
|
||||
Closes the connection to an Arduino.
|
||||
|
||||
**Kind**: instance method of [<code>Arduino</code>](#module_lib/arduino..Arduino)
|
||||
**Returns**: <code>Promise.<boolean></code> - Resolves with 'true' if the connection is closed successfully.
|
||||
**Throws**:
|
||||
|
||||
- <code>Error</code> Throws an error if the closeArduino method encounters an error.
|
||||
|
||||
<a name="module_lib/arduino..Arduino+fakeConnect"></a>
|
||||
|
||||
#### arduino.fakeConnect(serial) ⇒ <code>Promise.<boolean></code>
|
||||
Establishes a fake connection to an Arduino for testing purposes.
|
||||
Creates a fake SerialPort instance with custom write and string methods.
|
||||
|
||||
**Kind**: instance method of [<code>Arduino</code>](#module_lib/arduino..Arduino)
|
||||
**Returns**: <code>Promise.<boolean></code> - Resolves with 'true' if the fake connection is established successfully.
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| serial | <code>string</code> | The device identifier of the fake Arduino. |
|
||||
|
||||
<a name="module_lib/arduino..Arduino+openArduino"></a>
|
||||
|
||||
#### arduino.openArduino(device) ⇒ <code>Promise</code>
|
||||
### arduino.openArduino(device) ⇒ <code>Promise</code>
|
||||
Connect to an Arduino using async/await
|
||||
|
||||
**Kind**: instance method of [<code>Arduino</code>](#module_lib/arduino..Arduino)
|
||||
**Kind**: instance method of [<code>Arduino</code>](#Arduino)
|
||||
**Returns**: <code>Promise</code> - Resolves after opening
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| device | <code>string</code> | Arduino identifier |
|
||||
|
||||
<a name="module_lib/arduino..Arduino+closeArduino"></a>
|
||||
<a name="Arduino+closeArduino"></a>
|
||||
|
||||
#### arduino.closeArduino(device) ⇒ <code>Promise</code>
|
||||
### arduino.closeArduino(device) ⇒ <code>Promise</code>
|
||||
Close a connection to an Arduino using async/await
|
||||
|
||||
**Kind**: instance method of [<code>Arduino</code>](#module_lib/arduino..Arduino)
|
||||
**Kind**: instance method of [<code>Arduino</code>](#Arduino)
|
||||
**Returns**: <code>Promise</code> - Resolves after closing
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| device | <code>string</code> | Arduino identifier |
|
||||
|
||||
<a name="delay_1"></a>
|
||||
|
||||
## delay\_1
|
||||
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
|
||||
|
||||
**Kind**: global constant
|
||||
|
|
|
@ -1,179 +0,0 @@
|
|||
/// <reference types="node" />
|
||||
import type { EventEmitter } from 'events';
|
||||
import type { Config } from 'cfg';
|
||||
/** @module lib/arduino */
|
||||
/**
|
||||
* Class representing the arduino communication features.
|
||||
*/
|
||||
export declare class Arduino {
|
||||
private log;
|
||||
private eventEmitter;
|
||||
private cfg;
|
||||
private path;
|
||||
private known;
|
||||
private serial;
|
||||
private baud;
|
||||
private queue;
|
||||
private timer;
|
||||
private locks;
|
||||
private confirmExec;
|
||||
private errorState;
|
||||
private keys;
|
||||
private values;
|
||||
alias: any;
|
||||
stateStr: any;
|
||||
hasState: any;
|
||||
constructor(cfg: Config, ee: EventEmitter, errorState: Function);
|
||||
init(): Promise<void>;
|
||||
/**
|
||||
* Enumerate all connected devices that might be Arduinos
|
||||
*
|
||||
* @async
|
||||
* @returns {Promise} Resolves after enumerating
|
||||
**/
|
||||
enumerate(): Promise<string[]>;
|
||||
/**
|
||||
* Send a command to an Arduino using async/await
|
||||
*
|
||||
* @param {string} device The Arduino device identifier
|
||||
* @param {string} cmd Single character command to send
|
||||
*
|
||||
* @async
|
||||
* @returns {Promise} Resolves after sending
|
||||
**/
|
||||
private sendAsync;
|
||||
/**
|
||||
* 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.
|
||||
**/
|
||||
send(device: string, cmd: string): Promise<number>;
|
||||
/**
|
||||
* 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.
|
||||
**/
|
||||
sendString(device: string, str: string): Promise<number>;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private stateAsync;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
state(device: string, confirm?: boolean): Promise<string>;
|
||||
/**
|
||||
* Send a string to an Arduino using async/await
|
||||
*
|
||||
* @param {string} device Arduino identifier
|
||||
* @param {string} str String to send
|
||||
*
|
||||
* @returns {Promise} Resolves after sending
|
||||
**/
|
||||
private writeAsync;
|
||||
/**
|
||||
* 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.
|
||||
**/
|
||||
private end;
|
||||
private error;
|
||||
/**
|
||||
* 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: string, serial: string): void;
|
||||
/**
|
||||
* 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.
|
||||
**/
|
||||
connect(device: string, serial: string, confirm: any): Promise<any>;
|
||||
/**
|
||||
* 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.
|
||||
**/
|
||||
private confirmEnd;
|
||||
/**
|
||||
* 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.
|
||||
**/
|
||||
verify(): Promise<unknown>;
|
||||
/**
|
||||
* 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.
|
||||
**/
|
||||
distinguish(): Promise<string>;
|
||||
/**
|
||||
* 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.
|
||||
**/
|
||||
close(): Promise<boolean>;
|
||||
/**
|
||||
* 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.
|
||||
**/
|
||||
fakeConnect(device: string): Promise<boolean>;
|
||||
/**
|
||||
* Connect to an Arduino using async/await
|
||||
*
|
||||
* @param {string} device Arduino identifier
|
||||
*
|
||||
* @returns {Promise} Resolves after opening
|
||||
**/
|
||||
private openArduino;
|
||||
/**
|
||||
* Close a connection to an Arduino using async/await
|
||||
*
|
||||
* @param {string} device Arduino identifier
|
||||
*
|
||||
* @returns {Promise} Resolves after closing
|
||||
**/
|
||||
private closeArduino;
|
||||
private lock;
|
||||
private unlock;
|
||||
private isLocked;
|
||||
}
|
|
@ -1,25 +1,16 @@
|
|||
'use strict';
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Arduino = void 0;
|
||||
/**
|
||||
* 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 log_1 = require("log");
|
||||
const { SerialPort } = require('serialport');
|
||||
const { ReadlineParser } = require('@serialport/parser-readline');
|
||||
const parser = new ReadlineParser({ delimiter: '\r\n' });
|
||||
const SerialPort = require('serialport');
|
||||
const Readline = SerialPort.parsers.Readline;
|
||||
const exec = require('child_process').exec;
|
||||
const parser = new Readline('');
|
||||
const newlineRe = new RegExp('\n', 'g');
|
||||
const returnRe = new RegExp('\r', 'g');
|
||||
let eventEmitter;
|
||||
let cfg;
|
||||
let arduino;
|
||||
const KNOWN = [
|
||||
'/dev/tty.usbmodem1a161',
|
||||
'/dev/tty.usbserial-A800f8dk',
|
||||
|
@ -30,36 +21,30 @@ const KNOWN = [
|
|||
'/dev/ttyACM0',
|
||||
'COM3'
|
||||
];
|
||||
/** @module lib/arduino */
|
||||
/**
|
||||
* Class representing the arduino communication features.
|
||||
*/
|
||||
* Class representing the arduino communication features
|
||||
**/
|
||||
class Arduino {
|
||||
constructor(cfg, ee, errorState) {
|
||||
constructor(errorState) {
|
||||
this.path = {};
|
||||
this.known = KNOWN;
|
||||
this.serial = {};
|
||||
this.alias = {};
|
||||
this.serial = { connect: {}, projector: {}, camera: {}, light: {} };
|
||||
this.baud = 57600;
|
||||
this.queue = {};
|
||||
this.timer = 0;
|
||||
this.lock = false;
|
||||
this.locks = {};
|
||||
this.alias = {};
|
||||
this.stateStr = {};
|
||||
this.hasState = {};
|
||||
this.cfg = cfg;
|
||||
this.eventEmitter = ee;
|
||||
this.errorState = errorState;
|
||||
this.init();
|
||||
}
|
||||
async init() {
|
||||
this.log = await (0, log_1.Log)({ label: 'arduino' });
|
||||
this.keys = Object.keys(this.cfg.arduino.cmd);
|
||||
this.values = this.keys.map((key) => this.cfg.arduino.cmd[key]);
|
||||
const Log = require('log');
|
||||
this.log = await Log({ label: 'arduino' });
|
||||
}
|
||||
/**
|
||||
* Enumerate all connected devices that might be Arduinos
|
||||
*
|
||||
* @async
|
||||
* @returns {Promise} Resolves after enumerating
|
||||
**/
|
||||
async enumerate() {
|
||||
|
@ -100,149 +85,63 @@ class Arduino {
|
|||
/**
|
||||
* Send a command to an Arduino using async/await
|
||||
*
|
||||
* @param {string} device The Arduino device identifier
|
||||
* @param {string} device Arduino 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);
|
||||
};
|
||||
//this.log.info(`Device: ${device}`)
|
||||
return this.serial[this.alias[device]].write(cmd, (err, results) => {
|
||||
return this.serial[device].write(cmd, (err, results) => {
|
||||
if (err) {
|
||||
//this.log.error(err)
|
||||
//console.error(err)
|
||||
return reject(err);
|
||||
}
|
||||
//
|
||||
});
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 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.error(`send Serial ${serial} is locked`);
|
||||
return 0;
|
||||
async send(serial, cmd) {
|
||||
const device = this.alias[serial];
|
||||
let results;
|
||||
console.log(`${cmd} -> ${serial}`);
|
||||
if (this.locks[serial]) {
|
||||
return false;
|
||||
}
|
||||
this.timer = new Date().getTime();
|
||||
this.lock(serial);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
this.locks[serial] = true;
|
||||
await delay_1.delay(cfg.arduino.serialDelay);
|
||||
try {
|
||||
ms = await this.sendAsync(device, cmd);
|
||||
results = await this.sendAsync(device, cmd);
|
||||
}
|
||||
catch (e) {
|
||||
this.log.error(`Failed to send to ${device} @ ${serial}`, e);
|
||||
return 0;
|
||||
return console.error(e);
|
||||
}
|
||||
this.unlock(serial);
|
||||
await this.eventEmitter.emit('arduino_send', cmd);
|
||||
return ms;
|
||||
this.locks[serial] = false;
|
||||
await eventEmitter.emit('arduino_send', cmd);
|
||||
return results;
|
||||
}
|
||||
/**
|
||||
* 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 ms;
|
||||
await (0, delay_1.delay)(this.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);
|
||||
async string(serial, str) {
|
||||
const device = this.alias[serial];
|
||||
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);
|
||||
}
|
||||
else {
|
||||
this.log.info(`sendString ${str} -> ${device}`);
|
||||
try {
|
||||
ms = await this.writeAsync(device, str);
|
||||
writeSuccess = await this.writeAsync(device, str);
|
||||
}
|
||||
catch (e) {
|
||||
this.log.error(`Error sending string to ${device}`, e);
|
||||
return 0;
|
||||
return console.error(e);
|
||||
}
|
||||
this.unlock(this.alias[device]);
|
||||
return ms;
|
||||
return writeSuccess;
|
||||
}
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
async stateAsync(device, confirm = false) {
|
||||
const cmd = this.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)(this.cfg.arduino.serialDelay);
|
||||
try {
|
||||
results = await this.stateAsync(device, confirm);
|
||||
}
|
||||
catch (e) {
|
||||
this.log.error(`Error getting state from ${device}`, e);
|
||||
return null;
|
||||
}
|
||||
this.unlock(serial);
|
||||
await this.eventEmitter.emit('arduino_state', this.cfg.arduino.cmd.state);
|
||||
return results;
|
||||
}
|
||||
/**
|
||||
* Send a string to an Arduino using async/await
|
||||
*
|
||||
|
@ -253,7 +152,7 @@ class Arduino {
|
|||
**/
|
||||
async writeAsync(device, str) {
|
||||
return new Promise((resolve, reject) => {
|
||||
this.serial[this.alias[device]].write(str, function (err, results) {
|
||||
this.serial[device].write(str, function (err, results) {
|
||||
if (err) {
|
||||
return reject(err);
|
||||
}
|
||||
|
@ -261,104 +160,59 @@ 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}`)
|
||||
console.log(`${serial} -> ${data}`);
|
||||
if (this.queue[data] !== undefined) {
|
||||
this.unlock(serial);
|
||||
this.locks[serial] = false;
|
||||
complete = this.queue[data](ms); //execute callback
|
||||
this.eventEmitter.emit('arduino_end', data);
|
||||
eventEmitter.emit('arduino_end', data);
|
||||
delete this.queue[data];
|
||||
}
|
||||
else if (data[0] === this.cfg.arduino.cmd.state) {
|
||||
//this.log.info(`end serial -> ${serial}`)
|
||||
this.unlock(serial);
|
||||
complete = this.queue[this.cfg.arduino.cmd.state](data);
|
||||
this.eventEmitter.emit('arduino_end', data);
|
||||
delete this.queue[this.cfg.arduino.cmd.state];
|
||||
return data;
|
||||
}
|
||||
else if (data[0] === this.cfg.arduino.cmd.error) {
|
||||
this.log.error(`Received error from device ${serial}`);
|
||||
this.unlock(serial);
|
||||
this.error(serial, data);
|
||||
else if (data === 'E') {
|
||||
//error state
|
||||
//stop sequence
|
||||
//throw error in ui
|
||||
}
|
||||
else {
|
||||
this.log.info('Received stray "' + data + '"'); //silent to user
|
||||
//console.log('Received stray "' + data + '"'); //silent to user
|
||||
}
|
||||
return ms;
|
||||
}
|
||||
error(serial, data) {
|
||||
this.log.error("ERROR", data);
|
||||
aliasSerial(serial, device) {
|
||||
//this.log.info(`Making "${serial}" an alias of ${device}`);
|
||||
this.alias[serial] = device;
|
||||
}
|
||||
/**
|
||||
* 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}`)
|
||||
async connect(serial, device, confirm) {
|
||||
return new Promise(async (resolve, reject) => {
|
||||
let connectSuccess;
|
||||
this.path[device] = serial;
|
||||
this.aliasSerial(device, serial);
|
||||
this.serial[serial] = new SerialPort({
|
||||
path: serial,
|
||||
this.path[serial] = device;
|
||||
this.alias[serial] = device;
|
||||
this.serial[device] = new SerialPort(this.path[serial], {
|
||||
autoOpen: false,
|
||||
baudRate: this.cfg.arduino.baud,
|
||||
parser
|
||||
baudRate: cfg.arduino.baud,
|
||||
parser: parser
|
||||
});
|
||||
this.unlock(serial);
|
||||
this.locks[device] = false;
|
||||
try {
|
||||
connectSuccess = await this.openArduino(device);
|
||||
}
|
||||
catch (e) {
|
||||
this.log.error(`Failed to open ${device} @ ${serial}: ` + e);
|
||||
console.error('failed to open: ' + e);
|
||||
return reject(e);
|
||||
}
|
||||
this.log.info(`Opened connection with ${this.path[device]} as ${device}`);
|
||||
//console.log(`Opened connection with ${this.path[serial]} as ${serial}`);
|
||||
if (!confirm) {
|
||||
this.serial[this.alias[device]].on('data', async (data) => {
|
||||
this.serial[device].on('data', async (data) => {
|
||||
let d = data.toString('utf8');
|
||||
d = d.replace(newlineRe, '').replace(returnRe, '');
|
||||
return this.end(serial, d);
|
||||
});
|
||||
}
|
||||
else {
|
||||
this.serial[this.alias[device]].on('data', async (data) => {
|
||||
this.serial[device].on('data', async (data) => {
|
||||
let d = data.toString('utf8');
|
||||
d = d.replace(newlineRe, '').replace(returnRe, '');
|
||||
return await this.confirmEnd(d);
|
||||
|
@ -367,47 +221,46 @@ 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) {
|
||||
if (this.values.indexOf(data) !== -1 && typeof this.confirmExec === 'function') {
|
||||
//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) {
|
||||
this.confirmExec(null, data);
|
||||
this.confirmExec = null;
|
||||
this.unlock(this.alias['connect']);
|
||||
}
|
||||
else if (data[0] === this.cfg.arduino.cmd.state) {
|
||||
this.queue[this.cfg.arduino.cmd.state](data);
|
||||
delete this.queue[this.cfg.arduino.cmd.state];
|
||||
this.unlock(this.alias['connect']);
|
||||
this.confirmExec = {};
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 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 = 'connect';
|
||||
const device = this.alias['connect'];
|
||||
let writeSuccess;
|
||||
this.confirmExec = function (err, data) {
|
||||
if (data === this.cfg.arduino.cmd.connect) {
|
||||
if (data === cfg.arduino.cmd.connect) {
|
||||
return resolve(true);
|
||||
}
|
||||
else {
|
||||
return reject('Wrong data returned');
|
||||
}
|
||||
};
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await delay_1.delay(cfg.arduino.serialDelay);
|
||||
try {
|
||||
writeSuccess = await this.sendAsync(device, this.cfg.arduino.cmd.connect);
|
||||
writeSuccess = await this.sendAsync(device, cfg.arduino.cmd.connect);
|
||||
}
|
||||
catch (e) {
|
||||
return reject(e);
|
||||
|
@ -415,92 +268,64 @@ 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 = 'connect';
|
||||
const device = this.alias['connect'];
|
||||
let writeSuccess;
|
||||
let type;
|
||||
this.confirmExec = function (err, data) {
|
||||
if (data === this.cfg.arduino.cmd.projector_identifier) {
|
||||
if (data === cfg.arduino.cmd.projector_identifier) {
|
||||
type = 'projector';
|
||||
}
|
||||
else if (data === this.cfg.arduino.cmd.camera_identifier) {
|
||||
else if (data === cfg.arduino.cmd.camera_identifier) {
|
||||
type = 'camera';
|
||||
}
|
||||
else if (data === this.cfg.arduino.cmd.light_identifier) {
|
||||
else if (data === cfg.arduino.cmd.light_identifier) {
|
||||
type = 'light';
|
||||
}
|
||||
else if (data === this.cfg.arduino.cmd.projector_light_identifier) {
|
||||
else if (data === cfg.arduino.cmd.projector_light_identifier) {
|
||||
type = 'projector,light';
|
||||
}
|
||||
else if (data === this.cfg.arduino.cmd.projector_camera_light_identifier) {
|
||||
else if (data === cfg.arduino.cmd.projector_camera_light_identifier) {
|
||||
type = 'projector,camera,light';
|
||||
}
|
||||
else if (data === this.cfg.arduino.cmd.projector_camera_identifier) {
|
||||
else if (data === cfg.arduino.cmd.projector_camera_identifier) {
|
||||
type = 'projector,camera';
|
||||
}
|
||||
else if (data === this.cfg.arduino.cmd.projector_second_identifier) {
|
||||
else if (data === cfg.arduino.cmd.projector_second_identifier) {
|
||||
type = 'projector_second';
|
||||
}
|
||||
else if (data === this.cfg.arduino.cmd.projectors_identifier) {
|
||||
else if (data === cfg.arduino.cmd.projectors_identifier) {
|
||||
type = 'projector,projector_second';
|
||||
}
|
||||
else if (data === this.cfg.arduino.cmd.camera_second_identifier) {
|
||||
else if (data === cfg.arduino.cmd.camera_second_identifier) {
|
||||
type = 'camera_second';
|
||||
}
|
||||
else if (data === this.cfg.arduino.cmd.cameras_identifier) {
|
||||
else if (data === cfg.arduino.cmd.cameras_identifier) {
|
||||
type = 'camera,camera_second';
|
||||
}
|
||||
else if (data === this.cfg.arduino.cmd.camera_projectors_identifier) {
|
||||
else if (data === cfg.arduino.cmd.camera_projectors_identifier) {
|
||||
type = 'camera,projector,projector_second';
|
||||
}
|
||||
else if (data === this.cfg.arduino.cmd.cameras_projector_identifier) {
|
||||
else if (data === cfg.arduino.cmd.cameras_projector_identifier) {
|
||||
type = 'camera,camera_second,projector';
|
||||
}
|
||||
else if (data === this.cfg.arduino.cmd.cameras_projectors_identifier) {
|
||||
else if (data === cfg.arduino.cmd.cameras_projectors_identifier) {
|
||||
type = 'camera,camera_second,projector,projector_second';
|
||||
}
|
||||
else if (data === this.cfg.arduino.cmd.capper_identifier) {
|
||||
type = 'capper';
|
||||
}
|
||||
else if (data === this.cfg.arduino.cmd.camera_capper_identifier) {
|
||||
type = 'camera,capper';
|
||||
}
|
||||
else if (data === this.cfg.arduino.cmd.camera_capper_projector_identifier) {
|
||||
type = 'camera,capper,projector';
|
||||
}
|
||||
else if (data === this.cfg.arduino.cmd.camera_capper_projectors_identifier) {
|
||||
type = 'camera,capper,projector,projector_second';
|
||||
}
|
||||
return resolve(type);
|
||||
};
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await delay_1.delay(cfg.arduino.serialDelay);
|
||||
try {
|
||||
writeSuccess = await this.sendAsync(device, this.cfg.arduino.cmd.mcopy_identifier);
|
||||
this.log.info(writeSuccess);
|
||||
writeSuccess = await this.sendAsync(device, cfg.arduino.cmd.mcopy_identifier);
|
||||
}
|
||||
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 = 'connect';
|
||||
const device = this.alias['connect'];
|
||||
let closeSuccess;
|
||||
try {
|
||||
closeSuccess = await this.closeArduino(device);
|
||||
|
@ -510,40 +335,31 @@ class Arduino {
|
|||
}
|
||||
return closeSuccess;
|
||||
}
|
||||
/**
|
||||
* 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] = {
|
||||
;
|
||||
async fakeConnect(serial) {
|
||||
const device = '/dev/fake';
|
||||
this.alias[serial] = device;
|
||||
this.serial[device] = {
|
||||
write: async function (cmd, cb) {
|
||||
const t = {
|
||||
c: this.cfg.arduino.cam.time + this.cfg.arduino.cam.delay,
|
||||
p: this.cfg.arduino.proj.time + this.cfg.arduino.proj.delay,
|
||||
A: 180,
|
||||
B: 180
|
||||
c: cfg.arduino.cam.time + cfg.arduino.cam.delay,
|
||||
p: cfg.arduino.proj.time + cfg.arduino.proj.delay
|
||||
};
|
||||
let timeout = t[cmd];
|
||||
if (typeof timeout === 'undefined')
|
||||
timeout = 10;
|
||||
this.timer = +new Date();
|
||||
await (0, delay_1.delay)(timeout);
|
||||
this.end(serial, cmd);
|
||||
arduino.timer = +new Date();
|
||||
await delay_1.delay(timeout);
|
||||
arduino.end(serial, cmd);
|
||||
return cb();
|
||||
}.bind(this),
|
||||
},
|
||||
string: async function (str) {
|
||||
//do nothing
|
||||
return true;
|
||||
},
|
||||
fake: true
|
||||
};
|
||||
//this.log.info('Connected to fake arduino! Not real! Does not exist!')
|
||||
//console.log('Connected to fake arduino! Not real! Does not exist!');
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
|
@ -555,7 +371,7 @@ class Arduino {
|
|||
**/
|
||||
async openArduino(device) {
|
||||
return new Promise((resolve, reject) => {
|
||||
return this.serial[this.alias[device]].open((err) => {
|
||||
return this.serial[device].open((err) => {
|
||||
if (err) {
|
||||
return reject(err);
|
||||
}
|
||||
|
@ -572,7 +388,7 @@ class Arduino {
|
|||
**/
|
||||
async closeArduino(device) {
|
||||
return new Promise((resolve, reject) => {
|
||||
return this.serial[this.alias[device]].close((err) => {
|
||||
return this.serial[device].close((err) => {
|
||||
if (err) {
|
||||
return reject(err);
|
||||
}
|
||||
|
@ -580,18 +396,13 @@ 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;
|
||||
}
|
||||
}
|
||||
exports.Arduino = Arduino;
|
||||
module.exports = { Arduino };
|
||||
if (typeof module !== 'undefined' && module.parent) {
|
||||
module.exports = function (c, ee, errorState) {
|
||||
eventEmitter = ee;
|
||||
cfg = c;
|
||||
arduino = new Arduino(errorState);
|
||||
return arduino;
|
||||
};
|
||||
}
|
||||
//# sourceMappingURL=index.js.map
|
File diff suppressed because one or more lines are too long
|
@ -1,76 +1,49 @@
|
|||
<a name="module_lib/cam"></a>
|
||||
<a name="Camera"></a>
|
||||
|
||||
## lib/cam
|
||||
## Camera
|
||||
class representing camera functions
|
||||
|
||||
* [lib/cam](#module_lib/cam)
|
||||
* [~Camera](#module_lib/cam..Camera)
|
||||
* [.init()](#module_lib/cam..Camera+init)
|
||||
* [.listen()](#module_lib/cam..Camera+listen)
|
||||
* [.set()](#module_lib/cam..Camera+set)
|
||||
* [.cap()](#module_lib/cam..Camera+cap)
|
||||
* [.move()](#module_lib/cam..Camera+move)
|
||||
* [.exposure()](#module_lib/cam..Camera+exposure)
|
||||
* [.connectIntval()](#module_lib/cam..Camera+connectIntval)
|
||||
* [.connectProcessing()](#module_lib/cam..Camera+connectProcessing)
|
||||
* [.listener()](#module_lib/cam..Camera+listener)
|
||||
* [.end()](#module_lib/cam..Camera+end)
|
||||
**Kind**: global class
|
||||
|
||||
<a name="module_lib/cam..Camera"></a>
|
||||
* [Camera](#Camera)
|
||||
* [.init()](#Camera+init)
|
||||
* [.listen()](#Camera+listen)
|
||||
* [.set()](#Camera+set)
|
||||
* [.move()](#Camera+move)
|
||||
* [.exposure()](#Camera+exposure)
|
||||
* [.connectIntval()](#Camera+connectIntval)
|
||||
* [.listener()](#Camera+listener)
|
||||
* [.end()](#Camera+end)
|
||||
|
||||
### lib/cam~Camera
|
||||
Class representing camera functions.
|
||||
<a name="Camera+init"></a>
|
||||
|
||||
**Kind**: inner class of [<code>lib/cam</code>](#module_lib/cam)
|
||||
### camera.init()
|
||||
**Kind**: instance method of [<code>Camera</code>](#Camera)
|
||||
<a name="Camera+listen"></a>
|
||||
|
||||
* [~Camera](#module_lib/cam..Camera)
|
||||
* [.init()](#module_lib/cam..Camera+init)
|
||||
* [.listen()](#module_lib/cam..Camera+listen)
|
||||
* [.set()](#module_lib/cam..Camera+set)
|
||||
* [.cap()](#module_lib/cam..Camera+cap)
|
||||
* [.move()](#module_lib/cam..Camera+move)
|
||||
* [.exposure()](#module_lib/cam..Camera+exposure)
|
||||
* [.connectIntval()](#module_lib/cam..Camera+connectIntval)
|
||||
* [.connectProcessing()](#module_lib/cam..Camera+connectProcessing)
|
||||
* [.listener()](#module_lib/cam..Camera+listener)
|
||||
* [.end()](#module_lib/cam..Camera+end)
|
||||
### camera.listen()
|
||||
**Kind**: instance method of [<code>Camera</code>](#Camera)
|
||||
<a name="Camera+set"></a>
|
||||
|
||||
<a name="module_lib/cam..Camera+init"></a>
|
||||
### camera.set()
|
||||
**Kind**: instance method of [<code>Camera</code>](#Camera)
|
||||
<a name="Camera+move"></a>
|
||||
|
||||
#### camera.init()
|
||||
**Kind**: instance method of [<code>Camera</code>](#module_lib/cam..Camera)
|
||||
<a name="module_lib/cam..Camera+listen"></a>
|
||||
### camera.move()
|
||||
**Kind**: instance method of [<code>Camera</code>](#Camera)
|
||||
<a name="Camera+exposure"></a>
|
||||
|
||||
#### camera.listen()
|
||||
**Kind**: instance method of [<code>Camera</code>](#module_lib/cam..Camera)
|
||||
<a name="module_lib/cam..Camera+set"></a>
|
||||
### camera.exposure()
|
||||
**Kind**: instance method of [<code>Camera</code>](#Camera)
|
||||
<a name="Camera+connectIntval"></a>
|
||||
|
||||
#### camera.set()
|
||||
**Kind**: instance method of [<code>Camera</code>](#module_lib/cam..Camera)
|
||||
<a name="module_lib/cam..Camera+cap"></a>
|
||||
### camera.connectIntval()
|
||||
**Kind**: instance method of [<code>Camera</code>](#Camera)
|
||||
<a name="Camera+listener"></a>
|
||||
|
||||
#### camera.cap()
|
||||
**Kind**: instance method of [<code>Camera</code>](#module_lib/cam..Camera)
|
||||
<a name="module_lib/cam..Camera+move"></a>
|
||||
### camera.listener()
|
||||
**Kind**: instance method of [<code>Camera</code>](#Camera)
|
||||
<a name="Camera+end"></a>
|
||||
|
||||
#### camera.move()
|
||||
**Kind**: instance method of [<code>Camera</code>](#module_lib/cam..Camera)
|
||||
<a name="module_lib/cam..Camera+exposure"></a>
|
||||
|
||||
#### camera.exposure()
|
||||
**Kind**: instance method of [<code>Camera</code>](#module_lib/cam..Camera)
|
||||
<a name="module_lib/cam..Camera+connectIntval"></a>
|
||||
|
||||
#### camera.connectIntval()
|
||||
**Kind**: instance method of [<code>Camera</code>](#module_lib/cam..Camera)
|
||||
<a name="module_lib/cam..Camera+connectProcessing"></a>
|
||||
|
||||
#### camera.connectProcessing()
|
||||
**Kind**: instance method of [<code>Camera</code>](#module_lib/cam..Camera)
|
||||
<a name="module_lib/cam..Camera+listener"></a>
|
||||
|
||||
#### camera.listener()
|
||||
**Kind**: instance method of [<code>Camera</code>](#module_lib/cam..Camera)
|
||||
<a name="module_lib/cam..Camera+end"></a>
|
||||
|
||||
#### camera.end()
|
||||
**Kind**: instance method of [<code>Camera</code>](#module_lib/cam..Camera)
|
||||
### camera.end()
|
||||
**Kind**: instance method of [<code>Camera</code>](#Camera)
|
||||
|
|
|
@ -1,71 +0,0 @@
|
|||
import type { Arduino } from 'arduino';
|
||||
import type { FilmOut } from 'filmout';
|
||||
import type { Config } from 'cfg';
|
||||
import type { WebContents } from 'electron';
|
||||
interface CameraState {
|
||||
pos: number;
|
||||
dir: boolean;
|
||||
capper: boolean;
|
||||
}
|
||||
/** @module lib/cam */
|
||||
/**
|
||||
* Class representing camera functions.
|
||||
*/
|
||||
export declare class Camera {
|
||||
state: CameraState;
|
||||
arduino: Arduino;
|
||||
private intval;
|
||||
private processing;
|
||||
private log;
|
||||
private cfg;
|
||||
private filmout;
|
||||
private ui;
|
||||
private ipc;
|
||||
private id;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
constructor(arduino: Arduino, cfg: Config, ui: WebContents, filmout: FilmOut, second?: boolean);
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private init;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private listen;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
set(dir: boolean, id: string): Promise<number>;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
cap(state: boolean, id: string): Promise<number>;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
move(id: string): Promise<number>;
|
||||
both(id: string): Promise<number>;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
exposure(exposure: number, id: string): Promise<number>;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private connectIntval;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private connectProcessing;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private listener;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private end;
|
||||
}
|
||||
export {};
|
|
@ -1,15 +1,7 @@
|
|||
'use strict';
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Camera = void 0;
|
||||
const electron_1 = require("electron");
|
||||
const intval_1 = require("intval");
|
||||
const processing_1 = require("processing");
|
||||
const delay_1 = require("delay");
|
||||
const log_1 = require("log");
|
||||
/** @module lib/cam */
|
||||
/**
|
||||
* Class representing camera functions.
|
||||
*/
|
||||
/** class representing camera functions **/
|
||||
class Camera {
|
||||
/**
|
||||
*
|
||||
|
@ -17,13 +9,10 @@ class Camera {
|
|||
constructor(arduino, cfg, ui, filmout, second = false) {
|
||||
this.state = {
|
||||
pos: 0,
|
||||
dir: true,
|
||||
capper: false
|
||||
dir: true
|
||||
};
|
||||
this.arduino = null;
|
||||
this.intval = null;
|
||||
this.processing = null;
|
||||
this.ipc = electron_1.ipcMain;
|
||||
this.id = 'camera';
|
||||
this.arduino = arduino;
|
||||
this.cfg = cfg;
|
||||
|
@ -37,7 +26,9 @@ class Camera {
|
|||
*
|
||||
**/
|
||||
async init() {
|
||||
this.log = await (0, log_1.Log)({ label: this.id });
|
||||
const Log = require('log');
|
||||
this.log = await Log({ label: this.id });
|
||||
this.ipc = require('electron').ipcMain;
|
||||
this.listen();
|
||||
}
|
||||
/**
|
||||
|
@ -46,7 +37,6 @@ 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));
|
||||
}
|
||||
/**
|
||||
*
|
||||
|
@ -61,15 +51,7 @@ class Camera {
|
|||
cmd = this.cfg.arduino.cmd[`${this.id}_backward`];
|
||||
}
|
||||
this.state.dir = dir;
|
||||
if (this.processing) {
|
||||
try {
|
||||
ms = await this.processing.setDir(dir);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err);
|
||||
}
|
||||
}
|
||||
else if (this.intval) {
|
||||
if (this.intval) {
|
||||
try {
|
||||
ms = await this.intval.setDir(dir);
|
||||
}
|
||||
|
@ -90,47 +72,18 @@ class Camera {
|
|||
/**
|
||||
*
|
||||
**/
|
||||
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);
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
async move(id) {
|
||||
async move(frame, id) {
|
||||
const cmd = this.cfg.arduino.cmd[this.id];
|
||||
let ms;
|
||||
if (this.filmout.state.enabled) {
|
||||
await this.filmout.start();
|
||||
}
|
||||
if (this.processing) {
|
||||
try {
|
||||
ms = await this.processing.move();
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err);
|
||||
}
|
||||
}
|
||||
else if (this.intval) {
|
||||
if (this.intval) {
|
||||
try {
|
||||
ms = await this.intval.move();
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(`Error moving intval ${this.id}: ${id}`, err);
|
||||
this.log.error(err);
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
@ -148,14 +101,14 @@ class Camera {
|
|||
//this.log.info('Camera move time', { ms });
|
||||
return this.end(cmd, id, ms);
|
||||
}
|
||||
async both(id) {
|
||||
async both(frame, id) {
|
||||
const cmd = this.cfg.arduino.cmd[id];
|
||||
let ms;
|
||||
try {
|
||||
ms = await this.arduino.send(this.id, cmd);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(`Error moving both ${this.id}: ${id}`, err);
|
||||
this.log.error(`Error moving ${this.id}`, err);
|
||||
}
|
||||
//this.log.info('Cameras move time', { ms });
|
||||
return await this.end(cmd, id, ms);
|
||||
|
@ -163,55 +116,11 @@ class Camera {
|
|||
/**
|
||||
*
|
||||
**/
|
||||
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(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;
|
||||
exposure(exposure, id) {
|
||||
let cmd = 'E';
|
||||
this.intval.setExposure(this.id, exposure, (ms) => {
|
||||
this.end(cmd, id, ms);
|
||||
});
|
||||
}
|
||||
/**
|
||||
*
|
||||
|
@ -220,7 +129,6 @@ 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 });
|
||||
|
@ -240,17 +148,6 @@ 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);
|
||||
});
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
|
@ -263,9 +160,9 @@ class Camera {
|
|||
this.log.error(err);
|
||||
}
|
||||
}
|
||||
else if (typeof arg.move !== 'undefined') {
|
||||
else if (typeof arg.frame !== 'undefined') {
|
||||
try {
|
||||
await this.move(arg.id);
|
||||
await this.move(arg.frame, arg.id);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err);
|
||||
|
@ -274,22 +171,6 @@ 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;
|
||||
}
|
||||
/**
|
||||
|
@ -332,15 +213,12 @@ 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);
|
||||
await this.ui.send(this.id, { cmd: cmd, id: id, ms: ms });
|
||||
return ms;
|
||||
this.ui.send(this.id, { cmd: cmd, id: id, ms: ms });
|
||||
}
|
||||
}
|
||||
exports.Camera = Camera;
|
||||
module.exports = { Camera };
|
||||
module.exports = function (arduino, cfg, ui, filmout, second) {
|
||||
return new Camera(arduino, cfg, ui, filmout, second);
|
||||
};
|
||||
//# sourceMappingURL=index.js.map
|
File diff suppressed because one or more lines are too long
|
@ -1,46 +0,0 @@
|
|||
<a name="module_lib/capper"></a>
|
||||
|
||||
## lib/capper
|
||||
|
||||
* [lib/capper](#module_lib/capper)
|
||||
* [~Capper](#module_lib/capper..Capper)
|
||||
* [.init()](#module_lib/capper..Capper+init)
|
||||
* [.listen()](#module_lib/capper..Capper+listen)
|
||||
* [.capper()](#module_lib/capper..Capper+capper)
|
||||
* [.listener()](#module_lib/capper..Capper+listener)
|
||||
* [.end()](#module_lib/capper..Capper+end)
|
||||
|
||||
<a name="module_lib/capper..Capper"></a>
|
||||
|
||||
### lib/capper~Capper
|
||||
Class representing capper functions.
|
||||
|
||||
**Kind**: inner class of [<code>lib/capper</code>](#module_lib/capper)
|
||||
|
||||
* [~Capper](#module_lib/capper..Capper)
|
||||
* [.init()](#module_lib/capper..Capper+init)
|
||||
* [.listen()](#module_lib/capper..Capper+listen)
|
||||
* [.capper()](#module_lib/capper..Capper+capper)
|
||||
* [.listener()](#module_lib/capper..Capper+listener)
|
||||
* [.end()](#module_lib/capper..Capper+end)
|
||||
|
||||
<a name="module_lib/capper..Capper+init"></a>
|
||||
|
||||
#### capper.init()
|
||||
**Kind**: instance method of [<code>Capper</code>](#module_lib/capper..Capper)
|
||||
<a name="module_lib/capper..Capper+listen"></a>
|
||||
|
||||
#### capper.listen()
|
||||
**Kind**: instance method of [<code>Capper</code>](#module_lib/capper..Capper)
|
||||
<a name="module_lib/capper..Capper+capper"></a>
|
||||
|
||||
#### capper.capper()
|
||||
**Kind**: instance method of [<code>Capper</code>](#module_lib/capper..Capper)
|
||||
<a name="module_lib/capper..Capper+listener"></a>
|
||||
|
||||
#### capper.listener()
|
||||
**Kind**: instance method of [<code>Capper</code>](#module_lib/capper..Capper)
|
||||
<a name="module_lib/capper..Capper+end"></a>
|
||||
|
||||
#### capper.end()
|
||||
**Kind**: instance method of [<code>Capper</code>](#module_lib/capper..Capper)
|
|
@ -1,45 +0,0 @@
|
|||
import type { FilmOut } from 'filmout';
|
||||
import type { Arduino } from 'arduino';
|
||||
import type { WebContents } from 'electron';
|
||||
interface CapperState {
|
||||
capper: boolean;
|
||||
}
|
||||
/** @module lib/capper */
|
||||
/**
|
||||
* Class representing capper functions.
|
||||
*/
|
||||
export declare class Capper {
|
||||
private state;
|
||||
private arduino;
|
||||
private log;
|
||||
private cfg;
|
||||
private filmout;
|
||||
private ui;
|
||||
private ipc;
|
||||
private id;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
constructor(arduino: Arduino, cfg: any, ui: WebContents, filmout: FilmOut);
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private init;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private listen;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
capper(state: boolean, id: string): Promise<number>;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private listener;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private end;
|
||||
}
|
||||
export type { CapperState };
|
|
@ -1,94 +0,0 @@
|
|||
'use strict';
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Capper = void 0;
|
||||
const electron_1 = require("electron");
|
||||
const log_1 = require("log");
|
||||
/** @module lib/capper */
|
||||
/**
|
||||
* Class representing capper functions.
|
||||
*/
|
||||
class Capper {
|
||||
/**
|
||||
*
|
||||
**/
|
||||
constructor(arduino, cfg, ui, filmout) {
|
||||
this.state = {
|
||||
capper: false
|
||||
};
|
||||
this.arduino = null;
|
||||
this.ipc = electron_1.ipcMain;
|
||||
this.id = 'capper';
|
||||
this.arduino = arduino;
|
||||
this.cfg = cfg;
|
||||
this.ui = ui;
|
||||
this.filmout = filmout;
|
||||
this.init();
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
async init() {
|
||||
this.log = await (0, log_1.Log)({ label: this.id });
|
||||
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);
|
||||
await this.ui.send(this.id, { cmd: cmd, id: id, ms: ms });
|
||||
return ms;
|
||||
}
|
||||
}
|
||||
exports.Capper = Capper;
|
||||
module.exports = { Capper };
|
||||
//# sourceMappingURL=index.js.map
|
|
@ -1 +0,0 @@
|
|||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/capper/index.ts"],"names":[],"mappings":"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"}
|
|
@ -1,30 +0,0 @@
|
|||
interface ConfigCommands {
|
||||
[key: string]: string;
|
||||
}
|
||||
interface ConfigDeviceProfile {
|
||||
time: number;
|
||||
delay: number;
|
||||
momentary: number;
|
||||
}
|
||||
interface ConfigBlackProfile {
|
||||
before: number;
|
||||
after: number;
|
||||
}
|
||||
interface ConfigProfile {
|
||||
label: string;
|
||||
cam: ConfigDeviceProfile;
|
||||
proj?: ConfigDeviceProfile;
|
||||
black?: ConfigBlackProfile;
|
||||
light: boolean;
|
||||
}
|
||||
interface ConfigProfiles {
|
||||
[key: string]: ConfigProfile;
|
||||
}
|
||||
interface Config {
|
||||
version: string;
|
||||
ext_port: number;
|
||||
profiles: ConfigProfiles;
|
||||
cmd: ConfigCommands;
|
||||
arduino: any;
|
||||
}
|
||||
export type { Config };
|
|
@ -1,3 +0,0 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
//# sourceMappingURL=index.js.map
|
|
@ -1 +0,0 @@
|
|||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cfg/index.ts"],"names":[],"mappings":""}
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1,267 +0,0 @@
|
|||
<a name="module_lib/cmd"></a>
|
||||
|
||||
## lib/cmd
|
||||
|
||||
* [lib/cmd](#module_lib/cmd)
|
||||
* [~Assign all connected devices and mock devices as private classes.](#module_lib/cmd..Assign all connected devices and mock devices as private classes.)
|
||||
* [new Assign all connected devices and mock devices as private classes.(cfg, proj, cam, light, alert, cam2, proj2, capper)](#new_module_lib/cmd..Assign all connected devices and mock devices as private classes._new)
|
||||
* [~Commands](#module_lib/cmd..Commands)
|
||||
* [.projector_forward()](#module_lib/cmd..Commands+projector_forward) ⇒ <code>integer</code>
|
||||
* [.projector_backward()](#module_lib/cmd..Commands+projector_backward) ⇒ <code>integer</code>
|
||||
* [.camera_forward(cmd)](#module_lib/cmd..Commands+camera_forward) ⇒ <code>integer</code>
|
||||
* [.black_forward()](#module_lib/cmd..Commands+black_forward) ⇒ <code>integer</code>
|
||||
* [.camera_backward(cmd)](#module_lib/cmd..Commands+camera_backward) ⇒ <code>integer</code>
|
||||
* [.black_backward()](#module_lib/cmd..Commands+black_backward) ⇒ <code>integer</code>
|
||||
* [.camera_second_forward(cmd)](#module_lib/cmd..Commands+camera_second_forward) ⇒ <code>integer</code>
|
||||
* [.camera_second_backward(cmd)](#module_lib/cmd..Commands+camera_second_backward) ⇒ <code>integer</code>
|
||||
* [.cameras_forward(cmd)](#module_lib/cmd..Commands+cameras_forward) ⇒ <code>integer</code>
|
||||
* [.cameras_backward(cmd)](#module_lib/cmd..Commands+cameras_backward) ⇒ <code>integer</code>
|
||||
* [.camera_forward_camera_second_backward(cmd)](#module_lib/cmd..Commands+camera_forward_camera_second_backward) ⇒ <code>integer</code>
|
||||
* [.camera_backward_camera_second_forward(cmd)](#module_lib/cmd..Commands+camera_backward_camera_second_forward) ⇒ <code>integer</code>
|
||||
* [.projector_second_forward()](#module_lib/cmd..Commands+projector_second_forward) ⇒ <code>integer</code>
|
||||
* [.projector_second_backward()](#module_lib/cmd..Commands+projector_second_backward) ⇒ <code>integer</code>
|
||||
* [.projectors_forward()](#module_lib/cmd..Commands+projectors_forward) ⇒ <code>integer</code>
|
||||
* [.projectors_backward()](#module_lib/cmd..Commands+projectors_backward) ⇒ <code>integer</code>
|
||||
* [.projector_forward_projector_second_backward()](#module_lib/cmd..Commands+projector_forward_projector_second_backward) ⇒ <code>integer</code>
|
||||
* [.projector_backward_projector_second_forward()](#module_lib/cmd..Commands+projector_backward_projector_second_forward) ⇒ <code>integer</code>
|
||||
* [.alert()](#module_lib/cmd..Commands+alert) ⇒ <code>integer</code>
|
||||
* [.pause()](#module_lib/cmd..Commands+pause) ⇒ <code>integer</code>
|
||||
* [.camera_exposure()](#module_lib/cmd..Commands+camera_exposure)
|
||||
|
||||
<a name="module_lib/cmd..Assign all connected devices and mock devices as private classes."></a>
|
||||
|
||||
### lib/cmd~Assign all connected devices and mock devices as private classes.
|
||||
**Kind**: inner class of [<code>lib/cmd</code>](#module_lib/cmd)
|
||||
<a name="new_module_lib/cmd..Assign all connected devices and mock devices as private classes._new"></a>
|
||||
|
||||
#### new Assign all connected devices and mock devices as private classes.(cfg, proj, cam, light, alert, cam2, proj2, capper)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| cfg | <code>object</code> | Configuration object |
|
||||
| proj | <code>object</code> | Projector 1 |
|
||||
| cam | <code>object</code> | Camera 1 |
|
||||
| light | <code>object</code> | Light source |
|
||||
| alert | <code>object</code> | Alert object |
|
||||
| cam2 | <code>object</code> | (optional) Camera 2 |
|
||||
| proj2 | <code>object</code> | (optional) Projector 2 |
|
||||
| capper | <code>object</code> | Capper object |
|
||||
|
||||
<a name="module_lib/cmd..Commands"></a>
|
||||
|
||||
### lib/cmd~Commands
|
||||
Class representing all commands bundled into methods.
|
||||
|
||||
**Kind**: inner class of [<code>lib/cmd</code>](#module_lib/cmd)
|
||||
|
||||
* [~Commands](#module_lib/cmd..Commands)
|
||||
* [.projector_forward()](#module_lib/cmd..Commands+projector_forward) ⇒ <code>integer</code>
|
||||
* [.projector_backward()](#module_lib/cmd..Commands+projector_backward) ⇒ <code>integer</code>
|
||||
* [.camera_forward(cmd)](#module_lib/cmd..Commands+camera_forward) ⇒ <code>integer</code>
|
||||
* [.black_forward()](#module_lib/cmd..Commands+black_forward) ⇒ <code>integer</code>
|
||||
* [.camera_backward(cmd)](#module_lib/cmd..Commands+camera_backward) ⇒ <code>integer</code>
|
||||
* [.black_backward()](#module_lib/cmd..Commands+black_backward) ⇒ <code>integer</code>
|
||||
* [.camera_second_forward(cmd)](#module_lib/cmd..Commands+camera_second_forward) ⇒ <code>integer</code>
|
||||
* [.camera_second_backward(cmd)](#module_lib/cmd..Commands+camera_second_backward) ⇒ <code>integer</code>
|
||||
* [.cameras_forward(cmd)](#module_lib/cmd..Commands+cameras_forward) ⇒ <code>integer</code>
|
||||
* [.cameras_backward(cmd)](#module_lib/cmd..Commands+cameras_backward) ⇒ <code>integer</code>
|
||||
* [.camera_forward_camera_second_backward(cmd)](#module_lib/cmd..Commands+camera_forward_camera_second_backward) ⇒ <code>integer</code>
|
||||
* [.camera_backward_camera_second_forward(cmd)](#module_lib/cmd..Commands+camera_backward_camera_second_forward) ⇒ <code>integer</code>
|
||||
* [.projector_second_forward()](#module_lib/cmd..Commands+projector_second_forward) ⇒ <code>integer</code>
|
||||
* [.projector_second_backward()](#module_lib/cmd..Commands+projector_second_backward) ⇒ <code>integer</code>
|
||||
* [.projectors_forward()](#module_lib/cmd..Commands+projectors_forward) ⇒ <code>integer</code>
|
||||
* [.projectors_backward()](#module_lib/cmd..Commands+projectors_backward) ⇒ <code>integer</code>
|
||||
* [.projector_forward_projector_second_backward()](#module_lib/cmd..Commands+projector_forward_projector_second_backward) ⇒ <code>integer</code>
|
||||
* [.projector_backward_projector_second_forward()](#module_lib/cmd..Commands+projector_backward_projector_second_forward) ⇒ <code>integer</code>
|
||||
* [.alert()](#module_lib/cmd..Commands+alert) ⇒ <code>integer</code>
|
||||
* [.pause()](#module_lib/cmd..Commands+pause) ⇒ <code>integer</code>
|
||||
* [.camera_exposure()](#module_lib/cmd..Commands+camera_exposure)
|
||||
|
||||
<a name="module_lib/cmd..Commands+projector_forward"></a>
|
||||
|
||||
#### commands.projector\_forward() ⇒ <code>integer</code>
|
||||
Move the projector one frame forward
|
||||
|
||||
**Kind**: instance method of [<code>Commands</code>](#module_lib/cmd..Commands)
|
||||
**Returns**: <code>integer</code> - Length of action in ms
|
||||
<a name="module_lib/cmd..Commands+projector_backward"></a>
|
||||
|
||||
#### commands.projector\_backward() ⇒ <code>integer</code>
|
||||
Move the projector one frame backward
|
||||
|
||||
**Kind**: instance method of [<code>Commands</code>](#module_lib/cmd..Commands)
|
||||
**Returns**: <code>integer</code> - Length of action in ms
|
||||
<a name="module_lib/cmd..Commands+camera_forward"></a>
|
||||
|
||||
#### commands.camera\_forward(cmd) ⇒ <code>integer</code>
|
||||
Move the camera one frame forward
|
||||
|
||||
**Kind**: instance method of [<code>Commands</code>](#module_lib/cmd..Commands)
|
||||
**Returns**: <code>integer</code> - Length of action in ms
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| cmd | <code>object</code> | Full cmd object |
|
||||
|
||||
<a name="module_lib/cmd..Commands+black_forward"></a>
|
||||
|
||||
#### commands.black\_forward() ⇒ <code>integer</code>
|
||||
Move the camera one frame forward with light off
|
||||
|
||||
**Kind**: instance method of [<code>Commands</code>](#module_lib/cmd..Commands)
|
||||
**Returns**: <code>integer</code> - Length of action in ms
|
||||
<a name="module_lib/cmd..Commands+camera_backward"></a>
|
||||
|
||||
#### commands.camera\_backward(cmd) ⇒ <code>integer</code>
|
||||
Move the camera one frame backward
|
||||
|
||||
**Kind**: instance method of [<code>Commands</code>](#module_lib/cmd..Commands)
|
||||
**Returns**: <code>integer</code> - Length of action in ms
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| cmd | <code>object</code> | Full cmd object |
|
||||
|
||||
<a name="module_lib/cmd..Commands+black_backward"></a>
|
||||
|
||||
#### commands.black\_backward() ⇒ <code>integer</code>
|
||||
Move the camera one frame forward, light set to black or off
|
||||
|
||||
**Kind**: instance method of [<code>Commands</code>](#module_lib/cmd..Commands)
|
||||
**Returns**: <code>integer</code> - Length of action in ms
|
||||
<a name="module_lib/cmd..Commands+camera_second_forward"></a>
|
||||
|
||||
#### commands.camera\_second\_forward(cmd) ⇒ <code>integer</code>
|
||||
Move the second camera one frame forward
|
||||
|
||||
**Kind**: instance method of [<code>Commands</code>](#module_lib/cmd..Commands)
|
||||
**Returns**: <code>integer</code> - Length of action in ms
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| cmd | <code>object</code> | Full cmd object |
|
||||
|
||||
<a name="module_lib/cmd..Commands+camera_second_backward"></a>
|
||||
|
||||
#### commands.camera\_second\_backward(cmd) ⇒ <code>integer</code>
|
||||
Move the second camera one frame backward
|
||||
|
||||
**Kind**: instance method of [<code>Commands</code>](#module_lib/cmd..Commands)
|
||||
**Returns**: <code>integer</code> - Length of action in ms
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| cmd | <code>object</code> | Full cmd object |
|
||||
|
||||
<a name="module_lib/cmd..Commands+cameras_forward"></a>
|
||||
|
||||
#### commands.cameras\_forward(cmd) ⇒ <code>integer</code>
|
||||
Move the both cameras one frame forward
|
||||
|
||||
**Kind**: instance method of [<code>Commands</code>](#module_lib/cmd..Commands)
|
||||
**Returns**: <code>integer</code> - Length of action in ms
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| cmd | <code>object</code> | Full cmd object |
|
||||
|
||||
<a name="module_lib/cmd..Commands+cameras_backward"></a>
|
||||
|
||||
#### commands.cameras\_backward(cmd) ⇒ <code>integer</code>
|
||||
Move the both cameras one frame backward
|
||||
|
||||
**Kind**: instance method of [<code>Commands</code>](#module_lib/cmd..Commands)
|
||||
**Returns**: <code>integer</code> - Length of action in ms
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| cmd | <code>object</code> | Full cmd object |
|
||||
|
||||
<a name="module_lib/cmd..Commands+camera_forward_camera_second_backward"></a>
|
||||
|
||||
#### commands.camera\_forward\_camera\_second\_backward(cmd) ⇒ <code>integer</code>
|
||||
Move first camera one frame forward and rewind secondary camera one frame backward
|
||||
|
||||
**Kind**: instance method of [<code>Commands</code>](#module_lib/cmd..Commands)
|
||||
**Returns**: <code>integer</code> - Length of action in ms
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| cmd | <code>object</code> | Full cmd object |
|
||||
|
||||
<a name="module_lib/cmd..Commands+camera_backward_camera_second_forward"></a>
|
||||
|
||||
#### commands.camera\_backward\_camera\_second\_forward(cmd) ⇒ <code>integer</code>
|
||||
Rewind first camera one frame backward and move secondary camera one frame forward
|
||||
|
||||
**Kind**: instance method of [<code>Commands</code>](#module_lib/cmd..Commands)
|
||||
**Returns**: <code>integer</code> - Length of action in ms
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| cmd | <code>object</code> | Full cmd object |
|
||||
|
||||
<a name="module_lib/cmd..Commands+projector_second_forward"></a>
|
||||
|
||||
#### commands.projector\_second\_forward() ⇒ <code>integer</code>
|
||||
Move the secondary projector forward one frame
|
||||
|
||||
**Kind**: instance method of [<code>Commands</code>](#module_lib/cmd..Commands)
|
||||
**Returns**: <code>integer</code> - Length of action in ms
|
||||
<a name="module_lib/cmd..Commands+projector_second_backward"></a>
|
||||
|
||||
#### commands.projector\_second\_backward() ⇒ <code>integer</code>
|
||||
Rewind the secondary projector backward one frame
|
||||
|
||||
**Kind**: instance method of [<code>Commands</code>](#module_lib/cmd..Commands)
|
||||
**Returns**: <code>integer</code> - Length of action in ms
|
||||
<a name="module_lib/cmd..Commands+projectors_forward"></a>
|
||||
|
||||
#### commands.projectors\_forward() ⇒ <code>integer</code>
|
||||
Move the both projectors forward one frame
|
||||
|
||||
**Kind**: instance method of [<code>Commands</code>](#module_lib/cmd..Commands)
|
||||
**Returns**: <code>integer</code> - Length of action in ms
|
||||
<a name="module_lib/cmd..Commands+projectors_backward"></a>
|
||||
|
||||
#### commands.projectors\_backward() ⇒ <code>integer</code>
|
||||
Rewind both projectors backwards one frame
|
||||
|
||||
**Kind**: instance method of [<code>Commands</code>](#module_lib/cmd..Commands)
|
||||
**Returns**: <code>integer</code> - Length of action in ms
|
||||
<a name="module_lib/cmd..Commands+projector_forward_projector_second_backward"></a>
|
||||
|
||||
#### commands.projector\_forward\_projector\_second\_backward() ⇒ <code>integer</code>
|
||||
Move the primary projector forward one frame and rewind the secondary projector
|
||||
one frame backwards.
|
||||
|
||||
**Kind**: instance method of [<code>Commands</code>](#module_lib/cmd..Commands)
|
||||
**Returns**: <code>integer</code> - Length of action in ms
|
||||
<a name="module_lib/cmd..Commands+projector_backward_projector_second_forward"></a>
|
||||
|
||||
#### commands.projector\_backward\_projector\_second\_forward() ⇒ <code>integer</code>
|
||||
Rewind the primary projector backwards one frame and move the secondary
|
||||
projector forward one frame.
|
||||
|
||||
**Kind**: instance method of [<code>Commands</code>](#module_lib/cmd..Commands)
|
||||
**Returns**: <code>integer</code> - Length of action in ms
|
||||
<a name="module_lib/cmd..Commands+alert"></a>
|
||||
|
||||
#### commands.alert() ⇒ <code>integer</code>
|
||||
Throws an alert to pause a sequence
|
||||
|
||||
**Kind**: instance method of [<code>Commands</code>](#module_lib/cmd..Commands)
|
||||
**Returns**: <code>integer</code> - Length of action in ms
|
||||
<a name="module_lib/cmd..Commands+pause"></a>
|
||||
|
||||
#### commands.pause() ⇒ <code>integer</code>
|
||||
Pauses a sequence for a length of time
|
||||
|
||||
**Kind**: instance method of [<code>Commands</code>](#module_lib/cmd..Commands)
|
||||
**Returns**: <code>integer</code> - Length of action in ms
|
||||
<a name="module_lib/cmd..Commands+camera_exposure"></a>
|
||||
|
||||
#### commands.camera\_exposure()
|
||||
Sets the camera exposure (if supported).
|
||||
|
||||
**Kind**: instance method of [<code>Commands</code>](#module_lib/cmd..Commands)
|
|
@ -1,179 +0,0 @@
|
|||
import type { Projector } from 'proj';
|
||||
import type { Camera } from 'cam';
|
||||
import type { Light } from 'light';
|
||||
import type { Capper } from 'capper';
|
||||
import type { Alert } from 'alert';
|
||||
import type { Config } from 'cfg';
|
||||
/** @module lib/cmd */
|
||||
/**
|
||||
* Class representing all commands bundled into methods.
|
||||
*/
|
||||
export declare class Commands {
|
||||
proj: Projector;
|
||||
cam: Camera;
|
||||
light: Light;
|
||||
cam2: Camera;
|
||||
proj2: Projector;
|
||||
capper: Capper;
|
||||
alertObj: Alert;
|
||||
private cfg;
|
||||
private ipc;
|
||||
/**
|
||||
* @constructor
|
||||
* Assign all connected devices and mock devices as private classes.
|
||||
*
|
||||
* @param {object} cfg Configuration object
|
||||
* @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} capper Capper object
|
||||
*
|
||||
**/
|
||||
constructor(cfg: Config, proj: Projector, cam: Camera, light: Light, alert: Alert, cam2?: Camera, proj2?: Projector, capper?: Capper);
|
||||
/**
|
||||
* Move the projector one frame forward
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
projector_forward(): Promise<number>;
|
||||
/**
|
||||
* Move the projector one frame backward
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
projector_backward(): Promise<number>;
|
||||
/**
|
||||
* Move the camera one frame forward
|
||||
*
|
||||
* @param {object} cmd Full cmd object
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
camera_forward(): Promise<number>;
|
||||
/**
|
||||
* Move the camera one frame forward with light off
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
black_forward(): Promise<number>;
|
||||
/**
|
||||
* Move the camera one frame backward
|
||||
*
|
||||
* @param {object} cmd Full cmd object
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
camera_backward(): Promise<number>;
|
||||
/**
|
||||
* Move the camera one frame forward, light set to black or off
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
black_backward(): Promise<number>;
|
||||
/**
|
||||
* Move the second camera one frame forward
|
||||
*
|
||||
* @param {object} cmd Full cmd object
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
camera_second_forward(): Promise<number>;
|
||||
/**
|
||||
* Move the second camera one frame backward
|
||||
*
|
||||
* @param {object} cmd Full cmd object
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
camera_second_backward(): Promise<number>;
|
||||
/**
|
||||
* Move the both cameras one frame forward
|
||||
*
|
||||
* @param {object} cmd Full cmd object
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
cameras_forward(): Promise<number>;
|
||||
/**
|
||||
* Move the both cameras one frame backward
|
||||
*
|
||||
* @param {object} cmd Full cmd object
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
cameras_backward(): Promise<number>;
|
||||
/**
|
||||
* Move first camera one frame forward and rewind secondary camera one frame backward
|
||||
*
|
||||
* @param {object} cmd Full cmd object
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
camera_forward_camera_second_backward(): Promise<number>;
|
||||
/**
|
||||
* Rewind first camera one frame backward and move secondary camera one frame forward
|
||||
*
|
||||
* @param {object} cmd Full cmd object
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
camera_backward_camera_second_forward(): Promise<number>;
|
||||
/**
|
||||
* Move the secondary projector forward one frame
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
projector_second_forward(): Promise<number>;
|
||||
/**
|
||||
* Rewind the secondary projector backward one frame
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
projector_second_backward(): Promise<number>;
|
||||
/**
|
||||
* Move the both projectors forward one frame
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
projectors_forward(): Promise<number>;
|
||||
/**
|
||||
* Rewind both projectors backwards one frame
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
projectors_backward(): Promise<number>;
|
||||
/**
|
||||
* Move the primary projector forward one frame and rewind the secondary projector
|
||||
* one frame backwards.
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
projector_forward_projector_second_backward(): Promise<number>;
|
||||
/**
|
||||
* Rewind the primary projector backwards one frame and move the secondary
|
||||
* projector forward one frame.
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
projector_backward_projector_second_forward(): Promise<number>;
|
||||
/**
|
||||
* Throws an alert to pause a sequence
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
alert(cmd: any): Promise<number>;
|
||||
/**
|
||||
* Pauses a sequence for a length of time
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
pause(cmd: any): Promise<number>;
|
||||
/**
|
||||
* Sets the camera exposure (if supported).
|
||||
*
|
||||
**/
|
||||
camera_exposure(cmd: any): Promise<number>;
|
||||
}
|
|
@ -1,13 +1,7 @@
|
|||
'use strict';
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Commands = void 0;
|
||||
const electron_1 = require("electron");
|
||||
const uuid_1 = require("uuid");
|
||||
const delay_1 = require("delay");
|
||||
/** @module lib/cmd */
|
||||
/**
|
||||
* Class representing all commands bundled into methods.
|
||||
*/
|
||||
class Commands {
|
||||
/**
|
||||
* @constructor
|
||||
|
@ -17,25 +11,19 @@ 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} capper Capper object
|
||||
*
|
||||
* @param {object} proj2 {optional} Projector 2
|
||||
**/
|
||||
constructor(cfg, proj, cam, light, alert, cam2 = null, proj2 = null, capper = null) {
|
||||
this.ipc = electron_1.ipcMain;
|
||||
constructor(cfg, proj, cam, light, cam2 = null, proj2 = null) {
|
||||
this.cfg = cfg;
|
||||
this.proj = proj;
|
||||
this.cam = cam;
|
||||
this.light = light;
|
||||
this.alertObj = alert;
|
||||
if (cam2 !== null)
|
||||
if (cam2)
|
||||
this.cam2 = cam2;
|
||||
if (proj2 !== null)
|
||||
if (proj2)
|
||||
this.proj2 = proj2;
|
||||
if (capper !== null)
|
||||
this.capper = capper;
|
||||
this.ipc = require('electron').ipcMain;
|
||||
}
|
||||
/**
|
||||
* Move the projector one frame forward
|
||||
|
@ -43,15 +31,14 @@ class Commands {
|
|||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async projector_forward() {
|
||||
const id = (0, uuid_1.v4)();
|
||||
let ms;
|
||||
try {
|
||||
if (!this.proj.state.dir) {
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.proj.set(true, id);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.proj.set(true);
|
||||
}
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
ms = await this.proj.move(id);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
ms = await this.proj.move();
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
|
@ -64,15 +51,14 @@ class Commands {
|
|||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async projector_backward() {
|
||||
const id = (0, uuid_1.v4)();
|
||||
let ms;
|
||||
try {
|
||||
if (this.proj.state.dir) {
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.proj.set(false, id);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.proj.set(false);
|
||||
}
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
ms = await this.proj.move(id);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
ms = await this.proj.move();
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
|
@ -82,25 +68,24 @@ class Commands {
|
|||
/**
|
||||
* Move the camera one frame forward
|
||||
*
|
||||
* @param {object} cmd Full cmd object
|
||||
* @param {array} rgb Color to set light for frame
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async camera_forward() {
|
||||
const id = (0, uuid_1.v4)();
|
||||
async camera_forward(rgb = [255, 255, 255]) {
|
||||
const id = uuid_1.v4();
|
||||
const off = [0, 0, 0];
|
||||
let rgb = [255, 255, 255];
|
||||
let ms;
|
||||
try {
|
||||
if (!this.cam.state.dir) {
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.cam.set(true, id);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.cam.set(true);
|
||||
}
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await 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(id);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
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, id);
|
||||
}
|
||||
catch (err) {
|
||||
|
@ -114,27 +99,20 @@ class Commands {
|
|||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async black_forward() {
|
||||
const id = (0, uuid_1.v4)();
|
||||
const id = uuid_1.v4();
|
||||
const off = [0, 0, 0];
|
||||
let ms = 0;
|
||||
let ms;
|
||||
try {
|
||||
if (!this.cam.state.dir) {
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.cam.set(true, id);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.cam.set(true);
|
||||
}
|
||||
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 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(id);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
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, id);
|
||||
if (this.capper) {
|
||||
ms += await this.capper.capper(false, id);
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
|
@ -144,25 +122,24 @@ class Commands {
|
|||
/**
|
||||
* Move the camera one frame backward
|
||||
*
|
||||
* @param {object} cmd Full cmd object
|
||||
* @param {array} rgb Color to set light for frame
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async camera_backward() {
|
||||
const id = (0, uuid_1.v4)();
|
||||
async camera_backward(rgb = [255, 255, 255]) {
|
||||
const id = uuid_1.v4();
|
||||
const off = [0, 0, 0];
|
||||
let rgb = [255, 255, 255];
|
||||
let ms;
|
||||
try {
|
||||
if (this.cam.state.dir) {
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.cam.set(false, id);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.cam.set(false);
|
||||
}
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await 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(id);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
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, id);
|
||||
}
|
||||
catch (err) {
|
||||
|
@ -176,26 +153,20 @@ class Commands {
|
|||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async black_backward() {
|
||||
const id = (0, uuid_1.v4)();
|
||||
const id = uuid_1.v4();
|
||||
const off = [0, 0, 0];
|
||||
let ms = 0;
|
||||
let ms;
|
||||
try {
|
||||
if (this.cam.state.dir) {
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.cam.set(false, id);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.cam.set(false);
|
||||
}
|
||||
if (this.capper) {
|
||||
ms += await this.capper.capper(true, id);
|
||||
}
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await 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(id);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
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, id);
|
||||
if (this.capper) {
|
||||
ms += await this.capper.capper(false, id);
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
|
@ -205,25 +176,24 @@ class Commands {
|
|||
/**
|
||||
* Move the second camera one frame forward
|
||||
*
|
||||
* @param {object} cmd Full cmd object
|
||||
* @param {array} rgb Color to set light for frame
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async camera_second_forward() {
|
||||
const id = (0, uuid_1.v4)();
|
||||
async camera_second_forward(rgb = [255, 255, 255]) {
|
||||
const id = uuid_1.v4();
|
||||
const off = [0, 0, 0];
|
||||
let rgb = [255, 255, 255];
|
||||
let ms;
|
||||
try {
|
||||
if (!this.cam2.state.dir) {
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.cam2.set(true, id);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.cam2.set(true);
|
||||
}
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await 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(id);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await 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, id);
|
||||
}
|
||||
catch (err) {
|
||||
|
@ -234,25 +204,24 @@ class Commands {
|
|||
/**
|
||||
* Move the second camera one frame backward
|
||||
*
|
||||
* @param {object} cmd Full cmd object
|
||||
* @param {array} rgb Color to set light for frame
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async camera_second_backward() {
|
||||
const id = (0, uuid_1.v4)();
|
||||
async camera_second_backward(rgb = [255, 255, 255]) {
|
||||
const id = uuid_1.v4();
|
||||
const off = [0, 0, 0];
|
||||
let rgb = [255, 255, 255];
|
||||
let ms;
|
||||
try {
|
||||
if (this.cam2.state.dir) {
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.cam2.set(false, id);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.cam2.set(false);
|
||||
}
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await 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(id);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await 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, id);
|
||||
}
|
||||
catch (err) {
|
||||
|
@ -263,36 +232,37 @@ class Commands {
|
|||
/**
|
||||
* Move the both cameras one frame forward
|
||||
*
|
||||
* @param {object} cmd Full cmd object
|
||||
* @param {array} rgb Color to set light for frame
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async cameras_forward() {
|
||||
const id = (0, uuid_1.v4)();
|
||||
async cameras_forward(rgb = [255, 255, 255]) {
|
||||
const id = uuid_1.v4();
|
||||
const off = [0, 0, 0];
|
||||
let rgb = [255, 255, 255];
|
||||
let both;
|
||||
let ms;
|
||||
try {
|
||||
if (!this.cam.state.dir) {
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.cam.set(true, id);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.cam.set(true);
|
||||
}
|
||||
if (!this.cam2.state.dir) {
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.cam2.set(true, id);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.cam2.set(true);
|
||||
}
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(rgb, id);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await 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(id);
|
||||
ms = await this.cam.both();
|
||||
}
|
||||
else {
|
||||
both = await Promise.all([this.cam.move(id), this.cam2.move(id)]);
|
||||
this.cam.move();
|
||||
this.cam2.move();
|
||||
both = [await this.cam.move, await this.cam2.move];
|
||||
ms = Math.max(...both);
|
||||
}
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(off, id);
|
||||
}
|
||||
catch (err) {
|
||||
|
@ -303,36 +273,37 @@ class Commands {
|
|||
/**
|
||||
* Move the both cameras one frame backward
|
||||
*
|
||||
* @param {object} cmd Full cmd object
|
||||
* @param {array} rgb Color to set light for frame
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async cameras_backward() {
|
||||
const id = (0, uuid_1.v4)();
|
||||
async cameras_backward(rgb = [255, 255, 255]) {
|
||||
const id = uuid_1.v4();
|
||||
const off = [0, 0, 0];
|
||||
let rgb = [255, 255, 255];
|
||||
let both;
|
||||
let ms;
|
||||
try {
|
||||
if (this.cam.state.dir) {
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.cam.set(false, id);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.cam.set(false);
|
||||
}
|
||||
if (this.cam2.state.dir) {
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.cam2.set(false, id);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.cam2.set(false);
|
||||
}
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(rgb, id);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await 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(id);
|
||||
ms = await this.cam.both();
|
||||
}
|
||||
else {
|
||||
both = await Promise.all([this.cam.move(id), this.cam2.move(id)]);
|
||||
this.cam.move();
|
||||
this.cam2.move();
|
||||
both = [await this.cam.move, await this.cam2.move];
|
||||
ms = Math.max(...both);
|
||||
}
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(off, id);
|
||||
}
|
||||
catch (err) {
|
||||
|
@ -343,36 +314,37 @@ class Commands {
|
|||
/**
|
||||
* Move first camera one frame forward and rewind secondary camera one frame backward
|
||||
*
|
||||
* @param {object} cmd Full cmd object
|
||||
* @param {array} rgb Color to set light for frames
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async camera_forward_camera_second_backward() {
|
||||
const id = (0, uuid_1.v4)();
|
||||
async camera_forward_camera_second_backward(rgb = [255, 255, 255]) {
|
||||
const id = uuid_1.v4();
|
||||
const off = [0, 0, 0];
|
||||
let rgb = [255, 255, 255];
|
||||
let both;
|
||||
let ms;
|
||||
try {
|
||||
if (!this.cam.state.dir) {
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.cam.set(true, id);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.cam.set(true);
|
||||
}
|
||||
if (this.cam2.state.dir) {
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.cam2.set(false, id);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.cam2.set(false);
|
||||
}
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(rgb, id);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await 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(id);
|
||||
ms = await this.cam.both();
|
||||
}
|
||||
else {
|
||||
both = await Promise.all([this.cam.move(id), this.cam2.move(id)]);
|
||||
this.cam.move();
|
||||
this.cam2.move();
|
||||
both = [await this.cam.move, await this.cam2.move];
|
||||
ms = Math.max(...both);
|
||||
}
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(off, id);
|
||||
}
|
||||
catch (err) {
|
||||
|
@ -383,36 +355,37 @@ class Commands {
|
|||
/**
|
||||
* Rewind first camera one frame backward and move secondary camera one frame forward
|
||||
*
|
||||
* @param {object} cmd Full cmd object
|
||||
* @param {array} rgb Color to set light for frame
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async camera_backward_camera_second_forward() {
|
||||
const id = (0, uuid_1.v4)();
|
||||
async camera_backward_camera_second_forward(rgb = [255, 255, 255]) {
|
||||
const id = uuid_1.v4();
|
||||
const off = [0, 0, 0];
|
||||
let rgb = [255, 255, 255];
|
||||
let both;
|
||||
let ms;
|
||||
try {
|
||||
if (this.cam.state.dir) {
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.cam.set(false, id);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.cam.set(false);
|
||||
}
|
||||
if (!this.cam2.state.dir) {
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.cam2.set(true, id);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.cam2.set(true);
|
||||
}
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(rgb, id);
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await 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(id);
|
||||
ms = await this.cam.both();
|
||||
}
|
||||
else {
|
||||
both = await Promise.all([this.cam.move(id), this.cam2.move(id)]);
|
||||
this.cam.move();
|
||||
this.cam.move();
|
||||
both = [await this.cam.move, await this.proj2.move];
|
||||
ms = Math.max(...both);
|
||||
}
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.light.set(off, id);
|
||||
}
|
||||
catch (err) {
|
||||
|
@ -426,15 +399,14 @@ class Commands {
|
|||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async projector_second_forward() {
|
||||
const id = (0, uuid_1.v4)();
|
||||
let ms;
|
||||
try {
|
||||
if (!this.proj2.state.dir) {
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.proj2.set(true, id);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.proj2.set(true);
|
||||
}
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
ms = await this.proj2.move(id);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
ms = await this.proj2.move();
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
|
@ -447,15 +419,14 @@ class Commands {
|
|||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async projector_second_backward() {
|
||||
const id = (0, uuid_1.v4)();
|
||||
let ms;
|
||||
try {
|
||||
if (this.proj2.state.dir) {
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.proj2.set(false, id);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.proj2.set(false);
|
||||
}
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
ms = await this.proj2.move(id);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
ms = await this.proj2.move();
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
|
@ -468,24 +439,25 @@ class Commands {
|
|||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async projectors_forward() {
|
||||
const id = (0, uuid_1.v4)();
|
||||
let both;
|
||||
let ms;
|
||||
try {
|
||||
if (!this.proj.state.dir) {
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.proj.set(true, id);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.proj.set(true);
|
||||
}
|
||||
if (!this.proj2.state.dir) {
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.proj2.set(true, id);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.proj2.set(true);
|
||||
}
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await 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(id);
|
||||
ms = await this.proj.both();
|
||||
}
|
||||
else {
|
||||
both = await Promise.all([this.proj.move(id), this.proj2.move(id)]);
|
||||
this.proj.move();
|
||||
this.proj2.move();
|
||||
both = [await this.proj.move, await this.proj2.move];
|
||||
ms = Math.max(...both);
|
||||
}
|
||||
}
|
||||
|
@ -500,24 +472,26 @@ class Commands {
|
|||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async projectors_backward() {
|
||||
const id = (0, uuid_1.v4)();
|
||||
let both;
|
||||
let ms;
|
||||
try {
|
||||
if (this.proj.state.dir) {
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.proj.set(false, id);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.proj.set(false);
|
||||
}
|
||||
if (this.proj2.state.dir) {
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.proj2.set(false, id);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.proj2.set(false);
|
||||
}
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await 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(id);
|
||||
ms = await this.proj.both();
|
||||
}
|
||||
else {
|
||||
both = await Promise.all([this.proj.move(id), this.proj2.move(id)]);
|
||||
this.proj.move();
|
||||
this.proj2.move();
|
||||
both = [await this.proj.move, await this.proj2.move];
|
||||
ms = Math.max(...both);
|
||||
}
|
||||
}
|
||||
|
@ -533,24 +507,26 @@ class Commands {
|
|||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async projector_forward_projector_second_backward() {
|
||||
const id = (0, uuid_1.v4)();
|
||||
let both;
|
||||
let ms;
|
||||
try {
|
||||
if (!this.proj.state.dir) {
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.proj.set(true, id);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.proj.set(true);
|
||||
}
|
||||
if (this.proj2.state.dir) {
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.proj2.set(false, id);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.proj2.set(false);
|
||||
}
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await 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(id);
|
||||
ms = await this.proj.both();
|
||||
}
|
||||
else {
|
||||
both = await Promise.all([this.proj.move(id), this.proj2.move(id)]);
|
||||
this.proj.move();
|
||||
this.proj2.move();
|
||||
both = [await this.proj.move, await this.proj2.move];
|
||||
ms = Math.max(...both);
|
||||
}
|
||||
}
|
||||
|
@ -566,24 +542,26 @@ class Commands {
|
|||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async projector_backward_projector_second_forward() {
|
||||
const id = (0, uuid_1.v4)();
|
||||
let both;
|
||||
let ms;
|
||||
try {
|
||||
if (this.proj.state.dir) {
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.proj.set(false, id);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.proj.set(false);
|
||||
}
|
||||
if (!this.proj2.state.dir) {
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await this.proj2.set(true, id);
|
||||
await delay_1.delay(this.cfg.arduino.serialDelay);
|
||||
await this.proj2.set(true);
|
||||
}
|
||||
await (0, delay_1.delay)(this.cfg.arduino.serialDelay);
|
||||
await 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(id);
|
||||
ms = await this.proj.both();
|
||||
}
|
||||
else {
|
||||
both = await Promise.all([this.proj.move(id), this.proj2.move(id)]);
|
||||
this.proj.move();
|
||||
this.proj2.move();
|
||||
both = [await this.proj.move, await this.proj2.move];
|
||||
ms = Math.max(...both);
|
||||
}
|
||||
}
|
||||
|
@ -592,54 +570,8 @@ class Commands {
|
|||
}
|
||||
return ms;
|
||||
}
|
||||
/**
|
||||
* Throws an alert to pause a sequence
|
||||
*
|
||||
* @returns {integer} Length of action in ms
|
||||
**/
|
||||
async alert(cmd) {
|
||||
const id = (0, uuid_1.v4)();
|
||||
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) {
|
||||
const id = (0, uuid_1.v4)();
|
||||
let ms;
|
||||
try {
|
||||
ms = await (0, delay_1.delay)(cmd.light * 1000); //delay is in seconds
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
}
|
||||
return ms;
|
||||
}
|
||||
/**
|
||||
* Sets the camera exposure (if supported).
|
||||
*
|
||||
**/
|
||||
async camera_exposure(cmd) {
|
||||
const id = (0, uuid_1.v4)();
|
||||
let ms;
|
||||
try {
|
||||
ms = await this.cam.exposure(cmd.light, id);
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
}
|
||||
return ms;
|
||||
}
|
||||
}
|
||||
exports.Commands = Commands;
|
||||
module.exports = { Commands };
|
||||
module.exports = function (cfg, proj, cam, light, cam2, proj2) {
|
||||
return new Commands(cfg, proj, cam, light, cam2, proj2);
|
||||
};
|
||||
//# sourceMappingURL=index.js.map
|
File diff suppressed because one or more lines are too long
|
@ -1,8 +0,0 @@
|
|||
/**
|
||||
* 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<number>;
|
|
@ -1,6 +1,4 @@
|
|||
'use strict';
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.delay = void 0;
|
||||
/**
|
||||
* Delay in an async/await function
|
||||
*
|
||||
|
@ -10,9 +8,8 @@ exports.delay = void 0;
|
|||
**/
|
||||
function delay(ms) {
|
||||
return new Promise((resolve) => {
|
||||
return setTimeout(() => { resolve(ms); }, ms);
|
||||
return setTimeout(resolve, ms);
|
||||
});
|
||||
}
|
||||
exports.delay = delay;
|
||||
module.exports = { delay };
|
||||
module.exports.delay = 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,SAAgB,KAAK,CAAE,EAAW;IACjC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAa,EAAE,EAAE;QACpC,OAAO,UAAU,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,CAAA,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACJ,CAAC;AAJD,sBAIC;AAED,MAAM,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,CAAC"}
|
||||
{"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"}
|
|
@ -1,116 +1,74 @@
|
|||
<a name="module_lib/devices"></a>
|
||||
<a name="Devices"></a>
|
||||
|
||||
## lib/devices
|
||||
## Devices
|
||||
class representing the device discovery features
|
||||
|
||||
* [lib/devices](#module_lib/devices)
|
||||
* [~Devices](#module_lib/devices..Devices)
|
||||
* [new Devices()](#new_module_lib/devices..Devices_new)
|
||||
* [.init()](#module_lib/devices..Devices+init)
|
||||
* [.listen()](#module_lib/devices..Devices+listen)
|
||||
* [.listener()](#module_lib/devices..Devices+listener)
|
||||
* [.enumerate()](#module_lib/devices..Devices+enumerate)
|
||||
* [.favor()](#module_lib/devices..Devices+favor)
|
||||
* [.distinguish()](#module_lib/devices..Devices+distinguish)
|
||||
* [.fakeProjector()](#module_lib/devices..Devices+fakeProjector)
|
||||
* [.fakeCamera()](#module_lib/devices..Devices+fakeCamera)
|
||||
* [.fakeLight()](#module_lib/devices..Devices+fakeLight)
|
||||
* [.fakeCapper()](#module_lib/devices..Devices+fakeCapper)
|
||||
* [.connectDevice()](#module_lib/devices..Devices+connectDevice)
|
||||
* [.all()](#module_lib/devices..Devices+all)
|
||||
* [.remember()](#module_lib/devices..Devices+remember)
|
||||
* [.ready()](#module_lib/devices..Devices+ready)
|
||||
**Kind**: global class
|
||||
|
||||
<a name="module_lib/devices..Devices"></a>
|
||||
* [Devices](#Devices)
|
||||
* [.init()](#Devices+init)
|
||||
* [.listen()](#Devices+listen)
|
||||
* [.listener()](#Devices+listener)
|
||||
* [.enumerate()](#Devices+enumerate)
|
||||
* [.favor()](#Devices+favor)
|
||||
* [.distinguish()](#Devices+distinguish)
|
||||
* [.fakeProjector()](#Devices+fakeProjector)
|
||||
* [.fakeCamera()](#Devices+fakeCamera)
|
||||
* [.fakeLight()](#Devices+fakeLight)
|
||||
* [.connectDevice()](#Devices+connectDevice)
|
||||
* [.all()](#Devices+all)
|
||||
* [.remember()](#Devices+remember)
|
||||
* [.ready()](#Devices+ready)
|
||||
|
||||
### lib/devices~Devices
|
||||
Class representing the device discovery features.
|
||||
<a name="Devices+init"></a>
|
||||
|
||||
**Kind**: inner class of [<code>lib/devices</code>](#module_lib/devices)
|
||||
### devices.init()
|
||||
**Kind**: instance method of [<code>Devices</code>](#Devices)
|
||||
<a name="Devices+listen"></a>
|
||||
|
||||
* [~Devices](#module_lib/devices..Devices)
|
||||
* [new Devices()](#new_module_lib/devices..Devices_new)
|
||||
* [.init()](#module_lib/devices..Devices+init)
|
||||
* [.listen()](#module_lib/devices..Devices+listen)
|
||||
* [.listener()](#module_lib/devices..Devices+listener)
|
||||
* [.enumerate()](#module_lib/devices..Devices+enumerate)
|
||||
* [.favor()](#module_lib/devices..Devices+favor)
|
||||
* [.distinguish()](#module_lib/devices..Devices+distinguish)
|
||||
* [.fakeProjector()](#module_lib/devices..Devices+fakeProjector)
|
||||
* [.fakeCamera()](#module_lib/devices..Devices+fakeCamera)
|
||||
* [.fakeLight()](#module_lib/devices..Devices+fakeLight)
|
||||
* [.fakeCapper()](#module_lib/devices..Devices+fakeCapper)
|
||||
* [.connectDevice()](#module_lib/devices..Devices+connectDevice)
|
||||
* [.all()](#module_lib/devices..Devices+all)
|
||||
* [.remember()](#module_lib/devices..Devices+remember)
|
||||
* [.ready()](#module_lib/devices..Devices+ready)
|
||||
### devices.listen()
|
||||
**Kind**: instance method of [<code>Devices</code>](#Devices)
|
||||
<a name="Devices+listener"></a>
|
||||
|
||||
<a name="new_module_lib/devices..Devices_new"></a>
|
||||
### devices.listener()
|
||||
**Kind**: instance method of [<code>Devices</code>](#Devices)
|
||||
<a name="Devices+enumerate"></a>
|
||||
|
||||
#### new Devices()
|
||||
Constructor assigns arduino, settings, UI browser window and cam objects
|
||||
locally to this class for reference.
|
||||
### devices.enumerate()
|
||||
**Kind**: instance method of [<code>Devices</code>](#Devices)
|
||||
<a name="Devices+favor"></a>
|
||||
|
||||
<a name="module_lib/devices..Devices+init"></a>
|
||||
### devices.favor()
|
||||
**Kind**: instance method of [<code>Devices</code>](#Devices)
|
||||
<a name="Devices+distinguish"></a>
|
||||
|
||||
#### devices.init()
|
||||
Initialize the log for "devices". Establish an ipc connection to the UI.
|
||||
Start listening on that ipc connection.
|
||||
### devices.distinguish()
|
||||
**Kind**: instance method of [<code>Devices</code>](#Devices)
|
||||
<a name="Devices+fakeProjector"></a>
|
||||
|
||||
**Kind**: instance method of [<code>Devices</code>](#module_lib/devices..Devices)
|
||||
<a name="module_lib/devices..Devices+listen"></a>
|
||||
### devices.fakeProjector()
|
||||
**Kind**: instance method of [<code>Devices</code>](#Devices)
|
||||
<a name="Devices+fakeCamera"></a>
|
||||
|
||||
#### devices.listen()
|
||||
Listen to the "profile" channel for messages from the UI.
|
||||
### devices.fakeCamera()
|
||||
**Kind**: instance method of [<code>Devices</code>](#Devices)
|
||||
<a name="Devices+fakeLight"></a>
|
||||
|
||||
**Kind**: instance method of [<code>Devices</code>](#module_lib/devices..Devices)
|
||||
<a name="module_lib/devices..Devices+listener"></a>
|
||||
### devices.fakeLight()
|
||||
**Kind**: instance method of [<code>Devices</code>](#Devices)
|
||||
<a name="Devices+connectDevice"></a>
|
||||
|
||||
#### devices.listener()
|
||||
The "profile" channel callback. If a profile is changed, set it in the
|
||||
local settings object.
|
||||
### devices.connectDevice()
|
||||
**Kind**: instance method of [<code>Devices</code>](#Devices)
|
||||
<a name="Devices+all"></a>
|
||||
|
||||
**Kind**: instance method of [<code>Devices</code>](#module_lib/devices..Devices)
|
||||
<a name="module_lib/devices..Devices+enumerate"></a>
|
||||
### devices.all()
|
||||
**Kind**: instance method of [<code>Devices</code>](#Devices)
|
||||
<a name="Devices+remember"></a>
|
||||
|
||||
#### devices.enumerate()
|
||||
**Kind**: instance method of [<code>Devices</code>](#module_lib/devices..Devices)
|
||||
<a name="module_lib/devices..Devices+favor"></a>
|
||||
### devices.remember()
|
||||
**Kind**: instance method of [<code>Devices</code>](#Devices)
|
||||
<a name="Devices+ready"></a>
|
||||
|
||||
#### devices.favor()
|
||||
**Kind**: instance method of [<code>Devices</code>](#module_lib/devices..Devices)
|
||||
<a name="module_lib/devices..Devices+distinguish"></a>
|
||||
|
||||
#### devices.distinguish()
|
||||
**Kind**: instance method of [<code>Devices</code>](#module_lib/devices..Devices)
|
||||
<a name="module_lib/devices..Devices+fakeProjector"></a>
|
||||
|
||||
#### devices.fakeProjector()
|
||||
**Kind**: instance method of [<code>Devices</code>](#module_lib/devices..Devices)
|
||||
<a name="module_lib/devices..Devices+fakeCamera"></a>
|
||||
|
||||
#### devices.fakeCamera()
|
||||
**Kind**: instance method of [<code>Devices</code>](#module_lib/devices..Devices)
|
||||
<a name="module_lib/devices..Devices+fakeLight"></a>
|
||||
|
||||
#### devices.fakeLight()
|
||||
**Kind**: instance method of [<code>Devices</code>](#module_lib/devices..Devices)
|
||||
<a name="module_lib/devices..Devices+fakeCapper"></a>
|
||||
|
||||
#### devices.fakeCapper()
|
||||
**Kind**: instance method of [<code>Devices</code>](#module_lib/devices..Devices)
|
||||
<a name="module_lib/devices..Devices+connectDevice"></a>
|
||||
|
||||
#### devices.connectDevice()
|
||||
**Kind**: instance method of [<code>Devices</code>](#module_lib/devices..Devices)
|
||||
<a name="module_lib/devices..Devices+all"></a>
|
||||
|
||||
#### devices.all()
|
||||
**Kind**: instance method of [<code>Devices</code>](#module_lib/devices..Devices)
|
||||
<a name="module_lib/devices..Devices+remember"></a>
|
||||
|
||||
#### devices.remember()
|
||||
**Kind**: instance method of [<code>Devices</code>](#module_lib/devices..Devices)
|
||||
<a name="module_lib/devices..Devices+ready"></a>
|
||||
|
||||
#### devices.ready()
|
||||
**Kind**: instance method of [<code>Devices</code>](#module_lib/devices..Devices)
|
||||
### devices.ready()
|
||||
**Kind**: instance method of [<code>Devices</code>](#Devices)
|
||||
|
|
|
@ -1,84 +0,0 @@
|
|||
import type { Settings } from 'settings';
|
||||
import type { Arduino } from 'arduino';
|
||||
import type { BrowserWindow } from 'electron';
|
||||
interface Device {
|
||||
serial: string;
|
||||
device: string;
|
||||
}
|
||||
/** @module lib/devices */
|
||||
/**
|
||||
* Class representing the device discovery features.
|
||||
*/
|
||||
export declare class Devices {
|
||||
settings: Settings;
|
||||
connected: any;
|
||||
private arduino;
|
||||
private log;
|
||||
private ui;
|
||||
private ipc;
|
||||
private mainWindow;
|
||||
/**
|
||||
* Constructor assigns arduino, settings, UI browser window and cam objects
|
||||
* locally to this class for reference.
|
||||
**/
|
||||
constructor(arduino: Arduino, settings: Settings, mainWindow: BrowserWindow);
|
||||
/**
|
||||
* Initialize the log for "devices". Establish an ipc connection to the UI.
|
||||
* Start listening on that ipc connection.
|
||||
**/
|
||||
private init;
|
||||
/**
|
||||
* Listen to the "profile" channel for messages from the UI.
|
||||
**/
|
||||
private listen;
|
||||
/**
|
||||
* The "profile" channel callback. If a profile is changed, set it in the
|
||||
* local settings object.
|
||||
**/
|
||||
private listener;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
enumerate(): Promise<boolean>;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private favor;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private distinguish;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private fakeProjector;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private fakeCamera;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private fakeLight;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private fakeCapper;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private connectDevice;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private all;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private remember;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private ready;
|
||||
}
|
||||
export type { Device };
|
|
@ -1,25 +1,24 @@
|
|||
'use strict';
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Devices = void 0;
|
||||
const electron_1 = require("electron");
|
||||
const delay_1 = require("delay");
|
||||
const log_1 = require("log");
|
||||
/** @module lib/devices */
|
||||
const Log = require("log");
|
||||
/**
|
||||
* Class representing the device discovery features.
|
||||
*/
|
||||
* class representing the device discovery features
|
||||
*
|
||||
*
|
||||
**/
|
||||
class Devices {
|
||||
/**
|
||||
* Constructor assigns arduino, settings, UI browser window and cam objects
|
||||
* locally to this class for reference.
|
||||
**/
|
||||
constructor(arduino, settings, mainWindow) {
|
||||
constructor(arduino, settings, mainWindow, cam) {
|
||||
this.connected = {};
|
||||
this.ipc = electron_1.ipcMain;
|
||||
this.arduino = arduino;
|
||||
this.settings = settings;
|
||||
this.mainWindow = mainWindow;
|
||||
this.ui = this.mainWindow.webContents;
|
||||
this.cam = cam;
|
||||
this.init();
|
||||
}
|
||||
/**
|
||||
|
@ -27,64 +26,57 @@ class Devices {
|
|||
* Start listening on that ipc connection.
|
||||
**/
|
||||
async init() {
|
||||
this.log = await (0, log_1.Log)({ label: 'devices' });
|
||||
this.log = await Log({ label: 'devices' });
|
||||
this.ipc = require('electron').ipcMain;
|
||||
this.listen();
|
||||
}
|
||||
/**
|
||||
* Listen to the "profile" channel for messages from the UI.
|
||||
**/
|
||||
listen() {
|
||||
this.ipc.handle('profile', this.listener.bind(this));
|
||||
this.ipc.on('profile', this.listener.bind(this));
|
||||
}
|
||||
/**
|
||||
* The "profile" channel callback. If a profile is changed, set it in the
|
||||
* local settings object.
|
||||
**/
|
||||
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;
|
||||
listener(event, arg) {
|
||||
this.log.info(`Saving profile ${arg.profile}`, 'SETTINGS', false, false);
|
||||
this.settings.update('profile', arg.profile);
|
||||
this.settings.save();
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
async enumerate() {
|
||||
let serials;
|
||||
let devices;
|
||||
try {
|
||||
serials = await this.arduino.enumerate();
|
||||
devices = await this.arduino.enumerate();
|
||||
}
|
||||
catch (err) {
|
||||
this.log.warn(err, 'SERIAL', false, true);
|
||||
await (0, delay_1.delay)(1000);
|
||||
await delay_1.delay(1000);
|
||||
return this.all([]);
|
||||
}
|
||||
this.log.info(`Found ${serials.length} USB devices`, 'SERIAL', true, true);
|
||||
serials = this.favor(serials);
|
||||
return await this.all(serials);
|
||||
this.log.info(`Found ${devices.length} USB devices`, 'SERIAL', true, true);
|
||||
devices = this.favor(devices);
|
||||
return await this.all(devices);
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
favor(serials) {
|
||||
favor(devices) {
|
||||
const past = this.settings.state.devices.filter((device) => {
|
||||
if (device.serial) {
|
||||
if (device.arduino) {
|
||||
return device;
|
||||
}
|
||||
}).map((device) => {
|
||||
return device.serial;
|
||||
return device.arduino;
|
||||
});
|
||||
if (past.length === 0) {
|
||||
return serials;
|
||||
return devices;
|
||||
}
|
||||
serials.sort((a, b) => {
|
||||
devices.sort((a, b) => {
|
||||
if (past.indexOf(a) !== -1 && past.indexOf(b) === -1) {
|
||||
return 1;
|
||||
}
|
||||
|
@ -93,24 +85,23 @@ class Devices {
|
|||
}
|
||||
return 0;
|
||||
});
|
||||
return serials;
|
||||
return devices;
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
async distinguish(serial) {
|
||||
async distinguish(device) {
|
||||
let connectSuccess;
|
||||
let verifySuccess;
|
||||
let device;
|
||||
//this.log.info(`distinguish() ${serial}`)
|
||||
let type;
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('connect', serial, true);
|
||||
connectSuccess = await this.arduino.connect('connect', device, true);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting', err);
|
||||
return null;
|
||||
}
|
||||
await (0, delay_1.delay)(2000);
|
||||
await delay_1.delay(2000);
|
||||
try {
|
||||
verifySuccess = await this.arduino.verify();
|
||||
}
|
||||
|
@ -118,25 +109,18 @@ class Devices {
|
|||
this.log.error('Error verifying device', err);
|
||||
return null;
|
||||
}
|
||||
this.log.info(`Verified ${serial} as mcopy device`, 'SERIAL', true, true);
|
||||
await (0, delay_1.delay)(1000);
|
||||
this.log.info(`Verified ${device} as mcopy device`, 'SERIAL', true, true);
|
||||
await delay_1.delay(1000);
|
||||
try {
|
||||
device = await this.arduino.distinguish();
|
||||
type = await this.arduino.distinguish();
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error distinguishing device', err);
|
||||
return null;
|
||||
}
|
||||
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;
|
||||
this.remember('arduino', device, type);
|
||||
this.log.info(`Determined ${device} to be ${type}`, 'SERIAL', true, true);
|
||||
return type;
|
||||
}
|
||||
/**
|
||||
*
|
||||
|
@ -147,24 +131,24 @@ class Devices {
|
|||
await this.arduino.fakeConnect('projector');
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(`Error connecting to fake PROjECTOR device`, 'SERIAL', true, true);
|
||||
this.log.error(err);
|
||||
console.error(err);
|
||||
this.log.error(`Error connecting to fake PRONECTOR device`, 'SERIAL', true, true);
|
||||
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);
|
||||
|
@ -179,33 +163,17 @@ 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 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) {
|
||||
*
|
||||
**/
|
||||
async connectDevice(device, type) {
|
||||
let closeSuccess;
|
||||
let connectSuccess;
|
||||
try {
|
||||
|
@ -215,10 +183,10 @@ class Devices {
|
|||
this.log.error('Error closing arduino connection', err);
|
||||
return false;
|
||||
}
|
||||
if (device === 'projector') {
|
||||
this.connected.projector = serial;
|
||||
if (type === 'projector') {
|
||||
this.connected.projector = device;
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('projector', serial, false);
|
||||
connectSuccess = await this.arduino.connect('projector', device, false);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting to projector', err);
|
||||
|
@ -226,10 +194,10 @@ class Devices {
|
|||
}
|
||||
this.log.info(`Connected to ${device} as PROJECTOR`, 'SERIAL', true, true);
|
||||
}
|
||||
else if (device === 'camera') {
|
||||
this.connected.camera = serial;
|
||||
else if (type === 'camera') {
|
||||
this.connected.camera = device;
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('camera', serial, false);
|
||||
connectSuccess = await this.arduino.connect('camera', device, false);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting to camera', err);
|
||||
|
@ -237,10 +205,10 @@ class Devices {
|
|||
}
|
||||
this.log.info(`Connected to ${device} as CAMERA`, 'SERIAL', true, true);
|
||||
}
|
||||
else if (device === 'light') {
|
||||
this.connected.light = serial;
|
||||
else if (type === 'light') {
|
||||
this.connected.light = device;
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('light', serial, false);
|
||||
connectSuccess = await this.arduino.connect('light', device, false);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting to light', err);
|
||||
|
@ -248,12 +216,12 @@ class Devices {
|
|||
}
|
||||
this.log.info(`Connected to ${device} as LIGHT`, 'SERIAL', true, true);
|
||||
}
|
||||
else if (device === 'projector,light') {
|
||||
this.connected.projector = serial;
|
||||
this.connected.light = serial;
|
||||
this.arduino.aliasSerial('light', serial);
|
||||
else if (type === 'projector,light') {
|
||||
this.connected.projector = device;
|
||||
this.connected.light = device;
|
||||
this.arduino.aliasSerial('light', device);
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('projector', serial, false);
|
||||
connectSuccess = await this.arduino.connect('projector', device, false);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting to projector and light', err);
|
||||
|
@ -261,14 +229,14 @@ class Devices {
|
|||
}
|
||||
this.log.info(`Connected to ${device} as PROJECTOR + LIGHT`, 'SERIAL', true, true);
|
||||
}
|
||||
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);
|
||||
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);
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('projector', serial, false);
|
||||
connectSuccess = await this.arduino.connect('projector', device, false);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting to projector, camera and light', err);
|
||||
|
@ -276,12 +244,12 @@ class Devices {
|
|||
}
|
||||
this.log.info(`Connected to ${device} as PROJECTOR + CAMERA + LIGHT`, 'SERIAL', true, true);
|
||||
}
|
||||
else if (device === 'projector,camera') {
|
||||
this.connected.projector = serial;
|
||||
this.connected.camera = serial;
|
||||
this.arduino.aliasSerial('camera', serial);
|
||||
else if (type === 'projector,camera') {
|
||||
this.connected.projector = device;
|
||||
this.connected.camera = device;
|
||||
this.arduino.aliasSerial('camera', device);
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('projector', serial, false);
|
||||
connectSuccess = await this.arduino.connect('projector', device, false);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting to projector and camera', err);
|
||||
|
@ -289,10 +257,10 @@ class Devices {
|
|||
}
|
||||
this.log.info(`Connected to ${device} as PROJECTOR + CAMERA`, 'SERIAL', true, true);
|
||||
}
|
||||
else if (device === 'projector_second') {
|
||||
this.connected.projector_second = serial;
|
||||
else if (type === 'projector_second') {
|
||||
this.connected.projector_second = device;
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('projector_second', serial, false);
|
||||
connectSuccess = await this.arduino.connect('projector_second', device, false);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting to secondary projector', err);
|
||||
|
@ -300,171 +268,115 @@ class Devices {
|
|||
}
|
||||
this.log.info(`Connected to ${device} as PROJECTOR_SECOND`, 'SERIAL', true, true);
|
||||
}
|
||||
else if (device === 'projector,projector_second') {
|
||||
this.connected.projector = serial;
|
||||
this.connected.projector_second = serial;
|
||||
this.arduino.aliasSerial('projector_second', serial);
|
||||
else if (type === 'projector,projector_second') {
|
||||
this.connected.projector = device;
|
||||
this.connected.projector_second = device;
|
||||
this.arduino.aliasSerial('projector_second', device);
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('projector', serial, false);
|
||||
connectSuccess = await this.arduino.connect('projector', device, false);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting to projector and secondary projector', err);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (device === 'camera_second') {
|
||||
this.connected.camera_second = serial;
|
||||
else if (type === 'camera_second') {
|
||||
this.connected.camera_second = device;
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('camera_second', serial, false);
|
||||
connectSuccess = await this.arduino.connect('camera_second', device, false);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err);
|
||||
console.error(err);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (device === 'camera,camera_second') {
|
||||
this.connected.camera = serial;
|
||||
this.connected.camera_second = serial;
|
||||
this.arduino.aliasSerial('camera_second', serial);
|
||||
else if (type === 'camera,camera_second') {
|
||||
this.connected.camera = device;
|
||||
this.connected.camera_second = device;
|
||||
this.arduino.aliasSerial('camera_second', device);
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('camera', serial, false);
|
||||
connectSuccess = await this.arduino.connect('camera', device, false);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting to camera, camera_secondary and projector', err);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
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);
|
||||
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);
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('camera', serial, false);
|
||||
connectSuccess = await this.arduino.connect('camera', device, false);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting to camera, projector and projector_second', err);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
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);
|
||||
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);
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('camera', serial, false);
|
||||
connectSuccess = await this.arduino.connect('camera', device, false);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting to camera, camera_second and projector', err);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
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);
|
||||
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);
|
||||
try {
|
||||
connectSuccess = await this.arduino.connect('camera', serial, false);
|
||||
connectSuccess = await this.arduino.connect('camera', device, 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(serials) {
|
||||
async all(devices) {
|
||||
let c = {};
|
||||
let p = {};
|
||||
let l = {};
|
||||
let device;
|
||||
let type;
|
||||
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,
|
||||
capper: false
|
||||
projector_second: false
|
||||
};
|
||||
for (let serial of serials) {
|
||||
for (let device of devices) {
|
||||
try {
|
||||
device = await this.distinguish(serial);
|
||||
type = await this.distinguish(device);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error distinguishing device', err);
|
||||
throw err;
|
||||
}
|
||||
try {
|
||||
await this.connectDevice(device, serial);
|
||||
await this.connectDevice(device, type);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error connecting to device', err);
|
||||
|
@ -475,82 +387,56 @@ 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;
|
||||
}
|
||||
if (this.connected.capper) {
|
||||
capper.arduino = this.connected.capper;
|
||||
ps = { arduino: this.connected.projector_second };
|
||||
}
|
||||
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, capper);
|
||||
return this.ready(p, c, l, cs, ps);
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
remember(device, serial, type) {
|
||||
*
|
||||
**/
|
||||
remember(which, device, type) {
|
||||
let deviceEntry;
|
||||
const match = this.settings.state.devices.filter((dev) => {
|
||||
if (typeof dev.device !== 'undefined' && dev.device === device &&
|
||||
typeof dev.serial !== 'undefined' && dev.serial === serial) {
|
||||
if (dev[which] && dev[which] === device) {
|
||||
return dev;
|
||||
}
|
||||
});
|
||||
if (match.length === 0) {
|
||||
deviceEntry = {
|
||||
device,
|
||||
type,
|
||||
serial
|
||||
type: type
|
||||
};
|
||||
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, capper) {
|
||||
*
|
||||
**/
|
||||
ready(projector, camera, light, camera_second, projector_second) {
|
||||
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);
|
||||
|
@ -566,11 +452,6 @@ 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);
|
||||
|
@ -579,6 +460,7 @@ class Devices {
|
|||
return true;
|
||||
}
|
||||
}
|
||||
exports.Devices = Devices;
|
||||
module.exports = { Devices };
|
||||
module.exports = function (arduino, settings, mainWindow, cam) {
|
||||
return new Devices(arduino, settings, mainWindow, cam);
|
||||
};
|
||||
//# sourceMappingURL=index.js.map
|
File diff suppressed because one or more lines are too long
|
@ -1,9 +0,0 @@
|
|||
<a name="module_lib/display"></a>
|
||||
|
||||
## lib/display
|
||||
<a name="module_lib/display..electron_1"></a>
|
||||
|
||||
### lib/display~electron\_1
|
||||
Provides features for displaying a full screen display of images for the digital module.
|
||||
|
||||
**Kind**: inner constant of [<code>lib/display</code>](#module_lib/display)
|
|
@ -1,18 +0,0 @@
|
|||
import type { System } from 'system';
|
||||
export declare class Display {
|
||||
private platform;
|
||||
private displays;
|
||||
private display;
|
||||
private tmpdir;
|
||||
private wv;
|
||||
constructor(sys: System);
|
||||
open(): Promise<void>;
|
||||
show(src: string): Promise<void>;
|
||||
showPath(pathStr: string): Promise<unknown>;
|
||||
hide(): void;
|
||||
close(): Promise<boolean>;
|
||||
focus(): Promise<boolean>;
|
||||
field(ratio: number): Promise<boolean>;
|
||||
meter(): Promise<boolean>;
|
||||
change(id: string): void;
|
||||
}
|
|
@ -1,28 +1,22 @@
|
|||
'use strict';
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Display = void 0;
|
||||
/**
|
||||
* @module lib/display */
|
||||
/**
|
||||
* @module display
|
||||
* Provides features for displaying a full screen display of images for the digital module.
|
||||
**/
|
||||
const electron_1 = require("electron");
|
||||
const path_1 = require("path");
|
||||
const url_1 = require("url");
|
||||
const delay_1 = require("delay");
|
||||
const log_1 = require("log");
|
||||
const { BrowserWindow } = require('electron');
|
||||
class WebView {
|
||||
constructor(platform, display) {
|
||||
this.opened = false;
|
||||
this.showing = false;
|
||||
this.loadWait = {};
|
||||
this.ipc = electron_1.ipcMain;
|
||||
const prefs = {
|
||||
webPreferences: {
|
||||
nodeIntegration: true,
|
||||
allowRunningInsecureContent: false,
|
||||
//enableRemoteModule: true,
|
||||
contextIsolation: false
|
||||
allowRunningInsecureContent: false
|
||||
},
|
||||
width: 800,
|
||||
height: 600,
|
||||
|
@ -30,18 +24,16 @@ 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)({
|
||||
const pagePath = path_1.normalize(path_1.join(__dirname, '../../display.html'));
|
||||
const pageUrl = 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 electron_1.BrowserWindow(prefs);
|
||||
require('@electron/remote/main').enable(this.digitalWindow.webContents);
|
||||
this.digitalWindow = new BrowserWindow(prefs);
|
||||
this.digitalWindow.loadURL(pageUrl);
|
||||
if (process.argv.indexOf('-d') !== -1 || process.argv.indexOf('--dev') !== -1) {
|
||||
this.digitalWindow.webContents.openDevTools();
|
||||
|
@ -53,32 +45,30 @@ 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 (0, log_1.Log)({ label: 'devices' });
|
||||
}
|
||||
async open() {
|
||||
this.digitalWindow.show();
|
||||
this.showing = true;
|
||||
this.opened = true;
|
||||
await this.digitalWindow.setFullScreen(true);
|
||||
await (0, delay_1.delay)(300);
|
||||
await delay_1.delay(300);
|
||||
if (this.platform === 'osx') {
|
||||
await (0, delay_1.delay)(300); //give macs an extra 300ms to open fullscreen
|
||||
await 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));
|
||||
const normalSrc = path_1.normalize(path_1.join(src));
|
||||
if (!this.digitalWindow) {
|
||||
this.log.warn(`Cannot show "${src}" because window does not exist`);
|
||||
console.warn(`Cannot show "${src}" because window does not exist`);
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
this.digitalWindow.webContents.send('display', { src: normalSrc });
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err);
|
||||
console.error(err);
|
||||
}
|
||||
this.showing = true;
|
||||
return new Promise(function (resolve) {
|
||||
|
@ -93,41 +83,41 @@ class WebView {
|
|||
}
|
||||
async focus() {
|
||||
if (!this.digitalWindow) {
|
||||
this.log.warn(`Cannot show focus screen because window does not exist`);
|
||||
console.warn(`Cannot show focus screen because window does not exist`);
|
||||
return false;
|
||||
}
|
||||
await (0, delay_1.delay)(500);
|
||||
await delay_1.delay(500);
|
||||
try {
|
||||
this.digitalWindow.webContents.send('focus', { focus: true });
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err);
|
||||
console.error(err);
|
||||
}
|
||||
}
|
||||
async field(ratio) {
|
||||
if (!this.digitalWindow) {
|
||||
this.log.warn(`Cannot show field guide because window does not exist`);
|
||||
console.warn(`Cannot show field guide because window does not exist`);
|
||||
return false;
|
||||
}
|
||||
await (0, delay_1.delay)(500);
|
||||
await delay_1.delay(500);
|
||||
try {
|
||||
this.digitalWindow.webContents.send('field', { field: true, ratio });
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err);
|
||||
console.error(err);
|
||||
}
|
||||
}
|
||||
async meter() {
|
||||
if (!this.digitalWindow) {
|
||||
this.log.warn(`Cannot show meter screen because window does not exist`);
|
||||
console.warn(`Cannot show meter screen because window does not exist`);
|
||||
return false;
|
||||
}
|
||||
await (0, delay_1.delay)(500);
|
||||
await delay_1.delay(500);
|
||||
try {
|
||||
this.digitalWindow.webContents.send('meter', { meter: true });
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err);
|
||||
console.error(err);
|
||||
}
|
||||
}
|
||||
hide() {
|
||||
|
@ -152,7 +142,7 @@ class Display {
|
|||
constructor(sys) {
|
||||
this.platform = sys.platform;
|
||||
this.displays = sys.displays;
|
||||
this.tmpdir = (0, path_1.join)(sys.tmp, 'mcopy_digital');
|
||||
this.tmpdir = path_1.join(sys.tmp, 'mcopy_digital');
|
||||
this.display = this.displays.find((display) => {
|
||||
if (display.primary)
|
||||
return true;
|
||||
|
@ -194,6 +184,7 @@ class Display {
|
|||
});
|
||||
}
|
||||
}
|
||||
exports.Display = Display;
|
||||
module.exports = { Display };
|
||||
module.exports = function (sys) {
|
||||
return new Display(sys);
|
||||
};
|
||||
//# sourceMappingURL=index.js.map
|
File diff suppressed because one or more lines are too long
|
@ -1,17 +0,0 @@
|
|||
interface ExecOutput {
|
||||
stdout: string;
|
||||
stderr: string;
|
||||
}
|
||||
/**
|
||||
* Promisified child_process.exec
|
||||
*
|
||||
* @param cmd
|
||||
* @param arg
|
||||
* @param opts See child_process.exec node docs
|
||||
* @param {stream.Writable} opts.stdout If defined, child process stdout will be piped to it.
|
||||
* @param {stream.Writable} opts.stderr If defined, child process stderr will be piped to it.
|
||||
*
|
||||
* @returns {Promise<{ stdout: string, stderr: stderr }>}
|
||||
*/
|
||||
export declare function exec(...args: string[]): Promise<ExecOutput>;
|
||||
export type { ExecOutput };
|
|
@ -1,7 +1,5 @@
|
|||
'use strict';
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.exec = void 0;
|
||||
const child_process_1 = require("child_process");
|
||||
const execRaw = require('child_process').exec;
|
||||
/**
|
||||
* Promisified child_process.exec
|
||||
*
|
||||
|
@ -30,7 +28,7 @@ async function exec(...args) {
|
|||
opts = { maxBuffer: 1024 * 1024 };
|
||||
}
|
||||
return new Promise((resolve, reject) => {
|
||||
const child = (0, child_process_1.exec)(cmd, opts, (err, stdout, stderr) => err ? reject(err) : resolve({
|
||||
const child = execRaw(cmd, opts, (err, stdout, stderr) => err ? reject(err) : resolve({
|
||||
stdout,
|
||||
stderr
|
||||
}));
|
||||
|
@ -42,6 +40,5 @@ async function exec(...args) {
|
|||
}
|
||||
});
|
||||
}
|
||||
exports.exec = exec;
|
||||
module.exports = { exec };
|
||||
module.exports.exec = exec;
|
||||
//# sourceMappingURL=index.js.map
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/exec/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;;;AAEZ,iDAA+C;AAO/C;;;;;;;;;;GAUG;AACI,KAAK,UAAU,IAAI,CAAC,GAAG,IAAe;IAC5C,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,OAAkB,EAAE,MAAiB,EAAE,EAAE;QAC5D,MAAM,KAAK,GAAG,IAAA,oBAAO,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;AA7BD,oBA6BC;AAED,MAAM,CAAC,OAAO,GAAG,EAAE,IAAI,EAAE,CAAA"}
|
||||
{"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"}
|
|
@ -1,8 +0,0 @@
|
|||
/**
|
||||
* 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;
|
|
@ -16,5 +16,5 @@ function exit(msg, code = 0) {
|
|||
process.exit(code);
|
||||
}
|
||||
}
|
||||
module.exports = { exit };
|
||||
module.exports.exit = exit;
|
||||
//# sourceMappingURL=index.js.map
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/exit/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb;;;;;;IAMI;AAEJ,SAAS,IAAI,CAAE,GAAY,EAAE,OAAgB,CAAC;IAC7C,IAAI,IAAI,KAAK,CAAC,EAAE;QACf,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjB,OAAO,CAAC,IAAI,EAAE,CAAC;KACf;SAAM;QACN,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KACnB;AACF,CAAC;AAED,MAAM,CAAC,OAAO,GAAG,EAAE,IAAI,EAAE,CAAC"}
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/exit/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb;;;;;;IAMI;AAEJ,SAAS,IAAI,CAAE,GAAY,EAAE,OAAgB,CAAC;IAC7C,IAAI,IAAI,KAAK,CAAC,EAAE;QACf,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjB,OAAO,CAAC,IAAI,EAAE,CAAC;KACf;SAAM;QACN,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KACnB;AACF,CAAC;AAED,MAAM,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC"}
|
|
@ -1,138 +0,0 @@
|
|||
## Modules
|
||||
|
||||
<dl>
|
||||
<dt><a href="#module_ffmpeg">ffmpeg</a></dt>
|
||||
<dd></dd>
|
||||
<dt><a href="#module_lib/ffmpeg">lib/ffmpeg</a></dt>
|
||||
<dd></dd>
|
||||
</dl>
|
||||
|
||||
<a name="module_ffmpeg"></a>
|
||||
|
||||
## ffmpeg
|
||||
<a name="module_lib/ffmpeg"></a>
|
||||
|
||||
## lib/ffmpeg
|
||||
|
||||
* [lib/ffmpeg](#module_lib/ffmpeg)
|
||||
* [~Creates an ffmpeg class](#module_lib/ffmpeg..Creates an ffmpeg class)
|
||||
* [new Creates an ffmpeg class(sys)](#new_module_lib/ffmpeg..Creates an ffmpeg class_new)
|
||||
* [~FFMPEG](#module_lib/ffmpeg..FFMPEG)
|
||||
* [.init()](#module_lib/ffmpeg..FFMPEG+init)
|
||||
* [.padded_frame(i)](#module_lib/ffmpeg..FFMPEG+padded_frame) ⇒ <code>string</code>
|
||||
* [.parseStderr(line)](#module_lib/ffmpeg..FFMPEG+parseStderr)
|
||||
* [.frame(state, light)](#module_lib/ffmpeg..FFMPEG+frame) ⇒ <code>string</code>
|
||||
* [.frames(video, obj)](#module_lib/ffmpeg..FFMPEG+frames) ⇒ <code>?</code>
|
||||
* [.clear(frame)](#module_lib/ffmpeg..FFMPEG+clear) ⇒ <code>boolean</code>
|
||||
* [.clearAll()](#module_lib/ffmpeg..FFMPEG+clearAll)
|
||||
* [.checkDir()](#module_lib/ffmpeg..FFMPEG+checkDir)
|
||||
|
||||
<a name="module_lib/ffmpeg..Creates an ffmpeg class"></a>
|
||||
|
||||
### lib/ffmpeg~Creates an ffmpeg class
|
||||
**Kind**: inner class of [<code>lib/ffmpeg</code>](#module_lib/ffmpeg)
|
||||
<a name="new_module_lib/ffmpeg..Creates an ffmpeg class_new"></a>
|
||||
|
||||
#### new Creates an ffmpeg class(sys)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| sys | <code>object</code> | System object to be used to get temp directory |
|
||||
|
||||
<a name="module_lib/ffmpeg..FFMPEG"></a>
|
||||
|
||||
### lib/ffmpeg~FFMPEG
|
||||
Class representing all ffmpeg features.
|
||||
|
||||
**Kind**: inner class of [<code>lib/ffmpeg</code>](#module_lib/ffmpeg)
|
||||
|
||||
* [~FFMPEG](#module_lib/ffmpeg..FFMPEG)
|
||||
* [.init()](#module_lib/ffmpeg..FFMPEG+init)
|
||||
* [.padded_frame(i)](#module_lib/ffmpeg..FFMPEG+padded_frame) ⇒ <code>string</code>
|
||||
* [.parseStderr(line)](#module_lib/ffmpeg..FFMPEG+parseStderr)
|
||||
* [.frame(state, light)](#module_lib/ffmpeg..FFMPEG+frame) ⇒ <code>string</code>
|
||||
* [.frames(video, obj)](#module_lib/ffmpeg..FFMPEG+frames) ⇒ <code>?</code>
|
||||
* [.clear(frame)](#module_lib/ffmpeg..FFMPEG+clear) ⇒ <code>boolean</code>
|
||||
* [.clearAll()](#module_lib/ffmpeg..FFMPEG+clearAll)
|
||||
* [.checkDir()](#module_lib/ffmpeg..FFMPEG+checkDir)
|
||||
|
||||
<a name="module_lib/ffmpeg..FFMPEG+init"></a>
|
||||
|
||||
#### ffmpeG.init()
|
||||
Async method to call async functions from constructor
|
||||
|
||||
**Kind**: instance method of [<code>FFMPEG</code>](#module_lib/ffmpeg..FFMPEG)
|
||||
<a name="module_lib/ffmpeg..FFMPEG+padded_frame"></a>
|
||||
|
||||
#### ffmpeG.padded\_frame(i) ⇒ <code>string</code>
|
||||
Add padding to a number to 5 places. Return a string.
|
||||
|
||||
**Kind**: instance method of [<code>FFMPEG</code>](#module_lib/ffmpeg..FFMPEG)
|
||||
**Returns**: <code>string</code> - Padded string
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| i | <code>integer</code> | Integer to pad |
|
||||
|
||||
<a name="module_lib/ffmpeg..FFMPEG+parseStderr"></a>
|
||||
|
||||
#### ffmpeG.parseStderr(line)
|
||||
Parse the stderr output of ffmpeg
|
||||
|
||||
**Kind**: instance method of [<code>FFMPEG</code>](#module_lib/ffmpeg..FFMPEG)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| line | <code>string</code> | Stderr line |
|
||||
|
||||
<a name="module_lib/ffmpeg..FFMPEG+frame"></a>
|
||||
|
||||
#### ffmpeG.frame(state, light) ⇒ <code>string</code>
|
||||
Render a single frame from a video or image to a png.
|
||||
|
||||
**Kind**: instance method of [<code>FFMPEG</code>](#module_lib/ffmpeg..FFMPEG)
|
||||
**Returns**: <code>string</code> - Path of frame
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| state | <code>object</code> | State object containing file data |
|
||||
| light | <code>object</code> | Object containing color information for frame |
|
||||
|
||||
<a name="module_lib/ffmpeg..FFMPEG+frames"></a>
|
||||
|
||||
#### ffmpeG.frames(video, obj) ⇒ <code>?</code>
|
||||
Render all frames in a video to the temp directory.
|
||||
Not in use.
|
||||
|
||||
**Kind**: instance method of [<code>FFMPEG</code>](#module_lib/ffmpeg..FFMPEG)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| video | <code>string</code> | Path to video |
|
||||
| obj | <code>object</code> | Not sure |
|
||||
|
||||
<a name="module_lib/ffmpeg..FFMPEG+clear"></a>
|
||||
|
||||
#### ffmpeG.clear(frame) ⇒ <code>boolean</code>
|
||||
Clears a specific frame from the tmp directory
|
||||
|
||||
**Kind**: instance method of [<code>FFMPEG</code>](#module_lib/ffmpeg..FFMPEG)
|
||||
**Returns**: <code>boolean</code> - True if successful, false if not
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| frame | <code>integer</code> | Integer of frame to clear |
|
||||
|
||||
<a name="module_lib/ffmpeg..FFMPEG+clearAll"></a>
|
||||
|
||||
#### ffmpeG.clearAll()
|
||||
Deletes all frames in temp directory.
|
||||
|
||||
**Kind**: instance method of [<code>FFMPEG</code>](#module_lib/ffmpeg..FFMPEG)
|
||||
<a name="module_lib/ffmpeg..FFMPEG+checkDir"></a>
|
||||
|
||||
#### ffmpeG.checkDir()
|
||||
Checks if mcopy temp directory exists. If it doesn't,
|
||||
creates it.
|
||||
|
||||
**Kind**: instance method of [<code>FFMPEG</code>](#module_lib/ffmpeg..FFMPEG)
|
|
@ -1,89 +0,0 @@
|
|||
import type { FilmOutState } from 'filmout';
|
||||
import type { System } from 'system';
|
||||
import type { LightState } from 'light';
|
||||
interface StdErr {
|
||||
frame: number;
|
||||
fps: number;
|
||||
time: string;
|
||||
speed: number;
|
||||
size: string;
|
||||
remaining?: number;
|
||||
progress?: number;
|
||||
estimated?: number;
|
||||
}
|
||||
/** @module lib/ffmpeg */
|
||||
/**
|
||||
* Class representing all ffmpeg features.
|
||||
*/
|
||||
export declare class FFMPEG {
|
||||
private bin;
|
||||
private log;
|
||||
private id;
|
||||
private TMPDIR;
|
||||
private child;
|
||||
onProgress: Function;
|
||||
/**
|
||||
* @constructor
|
||||
* Creates an ffmpeg class
|
||||
*
|
||||
* @param {object} sys System object to be used to get temp directory
|
||||
**/
|
||||
constructor(sys: System);
|
||||
/**
|
||||
* Async method to call async functions from constructor
|
||||
**/
|
||||
init(): Promise<void>;
|
||||
/**
|
||||
* Add padding to a number to 5 places. Return a string.
|
||||
*
|
||||
* @param {integer} i Integer to pad
|
||||
*
|
||||
* @returns {string} Padded string
|
||||
**/
|
||||
private padded_frame;
|
||||
/**
|
||||
* Parse the stderr output of ffmpeg
|
||||
*
|
||||
* @param {string} line Stderr line
|
||||
**/
|
||||
private parseStderr;
|
||||
/**
|
||||
* Render a single frame from a video or image to a png.
|
||||
*
|
||||
* @param {object} state State object containing file data
|
||||
* @param {object} light Object containing color information for frame
|
||||
*
|
||||
* @returns {string} Path of frame
|
||||
**/
|
||||
frame(state: FilmOutState, light: LightState): Promise<string>;
|
||||
/**
|
||||
* Render all frames in a video to the temp directory.
|
||||
* Not in use.
|
||||
*
|
||||
* @param {string} video Path to video
|
||||
* @param {object} obj Not sure
|
||||
*
|
||||
* @returns {?}
|
||||
**/
|
||||
frames(state: FilmOutState): Promise<unknown>;
|
||||
cancel(): void;
|
||||
/**
|
||||
* Clears a specific frame from the tmp directory
|
||||
*
|
||||
* @param {integer} frame Integer of frame to clear
|
||||
*
|
||||
* @returns {boolean} True if successful, false if not
|
||||
**/
|
||||
clear(state: any): Promise<boolean>;
|
||||
/**
|
||||
* Deletes all frames in temp directory.
|
||||
*
|
||||
**/
|
||||
clearAll(): Promise<void>;
|
||||
/**
|
||||
* Checks if mcopy temp directory exists. If it doesn't,
|
||||
* creates it.
|
||||
**/
|
||||
private checkDir;
|
||||
}
|
||||
export type { StdErr };
|
|
@ -1,16 +1,35 @@
|
|||
'use strict';
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.FFMPEG = void 0;
|
||||
/** @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");
|
||||
const log_1 = require("log");
|
||||
/** @module lib/ffmpeg */
|
||||
/**
|
||||
* Class representing all ffmpeg features.
|
||||
*/
|
||||
async function spawnAsync(bin, args) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const child = 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 {
|
||||
/**
|
||||
* @constructor
|
||||
|
@ -22,14 +41,15 @@ class FFMPEG {
|
|||
this.id = 'ffmpeg';
|
||||
this.onProgress = () => { };
|
||||
this.bin = sys.deps.ffmpeg;
|
||||
this.TMPDIR = (0, path_1.join)(sys.tmp, 'mcopy_digital');
|
||||
this.TMPDIR = path_1.join(sys.tmp, 'mcopy_digital');
|
||||
this.init();
|
||||
}
|
||||
/**
|
||||
* Async method to call async functions from constructor
|
||||
**/
|
||||
async init() {
|
||||
this.log = await (0, log_1.Log)({ label: this.id });
|
||||
const Log = require('log');
|
||||
this.log = await Log({ label: this.id });
|
||||
await this.checkDir();
|
||||
}
|
||||
/**
|
||||
|
@ -54,30 +74,21 @@ class FFMPEG {
|
|||
**/
|
||||
parseStderr(line) {
|
||||
//frame= 6416 fps= 30 q=31.0 size= 10251kB time=00:03:34.32 bitrate= 391.8kbits/s speed= 1x
|
||||
const obj = {
|
||||
frame: 0,
|
||||
fps: 0,
|
||||
time: '',
|
||||
speed: 0,
|
||||
size: ''
|
||||
};
|
||||
let frameStr;
|
||||
let fpsStr;
|
||||
let speedStr;
|
||||
let obj = {};
|
||||
if (line.substring(0, 'frame='.length) === 'frame=') {
|
||||
try {
|
||||
frameStr = line.split('frame=')[1].split('fps=')[0];
|
||||
obj.frame = parseInt(frameStr);
|
||||
fpsStr = line.split('fps=')[1].split('q=')[0];
|
||||
obj.fps = parseFloat(fpsStr);
|
||||
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];
|
||||
speedStr = line.split('speed=')[1].trim().replace('x', '');
|
||||
obj.speed = parseFloat(speedStr);
|
||||
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) {
|
||||
this.log.error('Error parsing stderr line', err);
|
||||
this.log.info(line);
|
||||
console.error(err);
|
||||
console.log(line);
|
||||
process.exit();
|
||||
}
|
||||
}
|
||||
|
@ -95,27 +106,24 @@ class FFMPEG {
|
|||
**/
|
||||
async frame(state, light) {
|
||||
const frameNum = state.frame;
|
||||
const video = state.directory ? state.files[frameNum] : state.path;
|
||||
const video = state.path;
|
||||
const w = state.info.width;
|
||||
const h = state.info.height;
|
||||
const padded = this.padded_frame(frameNum);
|
||||
let ext = 'png';
|
||||
let rgb = light.color;
|
||||
let rgba;
|
||||
let rgba = {};
|
||||
let tmpoutput;
|
||||
let cmd;
|
||||
let output;
|
||||
let fileExists = false;
|
||||
let scale = '';
|
||||
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
|
||||
scale = `,scale=${w}:${h}`;
|
||||
}
|
||||
tmpoutput = (0, path_1.join)(this.TMPDIR, `${state.hash}-export-${padded}.${ext}`);
|
||||
tmpoutput = path_1.join(this.TMPDIR, `${state.hash}-export-${padded}.${ext}`);
|
||||
try {
|
||||
fileExists = await (0, fs_extra_1.exists)(tmpoutput);
|
||||
fileExists = await fs_extra_1.exists(tmpoutput);
|
||||
}
|
||||
catch (err) {
|
||||
//
|
||||
|
@ -125,14 +133,14 @@ class FFMPEG {
|
|||
return tmpoutput;
|
||||
}
|
||||
//
|
||||
cmd = `${this.bin} -hwaccel auto -y -i "${video}" -vf "select='gte(n\\,${frameNum})'${scale}" -vframes 1 -compression_algo raw -pix_fmt rgb24 -crf 0 "${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 (0, exec_1.exec)(cmd);
|
||||
output = await exec_1.exec(cmd);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err);
|
||||
|
@ -141,7 +149,7 @@ class FFMPEG {
|
|||
this.log.info(`"${output.stdout.trim()}"`);
|
||||
if (rgb[0] !== 255 || rgb[1] !== 255 || rgb[2] !== 255) {
|
||||
rgb = rgb.map((e) => {
|
||||
return typeof e === 'string' ? parseInt(e) : e;
|
||||
return parseInt(e);
|
||||
});
|
||||
rgba = { r: rgb[0], g: rgb[1], b: rgb[2], a: 255 };
|
||||
try {
|
||||
|
@ -168,14 +176,12 @@ class FFMPEG {
|
|||
const h = state.info.height;
|
||||
const tmppath = this.TMPDIR;
|
||||
let ext = 'png';
|
||||
let tmpoutput = (0, path_1.join)(tmppath, `${state.hash}-export-%08d.${ext}`);
|
||||
let tmpoutput = 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 = [
|
||||
'-hwaccel',
|
||||
'auto',
|
||||
'-y',
|
||||
'-i', video
|
||||
];
|
||||
|
@ -192,7 +198,7 @@ class FFMPEG {
|
|||
//console.dir(args)
|
||||
//console.dir(state)
|
||||
try {
|
||||
await (0, fs_extra_1.mkdir)(tmppath);
|
||||
await fs_extra_1.mkdir(tmppath);
|
||||
}
|
||||
catch (err) {
|
||||
if (err.code && err.code === 'EEXIST') {
|
||||
|
@ -207,20 +213,20 @@ class FFMPEG {
|
|||
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', function (code) {
|
||||
this.child = child_process_1.spawn(this.bin, args);
|
||||
this.child.on('exit', (code) => {
|
||||
//console.log('GOT TO EXIT');
|
||||
if (code === 0) {
|
||||
this.log.info(stderr);
|
||||
this.log.info(stdout);
|
||||
console.log(stderr);
|
||||
console.log(stdout);
|
||||
return resolve(true);
|
||||
}
|
||||
else {
|
||||
this.log.error(`Process exited with code: ${code}`);
|
||||
this.log.error(stderr);
|
||||
console.error(`Process exited with code: ${code}`);
|
||||
console.error(stderr);
|
||||
return reject(stderr + stdout);
|
||||
}
|
||||
}.bind(this));
|
||||
});
|
||||
this.child.stdout.on('data', (data) => {
|
||||
const line = data.toString();
|
||||
stdout += line;
|
||||
|
@ -264,9 +270,9 @@ class FFMPEG {
|
|||
let ext = 'png';
|
||||
let tmppath;
|
||||
let fileExists;
|
||||
tmppath = (0, path_1.join)(this.TMPDIR, `${state.hash}-export-${padded}.${ext}`);
|
||||
tmppath = path_1.join(this.TMPDIR, `${state.hash}-export-${padded}.${ext}`);
|
||||
try {
|
||||
fileExists = await (0, fs_extra_1.exists)(tmppath);
|
||||
fileExists = await fs_extra_1.exists(tmppath);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err);
|
||||
|
@ -274,7 +280,7 @@ class FFMPEG {
|
|||
if (!fileExists)
|
||||
return false;
|
||||
try {
|
||||
await (0, fs_extra_1.unlink)(tmppath);
|
||||
await fs_extra_1.unlink(tmppath);
|
||||
this.log.info(`Cleared frame ${tmppath}`);
|
||||
}
|
||||
catch (err) {
|
||||
|
@ -290,7 +296,7 @@ class FFMPEG {
|
|||
const tmppath = this.TMPDIR;
|
||||
let files;
|
||||
try {
|
||||
files = await (0, fs_extra_1.readdir)(tmppath);
|
||||
files = await fs_extra_1.readdir(tmppath);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err);
|
||||
|
@ -304,7 +310,7 @@ class FFMPEG {
|
|||
if (files) {
|
||||
files.forEach(async (file, index) => {
|
||||
try {
|
||||
await (0, fs_extra_1.unlink)((0, path_1.join)(tmppath, file));
|
||||
await fs_extra_1.unlink(path_1.join(tmppath, file));
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err);
|
||||
|
@ -319,14 +325,14 @@ class FFMPEG {
|
|||
async checkDir() {
|
||||
let fileExists;
|
||||
try {
|
||||
fileExists = await (0, fs_extra_1.exists)(this.TMPDIR);
|
||||
fileExists = await fs_extra_1.exists(this.TMPDIR);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error checking for tmp dir', err);
|
||||
}
|
||||
if (!fileExists) {
|
||||
try {
|
||||
await (0, fs_extra_1.mkdir)(this.TMPDIR);
|
||||
await fs_extra_1.mkdir(this.TMPDIR);
|
||||
this.log.info(`Created tmpdir ${this.TMPDIR}`);
|
||||
}
|
||||
catch (err) {
|
||||
|
@ -341,6 +347,7 @@ class FFMPEG {
|
|||
}
|
||||
}
|
||||
}
|
||||
exports.FFMPEG = FFMPEG;
|
||||
module.exports = { FFMPEG };
|
||||
module.exports = (sys) => {
|
||||
return new FFMPEG(sys);
|
||||
};
|
||||
//# sourceMappingURL=index.js.map
|
File diff suppressed because one or more lines are too long
|
@ -1,54 +0,0 @@
|
|||
<a name="module_lib/ffprobe"></a>
|
||||
|
||||
## lib/ffprobe
|
||||
|
||||
* [lib/ffprobe](#module_lib/ffprobe)
|
||||
* [~FFPROBE](#module_lib/ffprobe..FFPROBE)
|
||||
* [.parseFps()](#module_lib/ffprobe..FFPROBE+parseFps)
|
||||
* [.info(video)](#module_lib/ffprobe..FFPROBE+info) ⇒ <code>object</code>
|
||||
* [.frames(video)](#module_lib/ffprobe..FFPROBE+frames) ⇒ <code>integer</code>
|
||||
|
||||
<a name="module_lib/ffprobe..FFPROBE"></a>
|
||||
|
||||
### lib/ffprobe~FFPROBE
|
||||
Class representing all ffprobe features.
|
||||
|
||||
**Kind**: inner class of [<code>lib/ffprobe</code>](#module_lib/ffprobe)
|
||||
|
||||
* [~FFPROBE](#module_lib/ffprobe..FFPROBE)
|
||||
* [.parseFps()](#module_lib/ffprobe..FFPROBE+parseFps)
|
||||
* [.info(video)](#module_lib/ffprobe..FFPROBE+info) ⇒ <code>object</code>
|
||||
* [.frames(video)](#module_lib/ffprobe..FFPROBE+frames) ⇒ <code>integer</code>
|
||||
|
||||
<a name="module_lib/ffprobe..FFPROBE+parseFps"></a>
|
||||
|
||||
#### ffprobE.parseFps()
|
||||
Parse the fps entry into a float representing the fps of a video
|
||||
|
||||
**Kind**: instance method of [<code>FFPROBE</code>](#module_lib/ffprobe..FFPROBE)
|
||||
<a name="module_lib/ffprobe..FFPROBE+info"></a>
|
||||
|
||||
#### ffprobE.info(video) ⇒ <code>object</code>
|
||||
Get info on a video in json format. Use for filmout.
|
||||
|
||||
**Kind**: instance method of [<code>FFPROBE</code>](#module_lib/ffprobe..FFPROBE)
|
||||
**Returns**: <code>object</code> - Video info in an object
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| video | <code>string</code> | Path to video |
|
||||
|
||||
<a name="module_lib/ffprobe..FFPROBE+frames"></a>
|
||||
|
||||
#### ffprobE.frames(video) ⇒ <code>integer</code>
|
||||
Count the number of frames in the video using one of two methods.
|
||||
The first uses -select_streams and is very fast. The second uses
|
||||
-count_frames and is VERY slow.
|
||||
|
||||
**Kind**: instance method of [<code>FFPROBE</code>](#module_lib/ffprobe..FFPROBE)
|
||||
**Returns**: <code>integer</code> - Number of frames in video
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| video | <code>string</code> | Path to video |
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
import type { System } from 'system';
|
||||
/** @module lib/ffprobe */
|
||||
/**
|
||||
* Class representing all ffprobe features.
|
||||
*/
|
||||
export declare class FFPROBE {
|
||||
private bin;
|
||||
private log;
|
||||
constructor(sys: System);
|
||||
private init;
|
||||
/**
|
||||
* Parse the fps entry into a float representing the fps of a video
|
||||
**/
|
||||
private parseFps;
|
||||
/**
|
||||
* Get info on a video in json format. Use for filmout.
|
||||
*
|
||||
* @param {string} video Path to video
|
||||
*
|
||||
* @returns {object} Video info in an object
|
||||
**/
|
||||
info(video: string): Promise<any>;
|
||||
/**
|
||||
* Count the number of frames in the video using one of two methods.
|
||||
* The first uses -select_streams and is very fast. The second uses
|
||||
* -count_frames and is VERY slow.
|
||||
*
|
||||
* @param {string} video Path to video
|
||||
*
|
||||
* @returns {integer} Number of frames in video
|
||||
**/
|
||||
frames(video: string): Promise<any>;
|
||||
}
|
|
@ -1,21 +1,14 @@
|
|||
'use strict';
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.FFPROBE = void 0;
|
||||
/** @module FFPROBE **/
|
||||
const fs_extra_1 = require("fs-extra");
|
||||
const path_1 = require("path");
|
||||
const exec_1 = require("exec");
|
||||
const log_1 = require("log");
|
||||
/** @module lib/ffprobe */
|
||||
/**
|
||||
* Class representing all ffprobe features.
|
||||
*/
|
||||
//const spawn = require('spawn');
|
||||
//const exit = require('exit');
|
||||
class FFPROBE {
|
||||
constructor(sys) {
|
||||
this.bin = sys.deps.ffprobe;
|
||||
this.init();
|
||||
}
|
||||
async init() {
|
||||
this.log = await (0, log_1.Log)({ label: 'ffprobe' });
|
||||
}
|
||||
/**
|
||||
* Parse the fps entry into a float representing the fps of a video
|
||||
|
@ -46,31 +39,29 @@ class FFPROBE {
|
|||
let json;
|
||||
let vid; //whether video has stream with video data
|
||||
try {
|
||||
fileExists = await (0, fs_extra_1.exists)(video);
|
||||
fileExists = await fs_extra_1.exists(video);
|
||||
}
|
||||
catch (err) {
|
||||
return exit(err, 5);
|
||||
}
|
||||
if (!fileExists) {
|
||||
//return exit(`File ${video} does not exist`, 6);
|
||||
this.log.error(new Error(`File ${video} does not exist`));
|
||||
console.error(new Error(`File ${video} does not exist`));
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
this.log.info(cmd);
|
||||
raw = await (0, exec_1.exec)(cmd);
|
||||
console.log(cmd);
|
||||
raw = await exec_1.exec(cmd);
|
||||
}
|
||||
catch (err) {
|
||||
//return exit(err, 7);
|
||||
this.log.error(err);
|
||||
console.error(err);
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
json = JSON.parse(raw.stdout);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error parsing stdout', err);
|
||||
this.log.error(raw.stdout);
|
||||
return raw.stdout;
|
||||
}
|
||||
if (json.format && json.format.duration) {
|
||||
|
@ -99,7 +90,7 @@ class FFPROBE {
|
|||
* @returns {integer} Number of frames in video
|
||||
**/
|
||||
async frames(video) {
|
||||
const ext = (0, path_1.extname)(video.toLowerCase());
|
||||
const ext = 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`;
|
||||
|
@ -107,11 +98,11 @@ class FFPROBE {
|
|||
let raw;
|
||||
let frames;
|
||||
try {
|
||||
fileExists = await (0, fs_extra_1.exists)(video);
|
||||
fileExists = await fs_extra_1.exists(video);
|
||||
}
|
||||
catch (err) {
|
||||
//return exit(err, 5);
|
||||
this.log.error(err);
|
||||
console.error(err);
|
||||
return false;
|
||||
}
|
||||
if (!fileExists) {
|
||||
|
@ -126,11 +117,11 @@ class FFPROBE {
|
|||
cmd = gif_cmd;
|
||||
}
|
||||
try {
|
||||
this.log.info(cmd);
|
||||
raw = await (0, exec_1.exec)(cmd);
|
||||
console.log(cmd);
|
||||
raw = await exec_1.exec(cmd);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err);
|
||||
console.error(err);
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
|
@ -142,11 +133,12 @@ class FFPROBE {
|
|||
return frames;
|
||||
}
|
||||
}
|
||||
exports.FFPROBE = FFPROBE;
|
||||
/*
|
||||
function map (obj : any) {
|
||||
console.dir(obj);
|
||||
}
|
||||
*/
|
||||
module.exports = { FFPROBE };
|
||||
module.exports = (sys) => {
|
||||
return new FFPROBE(sys);
|
||||
};
|
||||
//# sourceMappingURL=index.js.map
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ffprobe/index.ts"],"names":[],"mappings":"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"}
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ffprobe/index.ts"],"names":[],"mappings":"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"}
|
|
@ -1,227 +1,44 @@
|
|||
<a name="module_lib/filmout"></a>
|
||||
<a name="Digital"></a>
|
||||
|
||||
## lib/filmout
|
||||
## Digital
|
||||
**Kind**: global class
|
||||
|
||||
* [lib/filmout](#module_lib/filmout)
|
||||
* [~FilmOut](#module_lib/filmout..FilmOut)
|
||||
* [.init()](#module_lib/filmout..FilmOut+init)
|
||||
* [.listen()](#module_lib/filmout..FilmOut+listen)
|
||||
* [.hash(data)](#module_lib/filmout..FilmOut+hash)
|
||||
* [.set(dir)](#module_lib/filmout..FilmOut+set)
|
||||
* [.move()](#module_lib/filmout..FilmOut+move) ⇒ <code>number</code>
|
||||
* [.start()](#module_lib/filmout..FilmOut+start)
|
||||
* [.end()](#module_lib/filmout..FilmOut+end)
|
||||
* [.onConnect(evt, arg)](#module_lib/filmout..FilmOut+onConnect) ⇒ <code>boolean</code>
|
||||
* [.onPreExport(evt, arg)](#module_lib/filmout..FilmOut+onPreExport) ⇒ <code>any</code>
|
||||
* [.isGifAnimated(pathStr)](#module_lib/filmout..FilmOut+isGifAnimated) ⇒ <code>boolean</code>
|
||||
* [.stillInfo(pathStr)](#module_lib/filmout..FilmOut+stillInfo) ⇒ <code>object</code>
|
||||
* [.dirInfo(images)](#module_lib/filmout..FilmOut+dirInfo) ⇒ <code>object</code>
|
||||
* [.dirList(pathStr)](#module_lib/filmout..FilmOut+dirList) ⇒ <code>array</code>
|
||||
* [.previewFrame(evt, arg)](#module_lib/filmout..FilmOut+previewFrame)
|
||||
* [.preview(evt, arg)](#module_lib/filmout..FilmOut+preview)
|
||||
* [.focus()](#module_lib/filmout..FilmOut+focus)
|
||||
* [.field()](#module_lib/filmout..FilmOut+field)
|
||||
* [.meter()](#module_lib/filmout..FilmOut+meter)
|
||||
* [.close()](#module_lib/filmout..FilmOut+close)
|
||||
* [.onDisplay()](#module_lib/filmout..FilmOut+onDisplay)
|
||||
* [Digital](#Digital)
|
||||
* [.init()](#Digital+init)
|
||||
* [.listen()](#Digital+listen)
|
||||
* [.set()](#Digital+set)
|
||||
* [.move()](#Digital+move)
|
||||
* [.start()](#Digital+start)
|
||||
* [.end()](#Digital+end)
|
||||
* [.connectDigital()](#Digital+connectDigital)
|
||||
|
||||
<a name="module_lib/filmout..FilmOut"></a>
|
||||
<a name="Digital+init"></a>
|
||||
|
||||
### lib/filmout~FilmOut
|
||||
Class representing all filmout features.
|
||||
### digital.init()
|
||||
**Kind**: instance method of [<code>Digital</code>](#Digital)
|
||||
<a name="Digital+listen"></a>
|
||||
|
||||
**Kind**: inner class of [<code>lib/filmout</code>](#module_lib/filmout)
|
||||
### digital.listen()
|
||||
**Kind**: instance method of [<code>Digital</code>](#Digital)
|
||||
<a name="Digital+set"></a>
|
||||
|
||||
* [~FilmOut](#module_lib/filmout..FilmOut)
|
||||
* [.init()](#module_lib/filmout..FilmOut+init)
|
||||
* [.listen()](#module_lib/filmout..FilmOut+listen)
|
||||
* [.hash(data)](#module_lib/filmout..FilmOut+hash)
|
||||
* [.set(dir)](#module_lib/filmout..FilmOut+set)
|
||||
* [.move()](#module_lib/filmout..FilmOut+move) ⇒ <code>number</code>
|
||||
* [.start()](#module_lib/filmout..FilmOut+start)
|
||||
* [.end()](#module_lib/filmout..FilmOut+end)
|
||||
* [.onConnect(evt, arg)](#module_lib/filmout..FilmOut+onConnect) ⇒ <code>boolean</code>
|
||||
* [.onPreExport(evt, arg)](#module_lib/filmout..FilmOut+onPreExport) ⇒ <code>any</code>
|
||||
* [.isGifAnimated(pathStr)](#module_lib/filmout..FilmOut+isGifAnimated) ⇒ <code>boolean</code>
|
||||
* [.stillInfo(pathStr)](#module_lib/filmout..FilmOut+stillInfo) ⇒ <code>object</code>
|
||||
* [.dirInfo(images)](#module_lib/filmout..FilmOut+dirInfo) ⇒ <code>object</code>
|
||||
* [.dirList(pathStr)](#module_lib/filmout..FilmOut+dirList) ⇒ <code>array</code>
|
||||
* [.previewFrame(evt, arg)](#module_lib/filmout..FilmOut+previewFrame)
|
||||
* [.preview(evt, arg)](#module_lib/filmout..FilmOut+preview)
|
||||
* [.focus()](#module_lib/filmout..FilmOut+focus)
|
||||
* [.field()](#module_lib/filmout..FilmOut+field)
|
||||
* [.meter()](#module_lib/filmout..FilmOut+meter)
|
||||
* [.close()](#module_lib/filmout..FilmOut+close)
|
||||
* [.onDisplay()](#module_lib/filmout..FilmOut+onDisplay)
|
||||
### digital.set()
|
||||
**Kind**: instance method of [<code>Digital</code>](#Digital)
|
||||
<a name="Digital+move"></a>
|
||||
|
||||
<a name="module_lib/filmout..FilmOut+init"></a>
|
||||
### digital.move()
|
||||
**Kind**: instance method of [<code>Digital</code>](#Digital)
|
||||
<a name="Digital+start"></a>
|
||||
|
||||
#### filmOut.init()
|
||||
Async function for requiring log, ipcMain and bind events.
|
||||
### digital.start()
|
||||
**Kind**: instance method of [<code>Digital</code>](#Digital)
|
||||
<a name="Digital+end"></a>
|
||||
|
||||
**Kind**: instance method of [<code>FilmOut</code>](#module_lib/filmout..FilmOut)
|
||||
<a name="module_lib/filmout..FilmOut+listen"></a>
|
||||
### digital.end()
|
||||
**Kind**: instance method of [<code>Digital</code>](#Digital)
|
||||
<a name="Digital+connectDigital"></a>
|
||||
|
||||
#### filmOut.listen()
|
||||
**Kind**: instance method of [<code>FilmOut</code>](#module_lib/filmout..FilmOut)
|
||||
<a name="module_lib/filmout..FilmOut+hash"></a>
|
||||
### digital.connectDigital()
|
||||
Use a file as the "digital" source on "projector"
|
||||
|
||||
#### filmOut.hash(data)
|
||||
Create a hash of a string.
|
||||
|
||||
**Kind**: instance method of [<code>FilmOut</code>](#module_lib/filmout..FilmOut)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| data | <code>string</code> | Data to produce hash of |
|
||||
|
||||
<a name="module_lib/filmout..FilmOut+set"></a>
|
||||
|
||||
#### filmOut.set(dir)
|
||||
Sets filmout direction.
|
||||
|
||||
**Kind**: instance method of [<code>FilmOut</code>](#module_lib/filmout..FilmOut)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| dir | <code>boolean</code> | Direction of filmout |
|
||||
|
||||
<a name="module_lib/filmout..FilmOut+move"></a>
|
||||
|
||||
#### filmOut.move() ⇒ <code>number</code>
|
||||
Moves filmout a frame at a time.
|
||||
|
||||
**Kind**: instance method of [<code>FilmOut</code>](#module_lib/filmout..FilmOut)
|
||||
**Returns**: <code>number</code> - Time since start
|
||||
<a name="module_lib/filmout..FilmOut+start"></a>
|
||||
|
||||
#### filmOut.start()
|
||||
Begin the process of exporting single frames from the video for display.
|
||||
|
||||
**Kind**: instance method of [<code>FilmOut</code>](#module_lib/filmout..FilmOut)
|
||||
<a name="module_lib/filmout..FilmOut+end"></a>
|
||||
|
||||
#### filmOut.end()
|
||||
Ends the filmout process and closes the display.
|
||||
|
||||
**Kind**: instance method of [<code>FilmOut</code>](#module_lib/filmout..FilmOut)
|
||||
<a name="module_lib/filmout..FilmOut+onConnect"></a>
|
||||
|
||||
#### filmOut.onConnect(evt, arg) ⇒ <code>boolean</code>
|
||||
Use a video file as a film out source on "projector"
|
||||
|
||||
**Kind**: instance method of [<code>FilmOut</code>](#module_lib/filmout..FilmOut)
|
||||
**Returns**: <code>boolean</code> - Success state
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| evt | <code>object</code> | Original connect event |
|
||||
| arg | <code>object</code> | Arguments from ipc message |
|
||||
|
||||
<a name="module_lib/filmout..FilmOut+onPreExport"></a>
|
||||
|
||||
#### filmOut.onPreExport(evt, arg) ⇒ <code>any</code>
|
||||
Pre-export all frames from video for display.
|
||||
|
||||
**Kind**: instance method of [<code>FilmOut</code>](#module_lib/filmout..FilmOut)
|
||||
**Returns**: <code>any</code> - UI send call
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| evt | <code>object</code> | IPC event |
|
||||
| arg | <code>object</code> | IPC args |
|
||||
|
||||
<a name="module_lib/filmout..FilmOut+isGifAnimated"></a>
|
||||
|
||||
#### filmOut.isGifAnimated(pathStr) ⇒ <code>boolean</code>
|
||||
Return true if gif is animated, false if it is a still
|
||||
|
||||
**Kind**: instance method of [<code>FilmOut</code>](#module_lib/filmout..FilmOut)
|
||||
**Returns**: <code>boolean</code> - Whether or not gif is animated
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| pathStr | <code>string</code> | Path to gif to check |
|
||||
|
||||
<a name="module_lib/filmout..FilmOut+stillInfo"></a>
|
||||
|
||||
#### filmOut.stillInfo(pathStr) ⇒ <code>object</code>
|
||||
Return information on a still image using the Jimp module
|
||||
|
||||
**Kind**: instance method of [<code>FilmOut</code>](#module_lib/filmout..FilmOut)
|
||||
**Returns**: <code>object</code> - Info about still from sharp
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| pathStr | <code>string</code> | Path to gif to check |
|
||||
|
||||
<a name="module_lib/filmout..FilmOut+dirInfo"></a>
|
||||
|
||||
#### filmOut.dirInfo(images) ⇒ <code>object</code>
|
||||
Return information on the first still image found in a
|
||||
directory using the Jimp module.
|
||||
|
||||
**Kind**: instance method of [<code>FilmOut</code>](#module_lib/filmout..FilmOut)
|
||||
**Returns**: <code>object</code> - Info about first image
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| images | <code>array</code> | List of image paths |
|
||||
|
||||
<a name="module_lib/filmout..FilmOut+dirList"></a>
|
||||
|
||||
#### filmOut.dirList(pathStr) ⇒ <code>array</code>
|
||||
Returns a list of images within a directory, filtered
|
||||
for supported types and sorted.
|
||||
|
||||
**Kind**: instance method of [<code>FilmOut</code>](#module_lib/filmout..FilmOut)
|
||||
**Returns**: <code>array</code> - Array of image paths
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| pathStr | <code>string</code> | Path to directory |
|
||||
|
||||
<a name="module_lib/filmout..FilmOut+previewFrame"></a>
|
||||
|
||||
#### filmOut.previewFrame(evt, arg)
|
||||
Preview a frame from the selected video.
|
||||
|
||||
**Kind**: instance method of [<code>FilmOut</code>](#module_lib/filmout..FilmOut)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| evt | <code>object</code> | Original event |
|
||||
| arg | <code>object</code> | Arguments from message |
|
||||
|
||||
<a name="module_lib/filmout..FilmOut+preview"></a>
|
||||
|
||||
#### filmOut.preview(evt, arg)
|
||||
Open a single frame in a display window to preview filmout.
|
||||
|
||||
**Kind**: instance method of [<code>FilmOut</code>](#module_lib/filmout..FilmOut)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| evt | <code>object</code> | Original event |
|
||||
| arg | <code>object</code> | Arguments from message |
|
||||
|
||||
<a name="module_lib/filmout..FilmOut+focus"></a>
|
||||
|
||||
#### filmOut.focus()
|
||||
**Kind**: instance method of [<code>FilmOut</code>](#module_lib/filmout..FilmOut)
|
||||
<a name="module_lib/filmout..FilmOut+field"></a>
|
||||
|
||||
#### filmOut.field()
|
||||
**Kind**: instance method of [<code>FilmOut</code>](#module_lib/filmout..FilmOut)
|
||||
<a name="module_lib/filmout..FilmOut+meter"></a>
|
||||
|
||||
#### filmOut.meter()
|
||||
**Kind**: instance method of [<code>FilmOut</code>](#module_lib/filmout..FilmOut)
|
||||
<a name="module_lib/filmout..FilmOut+close"></a>
|
||||
|
||||
#### filmOut.close()
|
||||
**Kind**: instance method of [<code>FilmOut</code>](#module_lib/filmout..FilmOut)
|
||||
<a name="module_lib/filmout..FilmOut+onDisplay"></a>
|
||||
|
||||
#### filmOut.onDisplay()
|
||||
**Kind**: instance method of [<code>FilmOut</code>](#module_lib/filmout..FilmOut)
|
||||
**Kind**: instance method of [<code>Digital</code>](#Digital)
|
||||
|
|
|
@ -1,173 +0,0 @@
|
|||
import type { Server } from 'server';
|
||||
import type { Display } from 'display';
|
||||
import type { Light } from 'light';
|
||||
import type { FFMPEG } from 'ffmpeg';
|
||||
import type { FFPROBE } from 'ffprobe';
|
||||
import type { WebContents, IpcMainEvent } from 'electron';
|
||||
interface FilmOutState {
|
||||
hash: string;
|
||||
frame: number;
|
||||
frames: number;
|
||||
fps: number;
|
||||
seconds: number;
|
||||
still: boolean;
|
||||
path: string;
|
||||
fileName: string;
|
||||
directory: boolean;
|
||||
info: any;
|
||||
dir: boolean;
|
||||
enabled: boolean;
|
||||
files: string[];
|
||||
}
|
||||
/** @module lib/filmout */
|
||||
/**
|
||||
* Class representing all filmout features.
|
||||
*/
|
||||
export declare class FilmOut {
|
||||
private id;
|
||||
private videoExtensions;
|
||||
private stillExtensions;
|
||||
private sequenceExtensions;
|
||||
private gifExtension;
|
||||
state: FilmOutState;
|
||||
private ffmpeg;
|
||||
private ffprobe;
|
||||
private light;
|
||||
private ipc;
|
||||
private ui;
|
||||
private log;
|
||||
display: Display;
|
||||
server: Server;
|
||||
/**
|
||||
* @constructor
|
||||
* Builds FilmOut class with display, ffmpeg, ffprobe, ui and light as internal properties.
|
||||
*
|
||||
* @param {object} display Display object for showing frames
|
||||
* @param {object} ffmpeg FFMPEG wrapper
|
||||
* @param {object} ffprobe FFPROBE wrapper for file info
|
||||
* @param {object} ui Electron ui object
|
||||
* @param {object} light Light device object
|
||||
**/
|
||||
constructor(display: Display, server: Server, ffmpeg: FFMPEG, ffprobe: FFPROBE, ui: WebContents, light: Light);
|
||||
/**
|
||||
* Async function for requiring log, ipcMain and bind events.
|
||||
**/
|
||||
private init;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private listen;
|
||||
/**
|
||||
* Create a hash of a string.
|
||||
*
|
||||
* @param {string} data Data to produce hash of
|
||||
*/
|
||||
private hash;
|
||||
/**
|
||||
* Sets filmout direction.
|
||||
*
|
||||
* @param {boolean} dir Direction of filmout
|
||||
**/
|
||||
set(dir: boolean): void;
|
||||
/**
|
||||
* Moves filmout a frame at a time.
|
||||
*
|
||||
* @returns {number} Time since start
|
||||
**/
|
||||
move(): Promise<number>;
|
||||
/**
|
||||
* Begin the process of exporting single frames from the video for display.
|
||||
**/
|
||||
start(): Promise<void>;
|
||||
/**
|
||||
* Ends the filmout process and closes the display.
|
||||
**/
|
||||
end(): Promise<void>;
|
||||
/**
|
||||
* Use a video file as a film out source on "projector"
|
||||
*
|
||||
* @param {object} evt Original connect event
|
||||
* @param {object} arg Arguments from ipc message
|
||||
*
|
||||
* @returns {boolean} Success state
|
||||
**/
|
||||
onConnect(evt: IpcMainEvent, arg: any): Promise<boolean>;
|
||||
/**
|
||||
* Pre-export all frames from video for display.
|
||||
*
|
||||
* @param {object} evt IPC event
|
||||
* @param {object} arg IPC args
|
||||
*
|
||||
* @returns {any} UI send call
|
||||
*/
|
||||
onPreExport(evt: IpcMainEvent, arg: any): Promise<any>;
|
||||
/**
|
||||
* Return true if gif is animated, false if it is a still
|
||||
*
|
||||
* @param {string} pathStr Path to gif to check
|
||||
*
|
||||
* @returns {boolean} Whether or not gif is animated
|
||||
**/
|
||||
isGifAnimated(pathStr: string): Promise<boolean>;
|
||||
/**
|
||||
* 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
|
||||
**/
|
||||
stillInfo(pathStr: string): Promise<any>;
|
||||
/**
|
||||
* 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
|
||||
**/
|
||||
dirInfo(images: string[]): Promise<any>;
|
||||
/**
|
||||
* 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
|
||||
**/
|
||||
dirList(pathStr: string): Promise<string[]>;
|
||||
/**
|
||||
* Preview a frame from the selected video.
|
||||
*
|
||||
* @param {object} evt Original event
|
||||
* @param {object} arg Arguments from message
|
||||
**/
|
||||
previewFrame(evt: IpcMainEvent, arg: any): Promise<void>;
|
||||
/**
|
||||
* Open a single frame in a display window to preview filmout.
|
||||
*
|
||||
* @param {object} evt Original event
|
||||
* @param {object} arg Arguments from message
|
||||
**/
|
||||
preview(evt: IpcMainEvent, arg: any): Promise<void>;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
focus(evt: IpcMainEvent, arg: any): Promise<void>;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
field(evt: IpcMainEvent, arg: any): Promise<void>;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
meter(evt: IpcMainEvent, arg: any): Promise<void>;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
close(evt: IpcMainEvent, arg: any): Promise<void>;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
onDisplay(evt: IpcMainEvent, arg: any): void;
|
||||
}
|
||||
export type { FilmOutState };
|
|
@ -3,19 +3,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.FilmOut = void 0;
|
||||
const electron_1 = require("electron");
|
||||
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 = require("frame");
|
||||
const log_1 = require("log");
|
||||
/** @module lib/filmout */
|
||||
const frame_1 = __importDefault(require("frame"));
|
||||
/**
|
||||
* Class representing all filmout features.
|
||||
*/
|
||||
* @module FilmOut
|
||||
**/
|
||||
class FilmOut {
|
||||
/**
|
||||
* @constructor
|
||||
|
@ -27,30 +23,22 @@ class FilmOut {
|
|||
* @param {object} ui Electron ui object
|
||||
* @param {object} light Light device object
|
||||
**/
|
||||
constructor(display, server, ffmpeg, ffprobe, ui, light) {
|
||||
constructor(display, 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 = {
|
||||
hash: null,
|
||||
frame: 0,
|
||||
frames: 0,
|
||||
fps: 24,
|
||||
seconds: 0,
|
||||
still: false,
|
||||
path: null,
|
||||
fileName: null,
|
||||
directory: false,
|
||||
info: {},
|
||||
dir: true,
|
||||
enabled: false,
|
||||
files: []
|
||||
enabled: false
|
||||
};
|
||||
this.ipc = electron_1.ipcMain;
|
||||
this.display = display;
|
||||
this.server = server;
|
||||
this.ffmpeg = ffmpeg;
|
||||
this.ffprobe = ffprobe;
|
||||
this.ui = ui;
|
||||
|
@ -61,7 +49,9 @@ class FilmOut {
|
|||
* Async function for requiring log, ipcMain and bind events.
|
||||
**/
|
||||
async init() {
|
||||
this.log = await (0, log_1.Log)({ label: this.id });
|
||||
const Log = require('log');
|
||||
this.log = await Log({ label: this.id });
|
||||
this.ipc = require('electron').ipcMain;
|
||||
this.listen();
|
||||
}
|
||||
/**
|
||||
|
@ -87,7 +77,7 @@ class FilmOut {
|
|||
* @param {string} data Data to produce hash of
|
||||
*/
|
||||
hash(data) {
|
||||
return (0, crypto_1.createHash)('sha1').update(data).digest('hex');
|
||||
return crypto_1.createHash('sha1').update(data).digest('hex');
|
||||
}
|
||||
/**
|
||||
* Sets filmout direction.
|
||||
|
@ -99,13 +89,11 @@ 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 -1;
|
||||
return false;
|
||||
}
|
||||
if (this.state.dir) {
|
||||
this.state.frame++;
|
||||
|
@ -130,18 +118,14 @@ class FilmOut {
|
|||
this.log.error(err, 'FILMOUT', true, true);
|
||||
throw err;
|
||||
}
|
||||
if (this.server.displayImage(path)) {
|
||||
await (0, delay_1.delay)(20);
|
||||
return;
|
||||
}
|
||||
await this.display.show(path);
|
||||
await (0, delay_1.delay)(20);
|
||||
await delay_1.delay(20);
|
||||
}
|
||||
/**
|
||||
* Ends the filmout process and closes the display.
|
||||
**/
|
||||
async end() {
|
||||
await (0, delay_1.delay)(20);
|
||||
await delay_1.delay(20);
|
||||
this.display.hide();
|
||||
}
|
||||
/**
|
||||
|
@ -149,29 +133,14 @@ 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;
|
||||
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) {
|
||||
ext = path_1.extname(arg.fileName.toLowerCase());
|
||||
if (ext === this.gifExtension) {
|
||||
try {
|
||||
isAnimated = await this.isGifAnimated(arg.path);
|
||||
}
|
||||
|
@ -184,11 +153,9 @@ 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);
|
||||
|
@ -201,29 +168,7 @@ class FilmOut {
|
|||
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) {
|
||||
if (this.state.still) {
|
||||
try {
|
||||
info = await this.stillInfo(arg.path);
|
||||
}
|
||||
|
@ -261,34 +206,22 @@ class FilmOut {
|
|||
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;
|
||||
await this.ui.send(this.id, { valid: true, state: JSON.stringify(this.state) });
|
||||
return true;
|
||||
return await this.ui.send(this.id, { valid: true, state: JSON.stringify(this.state) });
|
||||
}
|
||||
/**
|
||||
* 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) {
|
||||
|
@ -312,16 +245,16 @@ class FilmOut {
|
|||
async isGifAnimated(pathStr) {
|
||||
let gifBuffer;
|
||||
try {
|
||||
gifBuffer = await (0, fs_extra_1.readFile)(pathStr);
|
||||
gifBuffer = await fs_extra_1.readFile(pathStr);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(err, 'FILMOUT', true, true);
|
||||
return false;
|
||||
}
|
||||
return (0, animated_gif_detector_1.default)(gifBuffer);
|
||||
return animated_gif_detector_1.default(gifBuffer);
|
||||
}
|
||||
/**
|
||||
* Return information on a still image using the Jimp module
|
||||
* Return information on a still image using the sharp module
|
||||
*
|
||||
* @param {string} pathStr Path to gif to check
|
||||
*
|
||||
|
@ -330,60 +263,13 @@ class FilmOut {
|
|||
async stillInfo(pathStr) {
|
||||
let info;
|
||||
try {
|
||||
info = await frame_1.Frame.info(pathStr);
|
||||
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.
|
||||
*
|
||||
|
@ -399,6 +285,7 @@ class FilmOut {
|
|||
}
|
||||
catch (err) {
|
||||
this.log.error(err, 'FILMOUT', true, true);
|
||||
;
|
||||
throw err;
|
||||
}
|
||||
this.ui.send('preview_frame', { path, frame: arg.frame });
|
||||
|
@ -422,9 +309,6 @@ class FilmOut {
|
|||
throw err;
|
||||
}
|
||||
try {
|
||||
if (await this.server.displayImage(path)) {
|
||||
return;
|
||||
}
|
||||
await this.display.open();
|
||||
await this.display.show(path);
|
||||
}
|
||||
|
@ -438,9 +322,6 @@ 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();
|
||||
}
|
||||
|
@ -455,9 +336,6 @@ 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);
|
||||
}
|
||||
|
@ -471,9 +349,6 @@ 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();
|
||||
}
|
||||
|
@ -486,9 +361,6 @@ class FilmOut {
|
|||
**/
|
||||
async close(evt, arg) {
|
||||
try {
|
||||
if (await this.server.cmdAll('blank')) {
|
||||
return;
|
||||
}
|
||||
await this.display.hide();
|
||||
await this.display.close();
|
||||
}
|
||||
|
@ -504,6 +376,7 @@ class FilmOut {
|
|||
this.log.info(`Changing the display to ${arg.display}`);
|
||||
}
|
||||
}
|
||||
exports.FilmOut = FilmOut;
|
||||
module.exports = { FilmOut };
|
||||
module.exports = (display, ffmpeg, ffprobe, ui, light) => {
|
||||
return new FilmOut(display, ffmpeg, ffprobe, ui, light);
|
||||
};
|
||||
//# sourceMappingURL=index.js.map
|
File diff suppressed because one or more lines are too long
|
@ -1,9 +0,0 @@
|
|||
<a name="module_lib/frame"></a>
|
||||
|
||||
## lib/frame
|
||||
<a name="module_lib/frame..Frame"></a>
|
||||
|
||||
### lib/frame~Frame
|
||||
Class representing the static Frame module.
|
||||
|
||||
**Kind**: inner class of [<code>lib/frame</code>](#module_lib/frame)
|
|
@ -1,19 +0,0 @@
|
|||
interface RGBA {
|
||||
r: number;
|
||||
g: number;
|
||||
b: number;
|
||||
a: number;
|
||||
}
|
||||
/** @module lib/frame */
|
||||
/**
|
||||
* Class representing the static Frame module.
|
||||
*/
|
||||
export declare 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 type { RGBA };
|
|
@ -3,12 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Frame = void 0;
|
||||
const jimp_1 = __importDefault(require("jimp"));
|
||||
/** @module lib/frame */
|
||||
/**
|
||||
* Class representing the static Frame module.
|
||||
*/
|
||||
class Frame {
|
||||
static async info(imagePath) {
|
||||
let image;
|
||||
|
@ -70,6 +65,6 @@ class Frame {
|
|||
return imagePath;
|
||||
}
|
||||
}
|
||||
exports.Frame = Frame;
|
||||
module.exports = { Frame };
|
||||
exports.default = Frame;
|
||||
module.exports = Frame;
|
||||
//# sourceMappingURL=index.js.map
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/frame/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;;;;AAEb,gDAAwB;AASxB,wBAAwB;AAExB;;GAEG;AAEH,MAAa,KAAK;IACjB,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,sBA+DC;AAED,MAAM,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,CAAA"}
|
||||
{"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,9 +0,0 @@
|
|||
<a name="module_lib/intval"></a>
|
||||
|
||||
## lib/intval
|
||||
<a name="module_lib/intval..Intval"></a>
|
||||
|
||||
### lib/intval~Intval
|
||||
Class representing all intval3 camera features.
|
||||
|
||||
**Kind**: inner class of [<code>lib/intval</code>](#module_lib/intval)
|
|
@ -1,12 +0,0 @@
|
|||
/** @module lib/intval */
|
||||
/**
|
||||
* Class representing all intval3 camera features.
|
||||
*/
|
||||
export declare class Intval {
|
||||
private _baseUrl;
|
||||
constructor(url: string);
|
||||
move(): Promise<number>;
|
||||
setDir(dir: boolean): Promise<number>;
|
||||
setExposure(exposure: number, cb: Function): Promise<number>;
|
||||
connect(cb: Function): void;
|
||||
}
|
|
@ -1,44 +1,15 @@
|
|||
'use strict';
|
||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
var desc = Object.getOwnPropertyDescriptor(m, k);
|
||||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
||||
desc = { enumerable: true, get: function() { return m[k]; } };
|
||||
}
|
||||
Object.defineProperty(o, k2, desc);
|
||||
}) : (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
o[k2] = m[k];
|
||||
}));
|
||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||
}) : function(o, v) {
|
||||
o["default"] = v;
|
||||
});
|
||||
var __importStar = (this && this.__importStar) || function (mod) {
|
||||
if (mod && mod.__esModule) return mod;
|
||||
var result = {};
|
||||
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
||||
__setModuleDefault(result, mod);
|
||||
return result;
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Intval = void 0;
|
||||
const request = __importStar(require("request"));
|
||||
/** @module lib/intval */
|
||||
/**
|
||||
* Class representing all intval3 camera features.
|
||||
*/
|
||||
class Intval {
|
||||
constructor(url) {
|
||||
this._baseUrl = `http://${url}`;
|
||||
this.req = require('request');
|
||||
}
|
||||
async move() {
|
||||
return new Promise((resolve, reject) => {
|
||||
const timeStart = +new Date();
|
||||
const url = `${this._baseUrl}/frame`;
|
||||
//console.log(url)
|
||||
return request(url, (err, res, body) => {
|
||||
return this.req(url, (err, res, body) => {
|
||||
let ms = (+new Date()) - timeStart;
|
||||
if (err) {
|
||||
return reject(err);
|
||||
|
@ -52,7 +23,7 @@ class Intval {
|
|||
const timeStart = +new Date();
|
||||
const url = `${this._baseUrl}/dir?dir=${dir}`;
|
||||
//console.log(url)
|
||||
return request(url, (err, res, body) => {
|
||||
return this.req(url, (err, res, body) => {
|
||||
let ms = (+new Date()) - timeStart;
|
||||
if (err) {
|
||||
return reject(err);
|
||||
|
@ -65,7 +36,8 @@ class Intval {
|
|||
return new Promise((resolve, reject) => {
|
||||
const timeStart = +new Date();
|
||||
const url = `${this._baseUrl}/exposure?exposure=${exposure}`;
|
||||
return request(url, (err, res, body) => {
|
||||
//console.log(url)
|
||||
return this.req(url, (err, res, body) => {
|
||||
let ms = (+new Date()) - timeStart;
|
||||
if (err) {
|
||||
return reject(err);
|
||||
|
@ -82,15 +54,15 @@ class Intval {
|
|||
uri: url,
|
||||
timeout: 5000
|
||||
};
|
||||
request(opts, (err, res, body) => {
|
||||
this.req(opts, (err, res, body) => {
|
||||
let ms = (+new Date()) - timeStart;
|
||||
if (err) {
|
||||
//console.error(err)
|
||||
return cb(err, ms);
|
||||
}
|
||||
cb(null, ms, body);
|
||||
});
|
||||
}
|
||||
}
|
||||
exports.Intval = Intval;
|
||||
module.exports = { Intval };
|
||||
module.exports.Intval = Intval;
|
||||
//# sourceMappingURL=index.js.map
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/intval/index.ts"],"names":[],"mappings":"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"}
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/intval/index.ts"],"names":[],"mappings":"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"}
|
|
@ -1,46 +1,32 @@
|
|||
<a name="module_lib/light"></a>
|
||||
<a name="Light"></a>
|
||||
|
||||
## lib/light
|
||||
## Light
|
||||
**Kind**: global class
|
||||
|
||||
* [lib/light](#module_lib/light)
|
||||
* [~Light](#module_lib/light..Light)
|
||||
* [.init()](#module_lib/light..Light+init)
|
||||
* [.listen()](#module_lib/light..Light+listen)
|
||||
* [.listener()](#module_lib/light..Light+listener)
|
||||
* [.set()](#module_lib/light..Light+set)
|
||||
* [.end()](#module_lib/light..Light+end)
|
||||
* [Light](#Light)
|
||||
* [.init()](#Light+init)
|
||||
* [.listen()](#Light+listen)
|
||||
* [.listener()](#Light+listener)
|
||||
* [.set()](#Light+set)
|
||||
* [.end()](#Light+end)
|
||||
|
||||
<a name="module_lib/light..Light"></a>
|
||||
<a name="Light+init"></a>
|
||||
|
||||
### lib/light~Light
|
||||
Class representing the all light features.
|
||||
### light.init()
|
||||
**Kind**: instance method of [<code>Light</code>](#Light)
|
||||
<a name="Light+listen"></a>
|
||||
|
||||
**Kind**: inner class of [<code>lib/light</code>](#module_lib/light)
|
||||
### light.listen()
|
||||
**Kind**: instance method of [<code>Light</code>](#Light)
|
||||
<a name="Light+listener"></a>
|
||||
|
||||
* [~Light](#module_lib/light..Light)
|
||||
* [.init()](#module_lib/light..Light+init)
|
||||
* [.listen()](#module_lib/light..Light+listen)
|
||||
* [.listener()](#module_lib/light..Light+listener)
|
||||
* [.set()](#module_lib/light..Light+set)
|
||||
* [.end()](#module_lib/light..Light+end)
|
||||
### light.listener()
|
||||
**Kind**: instance method of [<code>Light</code>](#Light)
|
||||
<a name="Light+set"></a>
|
||||
|
||||
<a name="module_lib/light..Light+init"></a>
|
||||
### light.set()
|
||||
**Kind**: instance method of [<code>Light</code>](#Light)
|
||||
<a name="Light+end"></a>
|
||||
|
||||
#### light.init()
|
||||
**Kind**: instance method of [<code>Light</code>](#module_lib/light..Light)
|
||||
<a name="module_lib/light..Light+listen"></a>
|
||||
|
||||
#### light.listen()
|
||||
**Kind**: instance method of [<code>Light</code>](#module_lib/light..Light)
|
||||
<a name="module_lib/light..Light+listener"></a>
|
||||
|
||||
#### light.listener()
|
||||
**Kind**: instance method of [<code>Light</code>](#module_lib/light..Light)
|
||||
<a name="module_lib/light..Light+set"></a>
|
||||
|
||||
#### light.set()
|
||||
**Kind**: instance method of [<code>Light</code>](#module_lib/light..Light)
|
||||
<a name="module_lib/light..Light+end"></a>
|
||||
|
||||
#### light.end()
|
||||
**Kind**: instance method of [<code>Light</code>](#module_lib/light..Light)
|
||||
### light.end()
|
||||
**Kind**: instance method of [<code>Light</code>](#Light)
|
||||
|
|
|
@ -1,45 +0,0 @@
|
|||
import type { Arduino } from 'arduino';
|
||||
import type { Config } from 'cfg';
|
||||
import type { WebContents } from 'electron';
|
||||
interface LightState {
|
||||
color: number[];
|
||||
}
|
||||
/** @module lib/light */
|
||||
/**
|
||||
* Class representing the all light features.
|
||||
*/
|
||||
export declare class Light {
|
||||
state: LightState;
|
||||
private arduino;
|
||||
private cfg;
|
||||
private ui;
|
||||
private log;
|
||||
private ipc;
|
||||
private enabled;
|
||||
private id;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
constructor(arduino: Arduino, cfg: Config, ui: WebContents);
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private init;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private listen;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private listener;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
set(rgb: number[], id: string, on?: boolean): Promise<number>;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private end;
|
||||
}
|
||||
export type { LightState };
|
|
@ -1,20 +1,13 @@
|
|||
'use strict';
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Light = void 0;
|
||||
const electron_1 = require("electron");
|
||||
const delay_1 = require("delay");
|
||||
const log_1 = require("log");
|
||||
/** @module lib/light */
|
||||
/**
|
||||
* Class representing the all light features.
|
||||
*/
|
||||
const Log = require("log");
|
||||
class Light {
|
||||
/**
|
||||
*
|
||||
**/
|
||||
constructor(arduino, cfg, ui) {
|
||||
this.state = { color: [0, 0, 0] };
|
||||
this.ipc = electron_1.ipcMain;
|
||||
this.enabled = true;
|
||||
this.id = 'light';
|
||||
this.arduino = arduino;
|
||||
|
@ -26,14 +19,15 @@ class Light {
|
|||
*
|
||||
**/
|
||||
async init() {
|
||||
this.log = await (0, log_1.Log)({ label: this.id });
|
||||
this.log = await Log({ label: this.id });
|
||||
this.ipc = require('electron').ipcMain;
|
||||
this.listen();
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
listen() {
|
||||
this.ipc.handle(this.id, this.listener.bind(this));
|
||||
this.ipc.on(this.id, this.listener.bind(this));
|
||||
}
|
||||
/**
|
||||
*
|
||||
|
@ -53,6 +47,7 @@ class Light {
|
|||
else if (typeof arg.disable !== 'undefined') {
|
||||
this.enabled = false;
|
||||
}
|
||||
event.returnValue = true;
|
||||
}
|
||||
/**
|
||||
*
|
||||
|
@ -67,34 +62,36 @@ class Light {
|
|||
catch (err) {
|
||||
this.log.error('Error sending light command', err);
|
||||
}
|
||||
await (0, delay_1.delay)(1);
|
||||
await delay_1.delay(1);
|
||||
try {
|
||||
ms += await this.arduino.sendString(this.id, str);
|
||||
this.arduino.string(this.id, str);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error('Error sending light string', err);
|
||||
}
|
||||
await (0, delay_1.delay)(1);
|
||||
ms += 2;
|
||||
await this.end(rgb, id, ms);
|
||||
return ms;
|
||||
await delay_1.delay(1);
|
||||
await ms;
|
||||
return await this.end(rgb, id, ms);
|
||||
}
|
||||
/**
|
||||
*
|
||||
**/
|
||||
async end(rgb, id, ms) {
|
||||
let res;
|
||||
//console.trace()
|
||||
this.log.info(`Light set to ${rgb.join(',')}`, 'LIGHT', true, true);
|
||||
try {
|
||||
//console.dir({ rgb, id, ms })
|
||||
res = await this.ui.send(this.id, { rgb, id, ms });
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(`Error ending light`, err);
|
||||
console.error(err);
|
||||
throw err;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
}
|
||||
exports.Light = Light;
|
||||
module.exports = { Light };
|
||||
module.exports = function (arduino, cfg, ui) {
|
||||
return new Light(arduino, cfg, ui);
|
||||
};
|
||||
//# sourceMappingURL=index.js.map
|
|
@ -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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"}
|
|
@ -1,16 +1,3 @@
|
|||
## Functions
|
||||
|
||||
<dl>
|
||||
<dt><a href="#logFile">logFile()</a> ⇒ <code>string</code></dt>
|
||||
<dd><p>Determine the location of the log file based on the operating system
|
||||
and return as an absolute string from os.homedir()</p>
|
||||
</dd>
|
||||
<dt><a href="#Log">Log(arg)</a> ⇒ <code>object</code></dt>
|
||||
<dd><p>Create and return the logger transport based on settings determined in
|
||||
arguments object</p>
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
<a name="logFile"></a>
|
||||
|
||||
## logFile() ⇒ <code>string</code>
|
||||
|
@ -19,16 +6,3 @@ and return as an absolute string from os.homedir()
|
|||
|
||||
**Kind**: global function
|
||||
**Returns**: <code>string</code> - Path to log file
|
||||
<a name="Log"></a>
|
||||
|
||||
## Log(arg) ⇒ <code>object</code>
|
||||
Create and return the logger transport based on settings determined in
|
||||
arguments object
|
||||
|
||||
**Kind**: global function
|
||||
**Returns**: <code>object</code> - Logger transport
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| arg | <code>object</code> | Arguments from process |
|
||||
|
||||
|
|
|
@ -1,10 +0,0 @@
|
|||
import type { Logger } from 'winston';
|
||||
/**
|
||||
* Create and return the logger transport based on settings determined in
|
||||
* arguments object
|
||||
*
|
||||
* @param {object} arg Arguments from process
|
||||
*
|
||||
* @returns {object} Logger transport
|
||||
**/
|
||||
export declare function Log(arg: any): Promise<Logger>;
|
|
@ -1,11 +1,11 @@
|
|||
'use strict';
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Log = void 0;
|
||||
const winston_1 = require("winston");
|
||||
const path_1 = require("path");
|
||||
const fs_extra_1 = require("fs-extra");
|
||||
const os_1 = require("os");
|
||||
const logTime = 'MM/DD/YY-HH:mm:ss';
|
||||
let transport;
|
||||
/**
|
||||
* Determine the location of the log file based on the operating system
|
||||
* and return as an absolute string from os.homedir()
|
||||
|
@ -13,34 +13,34 @@ const logTime = 'MM/DD/YY-HH:mm:ss';
|
|||
* @returns {string} Path to log file
|
||||
**/
|
||||
async function logFile() {
|
||||
const homeDir = (0, os_1.homedir)();
|
||||
const homeDir = os_1.homedir();
|
||||
const linuxDir = `/.mcopy/`;
|
||||
const macDir = `/Library/Logs/mcopy/`;
|
||||
const winDir = `/AppData/Roaming/mcopy/`;
|
||||
let logPath = (0, path_1.normalize)((0, path_1.join)(homeDir, linuxDir));
|
||||
let logPath = path_1.normalize(path_1.join(homeDir, linuxDir));
|
||||
let dirExists;
|
||||
if (process.platform === 'darwin') {
|
||||
logPath = (0, path_1.normalize)((0, path_1.join)(homeDir, macDir));
|
||||
logPath = path_1.normalize(path_1.join(homeDir, macDir));
|
||||
}
|
||||
else if (process.platform === 'win32') {
|
||||
logPath = (0, path_1.normalize)((0, path_1.join)(homeDir, winDir));
|
||||
logPath = path_1.normalize(path_1.join(homeDir, winDir));
|
||||
}
|
||||
try {
|
||||
dirExists = await (0, fs_extra_1.exists)(logPath);
|
||||
dirExists = await fs_extra_1.exists(logPath);
|
||||
}
|
||||
catch (err) {
|
||||
console.error(err);
|
||||
}
|
||||
if (!dirExists) {
|
||||
try {
|
||||
await (0, fs_extra_1.mkdir)(logPath);
|
||||
await fs_extra_1.mkdir(logPath);
|
||||
}
|
||||
catch (err) {
|
||||
console.error(`Error creating directory for mcopy log file, ${logPath}`);
|
||||
console.error(err);
|
||||
}
|
||||
}
|
||||
return (0, path_1.join)(logPath, 'mcopy.log');
|
||||
return path_1.join(logPath, 'mcopy.log');
|
||||
}
|
||||
/**
|
||||
* Create and return the logger transport based on settings determined in
|
||||
|
@ -50,8 +50,7 @@ async function logFile() {
|
|||
*
|
||||
* @returns {object} Logger transport
|
||||
**/
|
||||
async function Log(arg) {
|
||||
let transport;
|
||||
module.exports = async function (arg) {
|
||||
let consoleFormat = {
|
||||
colorize: true
|
||||
};
|
||||
|
@ -59,21 +58,28 @@ async function Log(arg) {
|
|||
filename: await logFile(),
|
||||
json: true
|
||||
};
|
||||
if (arg && arg.label) {
|
||||
consoleFormat.label = arg.label;
|
||||
fileFormat.label = arg.label;
|
||||
if (arg && arg.quiet) {
|
||||
transport = {
|
||||
info: function () { return false; },
|
||||
warn: function () { return false; },
|
||||
error: function () { return false; }
|
||||
};
|
||||
}
|
||||
else {
|
||||
if (arg && arg.label) {
|
||||
consoleFormat.label = arg.label;
|
||||
fileFormat.label = arg.label;
|
||||
}
|
||||
transport = 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}` : " "))),
|
||||
transports: [
|
||||
new (winston_1.transports.Console)(consoleFormat),
|
||||
new (winston_1.transports.File)(fileFormat)
|
||||
]
|
||||
});
|
||||
}
|
||||
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}` : " "))),
|
||||
transports: [
|
||||
new (winston_1.transports.Console)(consoleFormat),
|
||||
new (winston_1.transports.File)(fileFormat)
|
||||
]
|
||||
});
|
||||
return transport;
|
||||
}
|
||||
exports.Log = Log;
|
||||
module.exports = { Log };
|
||||
};
|
||||
//# sourceMappingURL=index.js.map
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/log/index.ts"],"names":[],"mappings":"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"}
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/log/index.ts"],"names":[],"mappings":"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"}
|
|
@ -3,83 +3,57 @@
|
|||
## lib/mscript
|
||||
|
||||
* [lib/mscript](#module_lib/mscript)
|
||||
* [~Create new Mscript interpreter](#module_lib/mscript..Create new Mscript interpreter)
|
||||
* [~Mscript](#module_lib/mscript..Mscript)
|
||||
* [.clear()](#module_lib/mscript..Mscript+clear)
|
||||
* [.interpret(text, callback)](#module_lib/mscript..Mscript+interpret) ⇒ <code>object</code>
|
||||
* [.variable(line)](#module_lib/mscript..Mscript+variable)
|
||||
* [.variable_replace(line)](#module_lib/mscript..Mscript+variable_replace) ⇒ <code>string</code>
|
||||
* [.basic_cmd(line, short)](#module_lib/mscript..Mscript+basic_cmd)
|
||||
* [.new_loop(line, fade)](#module_lib/mscript..Mscript+new_loop)
|
||||
* [.end_loop(line)](#module_lib/mscript..Mscript+end_loop)
|
||||
* [.move_cam(line)](#module_lib/mscript..Mscript+move_cam)
|
||||
* [.move_cam2(line)](#module_lib/mscript..Mscript+move_cam2)
|
||||
* [.move_proj(line)](#module_lib/mscript..Mscript+move_proj)
|
||||
* [.move_proj2(line)](#module_lib/mscript..Mscript+move_proj2)
|
||||
* [.set_state(line)](#module_lib/mscript..Mscript+set_state)
|
||||
* [.last_loop()](#module_lib/mscript..Mscript+last_loop) ⇒ <code>object</code>
|
||||
* [.parent_loop()](#module_lib/mscript..Mscript+parent_loop) ⇒ <code>object</code>
|
||||
* [.loop_count()](#module_lib/mscript..Mscript+loop_count) ⇒ <code>integer</code>
|
||||
* [.fade(line)](#module_lib/mscript..Mscript+fade)
|
||||
* [.fade_count(str)](#module_lib/mscript..Mscript+fade_count)
|
||||
* [.fade_start(str)](#module_lib/mscript..Mscript+fade_start) ⇒ <code>array</code>
|
||||
* [.fade_end(str)](#module_lib/mscript..Mscript+fade_end) ⇒ <code>array</code>
|
||||
* [.fade_rgb(start, end, len, x)](#module_lib/mscript..Mscript+fade_rgb) ⇒ <code>array</code>
|
||||
* [.rgb(str)](#module_lib/mscript..Mscript+rgb)
|
||||
* [.rgb_str(arr)](#module_lib/mscript..Mscript+rgb_str) ⇒ <code>string</code>
|
||||
* [.update(cmd)](#module_lib/mscript..Mscript+update)
|
||||
* [.str_to_arr(str, cmd)](#module_lib/mscript..Mscript+str_to_arr) ⇒ <code>array</code>
|
||||
* [.light_to_arr(str, cmd)](#module_lib/mscript..Mscript+light_to_arr) ⇒ <code>array</code>
|
||||
* [.light_state(Color)](#module_lib/mscript..Mscript+light_state)
|
||||
* [.delay(line)](#module_lib/mscript..Mscript+delay)
|
||||
* [.alert(line)](#module_lib/mscript..Mscript+alert)
|
||||
* [.pause(line)](#module_lib/mscript..Mscript+pause)
|
||||
* [.fail(msg)](#module_lib/mscript..Mscript+fail)
|
||||
* [.contains(arr, arr2)](#module_lib/mscript..Mscript+contains) ⇒ <code>boolean</code>
|
||||
* [.interpret()](#module_lib/mscript..Mscript+interpret)
|
||||
* [.basic_cmd()](#module_lib/mscript..Mscript+basic_cmd)
|
||||
* [.new_loop()](#module_lib/mscript..Mscript+new_loop)
|
||||
* [.end_loop()](#module_lib/mscript..Mscript+end_loop)
|
||||
* [.move_cam()](#module_lib/mscript..Mscript+move_cam)
|
||||
* [.move_proj()](#module_lib/mscript..Mscript+move_proj)
|
||||
* [.set_state()](#module_lib/mscript..Mscript+set_state)
|
||||
* [.last_loop()](#module_lib/mscript..Mscript+last_loop)
|
||||
* [.parent_loop()](#module_lib/mscript..Mscript+parent_loop)
|
||||
* [.loop_count()](#module_lib/mscript..Mscript+loop_count)
|
||||
* [.fade()](#module_lib/mscript..Mscript+fade)
|
||||
* [.fade_count()](#module_lib/mscript..Mscript+fade_count)
|
||||
* [.fade_start()](#module_lib/mscript..Mscript+fade_start)
|
||||
* [.fade_end()](#module_lib/mscript..Mscript+fade_end)
|
||||
* [.update()](#module_lib/mscript..Mscript+update)
|
||||
* [.str_to_arr()](#module_lib/mscript..Mscript+str_to_arr)
|
||||
* [.light_to_arr()](#module_lib/mscript..Mscript+light_to_arr)
|
||||
* [.light_state()](#module_lib/mscript..Mscript+light_state)
|
||||
* [.fail()](#module_lib/mscript..Mscript+fail)
|
||||
* [~startsWith()](#module_lib/mscript..startsWith)
|
||||
|
||||
<a name="module_lib/mscript..Create new Mscript interpreter"></a>
|
||||
|
||||
### lib/mscript~Create new Mscript interpreter
|
||||
**Kind**: inner class of [<code>lib/mscript</code>](#module_lib/mscript)
|
||||
<a name="module_lib/mscript..Mscript"></a>
|
||||
|
||||
### lib/mscript~Mscript
|
||||
Class representing the mscript language.
|
||||
class Mscript
|
||||
|
||||
**Kind**: inner class of [<code>lib/mscript</code>](#module_lib/mscript)
|
||||
|
||||
* [~Mscript](#module_lib/mscript..Mscript)
|
||||
* [.clear()](#module_lib/mscript..Mscript+clear)
|
||||
* [.interpret(text, callback)](#module_lib/mscript..Mscript+interpret) ⇒ <code>object</code>
|
||||
* [.variable(line)](#module_lib/mscript..Mscript+variable)
|
||||
* [.variable_replace(line)](#module_lib/mscript..Mscript+variable_replace) ⇒ <code>string</code>
|
||||
* [.basic_cmd(line, short)](#module_lib/mscript..Mscript+basic_cmd)
|
||||
* [.new_loop(line, fade)](#module_lib/mscript..Mscript+new_loop)
|
||||
* [.end_loop(line)](#module_lib/mscript..Mscript+end_loop)
|
||||
* [.move_cam(line)](#module_lib/mscript..Mscript+move_cam)
|
||||
* [.move_cam2(line)](#module_lib/mscript..Mscript+move_cam2)
|
||||
* [.move_proj(line)](#module_lib/mscript..Mscript+move_proj)
|
||||
* [.move_proj2(line)](#module_lib/mscript..Mscript+move_proj2)
|
||||
* [.set_state(line)](#module_lib/mscript..Mscript+set_state)
|
||||
* [.last_loop()](#module_lib/mscript..Mscript+last_loop) ⇒ <code>object</code>
|
||||
* [.parent_loop()](#module_lib/mscript..Mscript+parent_loop) ⇒ <code>object</code>
|
||||
* [.loop_count()](#module_lib/mscript..Mscript+loop_count) ⇒ <code>integer</code>
|
||||
* [.fade(line)](#module_lib/mscript..Mscript+fade)
|
||||
* [.fade_count(str)](#module_lib/mscript..Mscript+fade_count)
|
||||
* [.fade_start(str)](#module_lib/mscript..Mscript+fade_start) ⇒ <code>array</code>
|
||||
* [.fade_end(str)](#module_lib/mscript..Mscript+fade_end) ⇒ <code>array</code>
|
||||
* [.fade_rgb(start, end, len, x)](#module_lib/mscript..Mscript+fade_rgb) ⇒ <code>array</code>
|
||||
* [.rgb(str)](#module_lib/mscript..Mscript+rgb)
|
||||
* [.rgb_str(arr)](#module_lib/mscript..Mscript+rgb_str) ⇒ <code>string</code>
|
||||
* [.update(cmd)](#module_lib/mscript..Mscript+update)
|
||||
* [.str_to_arr(str, cmd)](#module_lib/mscript..Mscript+str_to_arr) ⇒ <code>array</code>
|
||||
* [.light_to_arr(str, cmd)](#module_lib/mscript..Mscript+light_to_arr) ⇒ <code>array</code>
|
||||
* [.light_state(Color)](#module_lib/mscript..Mscript+light_state)
|
||||
* [.delay(line)](#module_lib/mscript..Mscript+delay)
|
||||
* [.alert(line)](#module_lib/mscript..Mscript+alert)
|
||||
* [.pause(line)](#module_lib/mscript..Mscript+pause)
|
||||
* [.fail(msg)](#module_lib/mscript..Mscript+fail)
|
||||
* [.contains(arr, arr2)](#module_lib/mscript..Mscript+contains) ⇒ <code>boolean</code>
|
||||
* [.interpret()](#module_lib/mscript..Mscript+interpret)
|
||||
* [.basic_cmd()](#module_lib/mscript..Mscript+basic_cmd)
|
||||
* [.new_loop()](#module_lib/mscript..Mscript+new_loop)
|
||||
* [.end_loop()](#module_lib/mscript..Mscript+end_loop)
|
||||
* [.move_cam()](#module_lib/mscript..Mscript+move_cam)
|
||||
* [.move_proj()](#module_lib/mscript..Mscript+move_proj)
|
||||
* [.set_state()](#module_lib/mscript..Mscript+set_state)
|
||||
* [.last_loop()](#module_lib/mscript..Mscript+last_loop)
|
||||
* [.parent_loop()](#module_lib/mscript..Mscript+parent_loop)
|
||||
* [.loop_count()](#module_lib/mscript..Mscript+loop_count)
|
||||
* [.fade()](#module_lib/mscript..Mscript+fade)
|
||||
* [.fade_count()](#module_lib/mscript..Mscript+fade_count)
|
||||
* [.fade_start()](#module_lib/mscript..Mscript+fade_start)
|
||||
* [.fade_end()](#module_lib/mscript..Mscript+fade_end)
|
||||
* [.update()](#module_lib/mscript..Mscript+update)
|
||||
* [.str_to_arr()](#module_lib/mscript..Mscript+str_to_arr)
|
||||
* [.light_to_arr()](#module_lib/mscript..Mscript+light_to_arr)
|
||||
* [.light_state()](#module_lib/mscript..Mscript+light_state)
|
||||
* [.fail()](#module_lib/mscript..Mscript+fail)
|
||||
|
||||
<a name="module_lib/mscript..Mscript+clear"></a>
|
||||
|
||||
|
@ -89,343 +63,124 @@ Clear the state of the script
|
|||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
<a name="module_lib/mscript..Mscript+interpret"></a>
|
||||
|
||||
#### mscript.interpret(text, callback) ⇒ <code>object</code>
|
||||
#### mscript.interpret()
|
||||
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.
|
||||
of steps to be fed into the mcopy.
|
||||
|
||||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
**Returns**: <code>object</code> - if callback is not provided
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| text | <code>string</code> | Mscript text to interpret |
|
||||
| callback | <code>function</code> | Function to call when string is interpreted |
|
||||
|
||||
<a name="module_lib/mscript..Mscript+variable"></a>
|
||||
|
||||
#### mscript.variable(line)
|
||||
Interprets variables for complex sequence behavior.
|
||||
TODO: Fully implement, add test coverage
|
||||
|
||||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| line | <code>string</code> | Line containing a variable assignment |
|
||||
|
||||
<a name="module_lib/mscript..Mscript+variable_replace"></a>
|
||||
|
||||
#### mscript.variable\_replace(line) ⇒ <code>string</code>
|
||||
Replace variable with value at time of interpretation
|
||||
TODO: Implement this please
|
||||
|
||||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
**Returns**: <code>string</code> - New string to be interpreted
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| line | <code>string</code> | Line containing variable to be replaced with value |
|
||||
|
||||
<a name="module_lib/mscript..Mscript+basic_cmd"></a>
|
||||
|
||||
#### mscript.basic\_cmd(line, short)
|
||||
Interpret a basic two character command
|
||||
#### mscript.basic\_cmd()
|
||||
Apply a basic two character command
|
||||
|
||||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| line | <code>string</code> | Line of script to interpret |
|
||||
| short | <code>string</code> | The short command to use |
|
||||
|
||||
<a name="module_lib/mscript..Mscript+new_loop"></a>
|
||||
|
||||
#### mscript.new\_loop(line, fade)
|
||||
#### mscript.new\_loop()
|
||||
Start a new loop
|
||||
|
||||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| line | <code>string</code> | Line to evaluate as either loop or fade |
|
||||
| fade | <code>boolean</code> | Flag as true if fade |
|
||||
|
||||
<a name="module_lib/mscript..Mscript+end_loop"></a>
|
||||
|
||||
#### mscript.end\_loop(line)
|
||||
#### mscript.end\_loop()
|
||||
Close the most recent loop
|
||||
|
||||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| line | <code>string</code> | Line to interpret |
|
||||
|
||||
<a name="module_lib/mscript..Mscript+move_cam"></a>
|
||||
|
||||
#### mscript.move\_cam(line)
|
||||
#### mscript.move\_cam()
|
||||
Move camera to explicitly-defined frame
|
||||
|
||||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| line | <code>string</code> | Line to interpret with camera move statement |
|
||||
|
||||
<a name="module_lib/mscript..Mscript+move_cam2"></a>
|
||||
|
||||
#### mscript.move\_cam2(line)
|
||||
Move secondary camera to explicitly-defined frame
|
||||
|
||||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| line | <code>string</code> | Line to interpret with camera move statement |
|
||||
|
||||
<a name="module_lib/mscript..Mscript+move_proj"></a>
|
||||
|
||||
#### mscript.move\_proj(line)
|
||||
#### mscript.move\_proj()
|
||||
Move projector to explicitly-defined frame
|
||||
|
||||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| line | <code>string</code> | Line containing `move` statement to interpret |
|
||||
|
||||
<a name="module_lib/mscript..Mscript+move_proj2"></a>
|
||||
|
||||
#### mscript.move\_proj2(line)
|
||||
Move projector to explicitly-defined frame
|
||||
|
||||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| line | <code>string</code> | Line containing `move` statement to interpret |
|
||||
|
||||
<a name="module_lib/mscript..Mscript+set_state"></a>
|
||||
|
||||
#### mscript.set\_state(line)
|
||||
#### mscript.set\_state()
|
||||
Set the state of either the cam or projector
|
||||
|
||||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| line | <code>string</code> | String containing set statement |
|
||||
|
||||
<a name="module_lib/mscript..Mscript+last_loop"></a>
|
||||
|
||||
#### mscript.last\_loop() ⇒ <code>object</code>
|
||||
#### mscript.last\_loop()
|
||||
Return the last loop
|
||||
|
||||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
<a name="module_lib/mscript..Mscript+parent_loop"></a>
|
||||
|
||||
#### mscript.parent\_loop() ⇒ <code>object</code>
|
||||
#### mscript.parent\_loop()
|
||||
Return the second-last loop
|
||||
|
||||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
**Returns**: <code>object</code> - Loop array
|
||||
<a name="module_lib/mscript..Mscript+loop_count"></a>
|
||||
|
||||
#### mscript.loop\_count() ⇒ <code>integer</code>
|
||||
#### mscript.loop\_count()
|
||||
Extract the loop count integer from a LOOP cmd
|
||||
|
||||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
**Returns**: <code>integer</code> - Loop count in string parsed into integer
|
||||
<a name="module_lib/mscript..Mscript+fade"></a>
|
||||
|
||||
#### mscript.fade(line)
|
||||
#### mscript.fade()
|
||||
Execute a fade of frame length, from color to another color
|
||||
|
||||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| line | <code>string</code> | Line containing a fade initiator |
|
||||
|
||||
<a name="module_lib/mscript..Mscript+fade_count"></a>
|
||||
|
||||
#### mscript.fade\_count(str)
|
||||
#### mscript.fade\_count()
|
||||
Extract the fade length integer from a FADE cmd
|
||||
|
||||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| str | <code>string</code> | Line containing the length of fade in frames |
|
||||
|
||||
<a name="module_lib/mscript..Mscript+fade_start"></a>
|
||||
|
||||
#### mscript.fade\_start(str) ⇒ <code>array</code>
|
||||
#### mscript.fade\_start()
|
||||
Extract the start color from a string
|
||||
|
||||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
**Returns**: <code>array</code> - Array containing RGB color values
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| str | <code>string</code> | Line containing the start color value in a fade initiator |
|
||||
|
||||
<a name="module_lib/mscript..Mscript+fade_end"></a>
|
||||
|
||||
#### mscript.fade\_end(str) ⇒ <code>array</code>
|
||||
#### mscript.fade\_end()
|
||||
Extract the end color from a string
|
||||
|
||||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
**Returns**: <code>array</code> - Array containing RGB color values
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| str | <code>string</code> | Line containing the end color value in a fade initiator |
|
||||
|
||||
<a name="module_lib/mscript..Mscript+fade_rgb"></a>
|
||||
|
||||
#### mscript.fade\_rgb(start, end, len, x) ⇒ <code>array</code>
|
||||
Determine the state of a fade at a particular frame in the sequence, x
|
||||
|
||||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
**Returns**: <code>array</code> - Array containing RGB color values
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| start | <code>array</code> | Color the fade starts at |
|
||||
| end | <code>array</code> | Color the fade finishes at |
|
||||
| len | <code>integer</code> | Total length of the fade in frames |
|
||||
| x | <code>integer</code> | Position of the fade to get color value of |
|
||||
|
||||
<a name="module_lib/mscript..Mscript+rgb"></a>
|
||||
|
||||
#### mscript.rgb(str)
|
||||
Parse string into array of RGB color values. 0-255 octet.
|
||||
|
||||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| str | <code>string</code> | String containing only color values as `#,#,#` |
|
||||
|
||||
<a name="module_lib/mscript..Mscript+rgb_str"></a>
|
||||
|
||||
#### mscript.rgb\_str(arr) ⇒ <code>string</code>
|
||||
Cast RGB color values as string
|
||||
|
||||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
**Returns**: <code>string</code> - String of RGB values
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| arr | <code>array</code> | Array to join into string |
|
||||
|
||||
<a name="module_lib/mscript..Mscript+update"></a>
|
||||
|
||||
#### mscript.update(cmd)
|
||||
#### mscript.update()
|
||||
Increase the state of a specific object, such as the camera/projector,
|
||||
by the value defined in val.
|
||||
by the value defined in val
|
||||
|
||||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| cmd | <code>string</code> | String representing command to interpret and update state |
|
||||
|
||||
<a name="module_lib/mscript..Mscript+str_to_arr"></a>
|
||||
|
||||
#### mscript.str\_to\_arr(str, cmd) ⇒ <code>array</code>
|
||||
Split string on command, turn into array of commands
|
||||
as long as count variable. Default 1.
|
||||
#### mscript.str\_to\_arr()
|
||||
Split string on command, extract any integers from string
|
||||
|
||||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
**Returns**: <code>array</code> - Array containing commands
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| str | <code>string</code> | String to split |
|
||||
| cmd | <code>string</code> | String representing command to split at |
|
||||
|
||||
<a name="module_lib/mscript..Mscript+light_to_arr"></a>
|
||||
|
||||
#### mscript.light\_to\_arr(str, cmd) ⇒ <code>array</code>
|
||||
#### mscript.light\_to\_arr()
|
||||
Split a string on a command to extract data for light array
|
||||
|
||||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
**Returns**: <code>array</code> - An RGB array containing the color values
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| str | <code>string</code> | String containing light command |
|
||||
| cmd | <code>string</code> | String representing command |
|
||||
|
||||
<a name="module_lib/mscript..Mscript+light_state"></a>
|
||||
|
||||
#### mscript.light\_state(Color)
|
||||
#### mscript.light\_state()
|
||||
Split a string to extract an rgb color value
|
||||
|
||||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| Color | <code>string</code> | string assign to color property |
|
||||
|
||||
<a name="module_lib/mscript..Mscript+delay"></a>
|
||||
|
||||
#### mscript.delay(line)
|
||||
Interpret a delay command
|
||||
|
||||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| line | <code>string</code> | String containing delay command |
|
||||
|
||||
<a name="module_lib/mscript..Mscript+alert"></a>
|
||||
|
||||
#### mscript.alert(line)
|
||||
Interpret an alert command
|
||||
|
||||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| line | <code>string</code> | String containing alert message |
|
||||
|
||||
<a name="module_lib/mscript..Mscript+pause"></a>
|
||||
|
||||
#### mscript.pause(line)
|
||||
Interpret an pause command
|
||||
|
||||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| line | <code>string</code> | String containing alert message |
|
||||
|
||||
<a name="module_lib/mscript..Mscript+fail"></a>
|
||||
|
||||
#### mscript.fail(msg)
|
||||
#### mscript.fail()
|
||||
Throw an error with specific message
|
||||
|
||||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
<a name="module_lib/mscript..startsWith"></a>
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| msg | <code>string</code> | Error message to print |
|
||||
|
||||
<a name="module_lib/mscript..Mscript+contains"></a>
|
||||
|
||||
#### mscript.contains(arr, arr2) ⇒ <code>boolean</code>
|
||||
Determine if array contains matching elements of
|
||||
another array
|
||||
|
||||
**Kind**: instance method of [<code>Mscript</code>](#module_lib/mscript..Mscript)
|
||||
**Returns**: <code>boolean</code> - Whether arr contains elements in arr2
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| arr | <code>Array</code> | Original array to compare |
|
||||
| arr2 | <code>Array</code> | Array to compare elements from |
|
||||
### lib/mscript~startsWith()
|
||||
startswith function from lodash, do not want the entire lib for this
|
||||
|
||||
**Kind**: inner method of [<code>lib/mscript</code>](#module_lib/mscript)
|
||||
|
|
|
@ -1,260 +0,0 @@
|
|||
interface MscriptOutput {
|
||||
success: boolean;
|
||||
arr: string[];
|
||||
meta: string[];
|
||||
cam: number;
|
||||
proj: number;
|
||||
cam2?: number;
|
||||
proj2?: number;
|
||||
}
|
||||
interface RGB extends Array<number> {
|
||||
[index: number]: number;
|
||||
}
|
||||
/** @module lib/mscript */
|
||||
/**
|
||||
* Class representing the mscript language.
|
||||
*/
|
||||
export default class Mscript {
|
||||
private output;
|
||||
private lines;
|
||||
private cam;
|
||||
private cam2;
|
||||
private proj;
|
||||
private proj2;
|
||||
private color;
|
||||
private loops;
|
||||
private rec;
|
||||
private two;
|
||||
private three;
|
||||
private four;
|
||||
private arr;
|
||||
private meta;
|
||||
private target;
|
||||
private dist;
|
||||
private variables;
|
||||
/**
|
||||
* @constructor
|
||||
* Create new Mscript interpreter
|
||||
**/
|
||||
constructor();
|
||||
/**
|
||||
* Clear the state of the script
|
||||
*/
|
||||
private clear;
|
||||
/**
|
||||
* 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): void | MscriptOutput;
|
||||
/**
|
||||
* Interprets variables for complex sequence behavior.
|
||||
* TODO: Fully implement, add test coverage
|
||||
*
|
||||
* @param {string} line Line containing a variable assignment
|
||||
*
|
||||
**/
|
||||
private variable;
|
||||
/**
|
||||
* 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
|
||||
**/
|
||||
private variable_replace;
|
||||
/**
|
||||
* Interpret a basic two character command
|
||||
*
|
||||
* @param {string} line Line of script to interpret
|
||||
* @param {string} short The short command to use
|
||||
*/
|
||||
private basic_cmd;
|
||||
/**
|
||||
* Start a new loop
|
||||
*
|
||||
* @param {string} line Line to evaluate as either loop or fade
|
||||
* @param {boolean} fade Flag as true if fade
|
||||
*/
|
||||
private new_loop;
|
||||
/**
|
||||
* Close the most recent loop
|
||||
*
|
||||
* @param {string} line Line to interpret
|
||||
*/
|
||||
private end_loop;
|
||||
/**
|
||||
* Move camera to explicitly-defined frame
|
||||
*
|
||||
* @param {string} line Line to interpret with camera move statement
|
||||
*/
|
||||
private move_cam;
|
||||
/**
|
||||
* Move secondary camera to explicitly-defined frame
|
||||
*
|
||||
* @param {string} line Line to interpret with camera move statement
|
||||
*/
|
||||
private move_cam2;
|
||||
/**
|
||||
* Move projector to explicitly-defined frame
|
||||
*
|
||||
* @param {string} line Line containing `move` statement to interpret
|
||||
*/
|
||||
private move_proj;
|
||||
/**
|
||||
* Move projector to explicitly-defined frame
|
||||
*
|
||||
* @param {string} line Line containing `move` statement to interpret
|
||||
*/
|
||||
private move_proj2;
|
||||
/**
|
||||
* Set the state of either the cam or projector
|
||||
*
|
||||
* @param line {string} String containing set statement
|
||||
*/
|
||||
private set_state;
|
||||
/**
|
||||
* Return the last loop
|
||||
*
|
||||
* @returns {object}
|
||||
*/
|
||||
private last_loop;
|
||||
/**
|
||||
* Return the second-last loop
|
||||
*
|
||||
* @returns {object} Loop array
|
||||
*/
|
||||
private parent_loop;
|
||||
/**
|
||||
* Extract the loop count integer from a LOOP cmd
|
||||
*
|
||||
* @returns {integer} Loop count in string parsed into integer
|
||||
*/
|
||||
private loop_count;
|
||||
/**
|
||||
* Execute a fade of frame length, from color to another color
|
||||
*
|
||||
* @param {string} line Line containing a fade initiator
|
||||
*/
|
||||
private fade;
|
||||
/**
|
||||
* Extract the fade length integer from a FADE cmd
|
||||
*
|
||||
* @param {string} str Line containing the length of fade in frames
|
||||
*/
|
||||
private fade_count;
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
private fade_start;
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
private fade_end;
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
private fade_rgb;
|
||||
/**
|
||||
* Parse string into array of RGB color values. 0-255 octet.
|
||||
*
|
||||
* @param {string} str String containing only color values as `#,#,#`
|
||||
**/
|
||||
private rgb;
|
||||
/**
|
||||
* Cast RGB color values as string
|
||||
*
|
||||
* @param {array} arr Array to join into string
|
||||
*
|
||||
* @returns {string} String of RGB values
|
||||
**/
|
||||
private rgb_str;
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
private update;
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
private str_to_arr;
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
private light_to_arr;
|
||||
/**
|
||||
* Split a string to extract an rgb color value
|
||||
*
|
||||
* @param {string} Color string assign to color property
|
||||
*/
|
||||
private light_state;
|
||||
/**
|
||||
* Interpret a delay command
|
||||
*
|
||||
* @param {string} line String containing delay command
|
||||
**/
|
||||
private delay;
|
||||
/**
|
||||
* Interpret an alert command
|
||||
*
|
||||
* @param {string} line String containing alert message
|
||||
**/
|
||||
private alert;
|
||||
/**
|
||||
* Interpret an pause command
|
||||
*
|
||||
* @param {string} line String containing alert message
|
||||
**/
|
||||
private pause;
|
||||
/**
|
||||
* Throw an error with specific message
|
||||
*
|
||||
* @param {string} msg Error message to print
|
||||
*/
|
||||
private fail;
|
||||
/**
|
||||
* 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
|
||||
**/
|
||||
private contains;
|
||||
}
|
||||
export type { RGB };
|
|
@ -1,5 +1,4 @@
|
|||
'use strict';
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const BLACK = '0,0,0';
|
||||
const WHITE = '255,255,255';
|
||||
const CMD = [
|
||||
|
@ -8,35 +7,7 @@ const CMD = [
|
|||
'BF',
|
||||
'CB',
|
||||
'PB',
|
||||
'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'
|
||||
'BB'
|
||||
];
|
||||
const ALTS = {
|
||||
'CF': ['CAMERA FORWARD', 'CAM FORWARD'],
|
||||
|
@ -46,40 +17,38 @@ const ALTS = {
|
|||
'PB': ['PROJECTOR FORWARD', 'PROJ FORWARD', 'PROJECTOR BACK', 'PROJ BACK'],
|
||||
'BB': ['BLACK BACKWARD', 'BLACK BACK', 'BLANK BACK'],
|
||||
'L ': ['LIGHT', 'COLOR', 'LAMP'],
|
||||
'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': []
|
||||
'F ': ['FADE']
|
||||
};
|
||||
const DELAY = 'DELAY';
|
||||
const PAUSE = 'PAUSE';
|
||||
const ALERT = 'ALERT';
|
||||
/** @module lib/mscript */
|
||||
/**
|
||||
* Class representing the mscript language.
|
||||
*/
|
||||
/** helper functions */
|
||||
/** startswith function from lodash, do not want the entire lib for this
|
||||
* @param str {string} Text to evaluate
|
||||
* @param target {string} Text to compare string against
|
||||
* @param position {integer} Position in the string to make comparison at
|
||||
*
|
||||
* @returns {boolean} True for match, false for no match
|
||||
**/
|
||||
function startsWith(str, target, position) {
|
||||
const { length } = str;
|
||||
position = position == null ? 0 : position;
|
||||
if (position < 0) {
|
||||
position = 0;
|
||||
}
|
||||
else if (position > length) {
|
||||
position = length;
|
||||
}
|
||||
target = `${target}`;
|
||||
return str.slice(position, position + target.length) == target;
|
||||
}
|
||||
/** class Mscript */
|
||||
class Mscript {
|
||||
/**
|
||||
* @constructor
|
||||
* Create new Mscript interpreter
|
||||
**/
|
||||
constructor() {
|
||||
this.output = {
|
||||
success: false,
|
||||
arr: [],
|
||||
meta: [],
|
||||
cam: 0,
|
||||
proj: 0
|
||||
};
|
||||
this.output = {};
|
||||
}
|
||||
/**
|
||||
* Clear the state of the script
|
||||
|
@ -87,27 +56,17 @@ 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 #
|
||||
this.dist = 0;
|
||||
this.variables = {};
|
||||
this.output = {
|
||||
success: false,
|
||||
arr: [],
|
||||
meta: [],
|
||||
cam: 0,
|
||||
proj: 0
|
||||
};
|
||||
this.output = {};
|
||||
}
|
||||
/**
|
||||
* Main function, accepts multi-line string, parses into lines
|
||||
|
@ -119,88 +78,76 @@ class Mscript {
|
|||
*
|
||||
* @returns {object} if callback is not provided
|
||||
*/
|
||||
interpret(text) {
|
||||
interpret(text, callback) {
|
||||
this.clear();
|
||||
if (typeof text === 'undefined') {
|
||||
return this.fail('No input');
|
||||
}
|
||||
//split string into lines, each containing a command
|
||||
this.lines = text.split('\n');
|
||||
this.lines = this.lines.map((line) => {
|
||||
line = line.replace(/\t+/g, ' '); //strip tabs
|
||||
this.lines = this.lines.map(line => {
|
||||
line = line.replace(/\t+/g, ''); //strip tabs
|
||||
line = line.trim(); //remove excess whitespace before and after command
|
||||
line = line.toUpperCase();
|
||||
return line;
|
||||
});
|
||||
for (let line of this.lines) {
|
||||
this.two = line.substring(0, 2);
|
||||
this.three = line.substring(0, 3);
|
||||
this.four = line.substring(0, 4);
|
||||
if (CMD.indexOf(this.four) !== -1) {
|
||||
this.basic_cmd(line, this.four);
|
||||
if (CMD.indexOf(this.two) !== -1) {
|
||||
this.basic_cmd(line);
|
||||
}
|
||||
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 (line.startsWith(DELAY)) {
|
||||
this.delay(line);
|
||||
}
|
||||
else if (line.startsWith(PAUSE)) {
|
||||
else if (startsWith(line, PAUSE)) {
|
||||
this.pause(line);
|
||||
}
|
||||
else if (line.startsWith(ALERT)) {
|
||||
else if (startsWith(line, ALERT)) {
|
||||
this.alert(line);
|
||||
}
|
||||
else if (line.startsWith('@') || line.indexOf('@') !== -1) {
|
||||
else if (startsWith(line, '@') || line.indexOf('@') !== -1) {
|
||||
this.variable(line);
|
||||
}
|
||||
else if (line.startsWith('LOOP')) {
|
||||
else if (startsWith(line, 'LOOP')) {
|
||||
this.new_loop(line);
|
||||
}
|
||||
else if (line.startsWith('L ')) {
|
||||
else if (startsWith(line, 'L ')) {
|
||||
this.light_state(line);
|
||||
}
|
||||
else if (line.startsWith('F ')) {
|
||||
else if (startsWith(line, 'F ')) {
|
||||
this.new_loop(line, true);
|
||||
}
|
||||
else if (line.startsWith('END')) {
|
||||
else if (startsWith(line, 'END')) {
|
||||
this.end_loop(line);
|
||||
}
|
||||
else if (line.startsWith('CAM2')) { //directly go to that frame
|
||||
this.move_cam2(line);
|
||||
}
|
||||
else if (line.startsWith('CAM')) { //directly go to that frame
|
||||
else if (startsWith(line, 'CAM')) { //directly go to that frame (black?)
|
||||
this.move_cam(line);
|
||||
}
|
||||
else if (line.startsWith('PROJ2')) { //directly go to that frame
|
||||
this.move_proj2(line);
|
||||
}
|
||||
else if (line.startsWith('PROJ')) { //directly go to that frame
|
||||
else if (startsWith(line, 'PROJ')) { //directly go to that frame
|
||||
this.move_proj(line);
|
||||
}
|
||||
else if (line.startsWith('SET')) { //set that state
|
||||
else if (startsWith(line, 'SET')) { //set that state
|
||||
this.set_state(line);
|
||||
}
|
||||
else if (line.startsWith('#') || line.startsWith('//')) {
|
||||
else if (startsWith(line, '#') || startsWith(line, '//')) {
|
||||
//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 (this.contains(this.arr, CAMERA_SECONDARY)) {
|
||||
this.output.cam2 = this.cam2;
|
||||
if (typeof callback !== 'undefined') {
|
||||
//should only be invoked by running mscript.tests()
|
||||
callback(this.output);
|
||||
}
|
||||
if (this.contains(this.arr, PROJECTOR_SECONDARY)) {
|
||||
this.output.proj2 = this.proj2;
|
||||
else {
|
||||
return this.output;
|
||||
}
|
||||
return this.output;
|
||||
}
|
||||
/**
|
||||
* Interprets variables for complex sequence behavior.
|
||||
|
@ -214,7 +161,6 @@ class Mscript {
|
|||
let key = parts[0];
|
||||
let value = parts[1];
|
||||
let update = false;
|
||||
let num;
|
||||
if (value && value.indexOf('#') !== -1) {
|
||||
value = value.split('#')[0];
|
||||
}
|
||||
|
@ -230,7 +176,7 @@ class Mscript {
|
|||
}
|
||||
if (line.indexOf(',') === -1) { //if not color string
|
||||
try {
|
||||
num = parseInt(value);
|
||||
value = parseInt(value);
|
||||
}
|
||||
catch (err) {
|
||||
//supress parsing error
|
||||
|
@ -238,7 +184,7 @@ class Mscript {
|
|||
}
|
||||
//console.dir(parts)
|
||||
if (!this.variables[key] || update) {
|
||||
this.variables[key] = num;
|
||||
this.variables[key] = value;
|
||||
}
|
||||
//console.dir(this.variables)
|
||||
}
|
||||
|
@ -257,26 +203,25 @@ 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, short) {
|
||||
basic_cmd(line) {
|
||||
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, short));
|
||||
.push.apply(this.loops[this.rec].arr, this.str_to_arr(line, this.two));
|
||||
this.loops[this.rec].meta
|
||||
.push.apply(this.loops[this.rec].meta, this.light_to_arr(line, short));
|
||||
.push.apply(this.loops[this.rec].meta, this.light_to_arr(line, this.two));
|
||||
}
|
||||
else {
|
||||
this.arr.push.apply(this.arr, this.str_to_arr(line, short));
|
||||
this.meta.push.apply(this.meta, this.light_to_arr(line, short));
|
||||
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));
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Start a new loop
|
||||
*
|
||||
* @param {string} line Line to evaluate as either loop or fade
|
||||
* @param {boolean} fade Flag as true if fade
|
||||
* @param {boolean} fade Flag as boolean if true
|
||||
*/
|
||||
new_loop(line, fade) {
|
||||
this.rec++;
|
||||
|
@ -285,8 +230,6 @@ class Mscript {
|
|||
meta: [],
|
||||
cam: 0,
|
||||
proj: 0,
|
||||
cam2: 0,
|
||||
proj2: 0,
|
||||
cmd: line + ''
|
||||
};
|
||||
if (fade) {
|
||||
|
@ -309,7 +252,7 @@ class Mscript {
|
|||
start = this.loops[this.rec].start;
|
||||
end = this.loops[this.rec].end;
|
||||
len = this.loops[this.rec].fade_len;
|
||||
meta_arr = meta_arr.map((l) => {
|
||||
meta_arr = meta_arr.map(l => {
|
||||
return this.fade_rgb(start, end, len, x);
|
||||
});
|
||||
}
|
||||
|
@ -372,50 +315,6 @@ 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
|
||||
*
|
||||
|
@ -460,66 +359,16 @@ 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 (line.startsWith('SET CAM2')) {
|
||||
parseInt(line.split('SET CAM2')[1]);
|
||||
}
|
||||
else if (line.startsWith('SET PROJ2')) {
|
||||
this.cam2 = parseInt(line.split('SET PROJ2')[1]);
|
||||
}
|
||||
else if (line.startsWith('SET CAM')) {
|
||||
if (startsWith(line, 'SET CAM')) {
|
||||
this.cam = parseInt(line.split('SET CAM')[1]);
|
||||
}
|
||||
else if (line.startsWith('SET PROJ')) {
|
||||
else if (startsWith(line, 'SET PROJ')) {
|
||||
this.proj = parseInt(line.split('SET PROJ')[1]);
|
||||
}
|
||||
}
|
||||
|
@ -553,9 +402,9 @@ class Mscript {
|
|||
* @param {string} line Line containing a fade initiator
|
||||
*/
|
||||
fade(line) {
|
||||
const len = this.fade_count(line);
|
||||
const start = this.fade_start(line);
|
||||
const end = this.fade_end(line);
|
||||
let len = this.fade_count(line);
|
||||
let start = this.fade_start(line);
|
||||
let end = this.fade_end(line);
|
||||
this.loops[this.rec].start = start;
|
||||
this.loops[this.rec].end = end;
|
||||
this.loops[this.rec].fade = true;
|
||||
|
@ -589,7 +438,7 @@ class Mscript {
|
|||
* @returns {array} Array containing RGB color values
|
||||
*/
|
||||
fade_end(str) {
|
||||
const color = str.split(' ')[3];
|
||||
let color = str.split(' ')[3];
|
||||
return this.rgb(color.trim());
|
||||
}
|
||||
/**
|
||||
|
@ -626,7 +475,7 @@ class Mscript {
|
|||
* @param {string} str String containing only color values as `#,#,#`
|
||||
**/
|
||||
rgb(str) {
|
||||
const rgb = str.split(',');
|
||||
let rgb = str.split(',');
|
||||
return rgb.map((char) => {
|
||||
return parseInt(char);
|
||||
});
|
||||
|
@ -654,14 +503,10 @@ class Mscript {
|
|||
if (this.rec === 0) {
|
||||
this.cam += this.loops[this.rec].cam;
|
||||
this.proj += this.loops[this.rec].proj;
|
||||
this.cam2 += this.loops[this.rec].cam2;
|
||||
this.proj2 += this.loops[this.rec].proj2;
|
||||
}
|
||||
else if (this.rec >= 1) {
|
||||
this.loops[this.rec - 1].cam += this.loops[this.rec].cam;
|
||||
this.loops[this.rec - 1].proj += this.loops[this.rec].proj;
|
||||
this.loops[this.rec - 1].cam2 += this.loops[this.rec].cam2;
|
||||
this.loops[this.rec - 1].proj2 += this.loops[this.rec].proj2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -678,7 +523,7 @@ class Mscript {
|
|||
this.cam -= val;
|
||||
}
|
||||
else {
|
||||
this.loops[this.rec].cam -= val;
|
||||
this.loops[this.rec].cam--;
|
||||
}
|
||||
}
|
||||
else if (cmd === 'PF') {
|
||||
|
@ -694,7 +539,7 @@ class Mscript {
|
|||
this.proj -= val;
|
||||
}
|
||||
else {
|
||||
this.loops[this.rec].proj -= val;
|
||||
this.loops[this.rec].proj--;
|
||||
}
|
||||
}
|
||||
else if (cmd === 'BF') {
|
||||
|
@ -713,118 +558,6 @@ 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 ') {
|
||||
}
|
||||
}
|
||||
|
@ -895,11 +628,11 @@ class Mscript {
|
|||
this.color = color;
|
||||
}
|
||||
/**
|
||||
* Interpret a delay command
|
||||
* Interpret a pause command
|
||||
*
|
||||
* @param {string} line String containing delay command
|
||||
* @param {string} line String containing pause command
|
||||
**/
|
||||
delay(line) {
|
||||
pause(line) {
|
||||
let lenStr = line.split(' ')[1] || '';
|
||||
let len;
|
||||
lenStr = lenStr.trim();
|
||||
|
@ -916,42 +649,23 @@ class Mscript {
|
|||
if (this.rec !== -1) {
|
||||
//hold generated arr in state loop array
|
||||
this.loops[this.rec].arr
|
||||
.push('DE');
|
||||
.push('PA');
|
||||
this.loops[this.rec].meta
|
||||
.push(lenStr);
|
||||
}
|
||||
else {
|
||||
this.arr.push('DE');
|
||||
this.arr.push('AL');
|
||||
this.meta.push(lenStr);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Interpret an alert command
|
||||
*
|
||||
* @param {string} line String containing alert message
|
||||
* @param {string} line String containing pause command
|
||||
**/
|
||||
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
|
||||
|
@ -972,19 +686,6 @@ 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
|
@ -1,9 +0,0 @@
|
|||
<a name="module_lib/processing"></a>
|
||||
|
||||
## lib/processing
|
||||
<a name="module_lib/processing..Processing"></a>
|
||||
|
||||
### lib/processing~Processing
|
||||
Class representing all Processing camera features.
|
||||
|
||||
**Kind**: inner class of [<code>lib/processing</code>](#module_lib/processing)
|
|
@ -1,10 +0,0 @@
|
|||
/** @module lib/processing */
|
||||
/**
|
||||
* Class representing all Processing camera features.
|
||||
*/
|
||||
export declare class Processing {
|
||||
private _baseUrl;
|
||||
constructor(url: string);
|
||||
move(): Promise<number>;
|
||||
setDir(dir: boolean): Promise<number>;
|
||||
}
|
|
@ -1,39 +0,0 @@
|
|||
'use strict';
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Processing = void 0;
|
||||
const exec_1 = require("exec");
|
||||
/** @module lib/processing */
|
||||
/**
|
||||
* Class representing all Processing camera features.
|
||||
*/
|
||||
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);
|
||||
});
|
||||
}
|
||||
}
|
||||
exports.Processing = Processing;
|
||||
module.exports = { Processing };
|
||||
//# sourceMappingURL=index.js.map
|
|
@ -1 +0,0 @@
|
|||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/processing/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;;;AAEZ,+BAA4B;AAG5B,6BAA6B;AAE7B;;GAEG;AACH,MAAa,UAAU;IAEtB,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,OAAkB,EAAE,MAAiB,EAAE,EAAE;YACnE,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,GAAgB,CAAA;YACpB,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,OAAkB,EAAE,MAAiB,EAAE,EAAE;YAC7D,OAAO,OAAO,CAAC,CAAC,CAAC,CAAA;QAClB,CAAC,CAAC,CAAA;IACH,CAAC;CACD;AA5BD,gCA4BC;AAED,MAAM,CAAC,OAAO,GAAG,EAAE,UAAU,EAAE,CAAA"}
|
|
@ -1,52 +1,37 @@
|
|||
<a name="module_lib/proj"></a>
|
||||
<a name="Projector"></a>
|
||||
|
||||
## lib/proj
|
||||
## Projector
|
||||
**Kind**: global class
|
||||
|
||||
* [lib/proj](#module_lib/proj)
|
||||
* [~Projector](#module_lib/proj..Projector)
|
||||
* [.init()](#module_lib/proj..Projector+init)
|
||||
* [.listen()](#module_lib/proj..Projector+listen)
|
||||
* [.set()](#module_lib/proj..Projector+set)
|
||||
* [.move()](#module_lib/proj..Projector+move)
|
||||
* [.listener()](#module_lib/proj..Projector+listener)
|
||||
* [.end()](#module_lib/proj..Projector+end)
|
||||
* [Projector](#Projector)
|
||||
* [.init()](#Projector+init)
|
||||
* [.listen()](#Projector+listen)
|
||||
* [.set()](#Projector+set)
|
||||
* [.move()](#Projector+move)
|
||||
* [.listener()](#Projector+listener)
|
||||
* [.end()](#Projector+end)
|
||||
|
||||
<a name="module_lib/proj..Projector"></a>
|
||||
<a name="Projector+init"></a>
|
||||
|
||||
### lib/proj~Projector
|
||||
Class representing all projector features.
|
||||
### projector.init()
|
||||
**Kind**: instance method of [<code>Projector</code>](#Projector)
|
||||
<a name="Projector+listen"></a>
|
||||
|
||||
**Kind**: inner class of [<code>lib/proj</code>](#module_lib/proj)
|
||||
### projector.listen()
|
||||
**Kind**: instance method of [<code>Projector</code>](#Projector)
|
||||
<a name="Projector+set"></a>
|
||||
|
||||
* [~Projector](#module_lib/proj..Projector)
|
||||
* [.init()](#module_lib/proj..Projector+init)
|
||||
* [.listen()](#module_lib/proj..Projector+listen)
|
||||
* [.set()](#module_lib/proj..Projector+set)
|
||||
* [.move()](#module_lib/proj..Projector+move)
|
||||
* [.listener()](#module_lib/proj..Projector+listener)
|
||||
* [.end()](#module_lib/proj..Projector+end)
|
||||
### projector.set()
|
||||
**Kind**: instance method of [<code>Projector</code>](#Projector)
|
||||
<a name="Projector+move"></a>
|
||||
|
||||
<a name="module_lib/proj..Projector+init"></a>
|
||||
### projector.move()
|
||||
**Kind**: instance method of [<code>Projector</code>](#Projector)
|
||||
<a name="Projector+listener"></a>
|
||||
|
||||
#### projector.init()
|
||||
**Kind**: instance method of [<code>Projector</code>](#module_lib/proj..Projector)
|
||||
<a name="module_lib/proj..Projector+listen"></a>
|
||||
### projector.listener()
|
||||
**Kind**: instance method of [<code>Projector</code>](#Projector)
|
||||
<a name="Projector+end"></a>
|
||||
|
||||
#### projector.listen()
|
||||
**Kind**: instance method of [<code>Projector</code>](#module_lib/proj..Projector)
|
||||
<a name="module_lib/proj..Projector+set"></a>
|
||||
|
||||
#### projector.set()
|
||||
**Kind**: instance method of [<code>Projector</code>](#module_lib/proj..Projector)
|
||||
<a name="module_lib/proj..Projector+move"></a>
|
||||
|
||||
#### projector.move()
|
||||
**Kind**: instance method of [<code>Projector</code>](#module_lib/proj..Projector)
|
||||
<a name="module_lib/proj..Projector+listener"></a>
|
||||
|
||||
#### projector.listener()
|
||||
**Kind**: instance method of [<code>Projector</code>](#module_lib/proj..Projector)
|
||||
<a name="module_lib/proj..Projector+end"></a>
|
||||
|
||||
#### projector.end()
|
||||
**Kind**: instance method of [<code>Projector</code>](#module_lib/proj..Projector)
|
||||
### projector.end()
|
||||
**Kind**: instance method of [<code>Projector</code>](#Projector)
|
||||
|
|
|
@ -1,53 +0,0 @@
|
|||
/** class representing the Projector features **/
|
||||
import type { Arduino } from 'arduino';
|
||||
import type { FilmOut } from 'filmout';
|
||||
import type { Config } from 'cfg';
|
||||
import type { WebContents } from 'electron';
|
||||
interface ProjectorState {
|
||||
pos: number;
|
||||
dir: boolean;
|
||||
}
|
||||
/** @module lib/proj */
|
||||
/**
|
||||
* Class representing all projector features.
|
||||
*/
|
||||
export declare class Projector {
|
||||
state: ProjectorState;
|
||||
arduino: Arduino;
|
||||
private log;
|
||||
private cfg;
|
||||
private ui;
|
||||
private ipc;
|
||||
filmout: FilmOut;
|
||||
private id;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
constructor(arduino: Arduino, cfg: Config, ui: WebContents, filmout: FilmOut, second?: boolean);
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private init;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private listen;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
set(dir: boolean, id: string): Promise<number>;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
move(id: string): Promise<number>;
|
||||
both(id: string): Promise<number>;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
private listener;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
end(cmd: string, id: string, ms: number): Promise<number>;
|
||||
}
|
||||
export type { ProjectorState };
|
|
@ -1,13 +1,7 @@
|
|||
"use strict";
|
||||
/** class representing the Projector features **/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Projector = void 0;
|
||||
const electron_1 = require("electron");
|
||||
const log_1 = require("log");
|
||||
/** @module lib/proj */
|
||||
/**
|
||||
* Class representing all projector features.
|
||||
*/
|
||||
const Log = require("log");
|
||||
class Projector {
|
||||
/**
|
||||
*
|
||||
|
@ -18,7 +12,6 @@ class Projector {
|
|||
dir: true
|
||||
};
|
||||
this.arduino = null;
|
||||
this.ipc = electron_1.ipcMain;
|
||||
this.id = 'projector';
|
||||
this.arduino = arduino;
|
||||
this.cfg = cfg;
|
||||
|
@ -32,7 +25,8 @@ class Projector {
|
|||
*
|
||||
**/
|
||||
async init() {
|
||||
this.log = await (0, log_1.Log)({ label: this.id });
|
||||
this.log = await Log({ label: this.id });
|
||||
this.ipc = require('electron').ipcMain;
|
||||
this.listen();
|
||||
}
|
||||
/**
|
||||
|
@ -62,7 +56,7 @@ class Projector {
|
|||
ms = await this.arduino.send(this.id, cmd);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(`Error setting ${this.id} direction: ${id}`, err);
|
||||
this.log.error(`Error setting ${this.id} direction`, err);
|
||||
}
|
||||
}
|
||||
return await this.end(cmd, id, ms);
|
||||
|
@ -70,7 +64,7 @@ class Projector {
|
|||
/**
|
||||
*
|
||||
**/
|
||||
async move(id) {
|
||||
async move(frame, id) {
|
||||
const cmd = this.cfg.arduino.cmd[this.id];
|
||||
let ms;
|
||||
if (this.filmout.state.enabled) {
|
||||
|
@ -86,20 +80,20 @@ class Projector {
|
|||
ms = await this.arduino.send(this.id, cmd);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(`Error moving ${this.id}: ${id}`, err);
|
||||
this.log.error(`Error moving ${this.id}`, err);
|
||||
}
|
||||
}
|
||||
//this.log.info('Projector move time', { ms });
|
||||
return await this.end(cmd, id, ms);
|
||||
}
|
||||
async both(id) {
|
||||
async both(frame, id) {
|
||||
const cmd = this.cfg.arduino.cmd[this.id + 's'];
|
||||
let ms;
|
||||
try {
|
||||
ms = await this.arduino.send(this.id, cmd);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(`Error moving ${this.id}: ${id}`, err);
|
||||
this.log.error(`Error moving ${this.id}`, err);
|
||||
}
|
||||
//this.log.info('Projectors move time', { ms });
|
||||
return await this.end(cmd, id, ms);
|
||||
|
@ -116,12 +110,12 @@ class Projector {
|
|||
this.log.error(err);
|
||||
}
|
||||
}
|
||||
else if (typeof arg.move !== 'undefined') {
|
||||
else if (typeof arg.frame !== 'undefined') {
|
||||
try {
|
||||
await this.move(arg.id);
|
||||
await this.move(arg.frame, arg.id);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(`Error moving ${this.id}: ${arg.id}`, err);
|
||||
this.log.error(err);
|
||||
}
|
||||
}
|
||||
else if (typeof arg.val !== 'undefined') {
|
||||
|
@ -172,10 +166,10 @@ class Projector {
|
|||
}
|
||||
message += ` ${ms}ms`;
|
||||
this.log.info(message, 'PROJECTOR');
|
||||
await this.ui.send(this.id, { cmd, id, ms });
|
||||
return ms;
|
||||
return await this.ui.send(this.id, { cmd: cmd, id: id, ms: ms });
|
||||
}
|
||||
}
|
||||
exports.Projector = Projector;
|
||||
module.exports = { Projector };
|
||||
module.exports = function (arduino, cfg, ui, filmout, second) {
|
||||
return new Projector(arduino, cfg, ui, filmout, second);
|
||||
};
|
||||
//# sourceMappingURL=index.js.map
|
File diff suppressed because one or more lines are too long
|
@ -1,176 +0,0 @@
|
|||
<a name="module_lib/sequencer"></a>
|
||||
|
||||
## lib/sequencer
|
||||
|
||||
* [lib/sequencer](#module_lib/sequencer)
|
||||
* [~Create a new sequencer and assign command and UI as private sub-classes](#module_lib/sequencer..Create a new sequencer and assign command and UI as private sub-classes)
|
||||
* [new Create a new sequencer and assign command and UI as private sub-classes(cfg, cmd, ui)](#new_module_lib/sequencer..Create a new sequencer and assign command and UI as private sub-classes_new)
|
||||
* [~Sequencer](#module_lib/sequencer..Sequencer)
|
||||
* [.cmds(obj)](#module_lib/sequencer..Sequencer+cmds)
|
||||
* [.init()](#module_lib/sequencer..Sequencer+init)
|
||||
* [.listen()](#module_lib/sequencer..Sequencer+listen)
|
||||
* [.listener(event, arg)](#module_lib/sequencer..Sequencer+listener)
|
||||
* [.setLoops(count)](#module_lib/sequencer..Sequencer+setLoops)
|
||||
* [.setSteps(steps)](#module_lib/sequencer..Sequencer+setSteps)
|
||||
* [.unsetSteps(steps)](#module_lib/sequencer..Sequencer+unsetSteps)
|
||||
* [.start(arg)](#module_lib/sequencer..Sequencer+start)
|
||||
* [.pause()](#module_lib/sequencer..Sequencer+pause)
|
||||
* [.stop()](#module_lib/sequencer..Sequencer+stop)
|
||||
* [.step(x)](#module_lib/sequencer..Sequencer+step)
|
||||
* [.cmdExec(x)](#module_lib/sequencer..Sequencer+cmdExec)
|
||||
|
||||
<a name="module_lib/sequencer..Create a new sequencer and assign command and UI as private sub-classes"></a>
|
||||
|
||||
### lib/sequencer~Create a new sequencer and assign command and UI as private sub-classes
|
||||
**Kind**: inner class of [<code>lib/sequencer</code>](#module_lib/sequencer)
|
||||
<a name="new_module_lib/sequencer..Create a new sequencer and assign command and UI as private sub-classes_new"></a>
|
||||
|
||||
#### new Create a new sequencer and assign command and UI as private sub-classes(cfg, cmd, ui)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| cfg | <code>object</code> | Configuration object |
|
||||
| cmd | <code>object</code> | Shared command class |
|
||||
| ui | <code>object</code> | Electron UI, browser window |
|
||||
|
||||
<a name="module_lib/sequencer..Sequencer"></a>
|
||||
|
||||
### lib/sequencer~Sequencer
|
||||
Class representing all sequencer features.
|
||||
|
||||
**Kind**: inner class of [<code>lib/sequencer</code>](#module_lib/sequencer)
|
||||
|
||||
* [~Sequencer](#module_lib/sequencer..Sequencer)
|
||||
* [.cmds(obj)](#module_lib/sequencer..Sequencer+cmds)
|
||||
* [.init()](#module_lib/sequencer..Sequencer+init)
|
||||
* [.listen()](#module_lib/sequencer..Sequencer+listen)
|
||||
* [.listener(event, arg)](#module_lib/sequencer..Sequencer+listener)
|
||||
* [.setLoops(count)](#module_lib/sequencer..Sequencer+setLoops)
|
||||
* [.setSteps(steps)](#module_lib/sequencer..Sequencer+setSteps)
|
||||
* [.unsetSteps(steps)](#module_lib/sequencer..Sequencer+unsetSteps)
|
||||
* [.start(arg)](#module_lib/sequencer..Sequencer+start)
|
||||
* [.pause()](#module_lib/sequencer..Sequencer+pause)
|
||||
* [.stop()](#module_lib/sequencer..Sequencer+stop)
|
||||
* [.step(x)](#module_lib/sequencer..Sequencer+step)
|
||||
* [.cmdExec(x)](#module_lib/sequencer..Sequencer+cmdExec)
|
||||
|
||||
<a name="module_lib/sequencer..Sequencer+cmds"></a>
|
||||
|
||||
#### sequencer.cmds(obj)
|
||||
Take configuration object and assign all commands as keys
|
||||
in the internal CMDS object.
|
||||
|
||||
**Kind**: instance method of [<code>Sequencer</code>](#module_lib/sequencer..Sequencer)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| obj | <code>object</code> | Configuration object |
|
||||
|
||||
<a name="module_lib/sequencer..Sequencer+init"></a>
|
||||
|
||||
#### sequencer.init()
|
||||
Initialize the class by requiring ipcMain from electron
|
||||
and creating logger.
|
||||
|
||||
**Kind**: instance method of [<code>Sequencer</code>](#module_lib/sequencer..Sequencer)
|
||||
<a name="module_lib/sequencer..Sequencer+listen"></a>
|
||||
|
||||
#### sequencer.listen()
|
||||
Bind ipc listener to channel 'sequencer' or current id of
|
||||
class.
|
||||
|
||||
**Kind**: instance method of [<code>Sequencer</code>](#module_lib/sequencer..Sequencer)
|
||||
<a name="module_lib/sequencer..Sequencer+listener"></a>
|
||||
|
||||
#### sequencer.listener(event, arg)
|
||||
Listener callback function. Called whenever ipc
|
||||
message is sent to channel 'sequencer'.
|
||||
|
||||
**Kind**: instance method of [<code>Sequencer</code>](#module_lib/sequencer..Sequencer)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| event | <code>object</code> | IPC message event |
|
||||
| arg | <code>object</code> | Arguments provided in message |
|
||||
|
||||
<a name="module_lib/sequencer..Sequencer+setLoops"></a>
|
||||
|
||||
#### sequencer.setLoops(count)
|
||||
Sets the value of the loops in the grid sequence
|
||||
to value sent by UI in ipc message.
|
||||
|
||||
**Kind**: instance method of [<code>Sequencer</code>](#module_lib/sequencer..Sequencer)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| count | <code>integer</code> | Number of loops to set grid sequence to |
|
||||
|
||||
<a name="module_lib/sequencer..Sequencer+setSteps"></a>
|
||||
|
||||
#### sequencer.setSteps(steps)
|
||||
Sets multiple steps at once
|
||||
|
||||
**Kind**: instance method of [<code>Sequencer</code>](#module_lib/sequencer..Sequencer)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| steps | <code>array</code> | Array of steps to set or update |
|
||||
|
||||
<a name="module_lib/sequencer..Sequencer+unsetSteps"></a>
|
||||
|
||||
#### sequencer.unsetSteps(steps)
|
||||
Resets multiple steps to default 'undefined' state
|
||||
|
||||
**Kind**: instance method of [<code>Sequencer</code>](#module_lib/sequencer..Sequencer)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| steps | <code>array</code> | Array containing the x location of steps to unset |
|
||||
|
||||
<a name="module_lib/sequencer..Sequencer+start"></a>
|
||||
|
||||
#### sequencer.start(arg)
|
||||
Starts a sequence with the existing grid sequence,
|
||||
or if one is provided in the arg object, starts
|
||||
that sequence.
|
||||
|
||||
**Kind**: instance method of [<code>Sequencer</code>](#module_lib/sequencer..Sequencer)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| arg | <code>object</code> | Arguments from ipc message |
|
||||
|
||||
<a name="module_lib/sequencer..Sequencer+pause"></a>
|
||||
|
||||
#### sequencer.pause()
|
||||
Pauses sequence from UI.
|
||||
|
||||
**Kind**: instance method of [<code>Sequencer</code>](#module_lib/sequencer..Sequencer)
|
||||
<a name="module_lib/sequencer..Sequencer+stop"></a>
|
||||
|
||||
#### sequencer.stop()
|
||||
Stops the sequence
|
||||
|
||||
**Kind**: instance method of [<code>Sequencer</code>](#module_lib/sequencer..Sequencer)
|
||||
<a name="module_lib/sequencer..Sequencer+step"></a>
|
||||
|
||||
#### sequencer.step(x)
|
||||
Execute command @ step x. Wrapper with try catch.
|
||||
|
||||
**Kind**: instance method of [<code>Sequencer</code>](#module_lib/sequencer..Sequencer)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| x | <code>integer</code> | Step to execute command at |
|
||||
|
||||
<a name="module_lib/sequencer..Sequencer+cmdExec"></a>
|
||||
|
||||
#### sequencer.cmdExec(x)
|
||||
Locate step @ position x and execute the command.
|
||||
|
||||
**Kind**: instance method of [<code>Sequencer</code>](#module_lib/sequencer..Sequencer)
|
||||
|
||||
| Param | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| x | <code>integer</code> | Step to execute command at |
|
||||
|
|
@ -1,107 +0,0 @@
|
|||
import { Commands } from 'cmd';
|
||||
import type { Config } from 'cfg';
|
||||
import type { WebContents } from 'electron';
|
||||
/** @module lib/sequencer */
|
||||
/**
|
||||
* Class representing all sequencer features.
|
||||
*/
|
||||
export declare class Sequencer {
|
||||
private running;
|
||||
private paused;
|
||||
private grid;
|
||||
private gridLoops;
|
||||
private arr;
|
||||
private loops;
|
||||
private cfg;
|
||||
private cmd;
|
||||
private CMDS;
|
||||
private ipc;
|
||||
private ui;
|
||||
private log;
|
||||
private id;
|
||||
private alerted;
|
||||
private psbId;
|
||||
/**
|
||||
* @constructor
|
||||
* Create a new sequencer and assign command and UI as private sub-classes
|
||||
*
|
||||
* @param {object} cfg Configuration object
|
||||
* @param {object} cmd Shared command class
|
||||
* @param {object} ui Electron UI, browser window
|
||||
**/
|
||||
constructor(cfg: Config, cmd: Commands, ui: WebContents);
|
||||
/**
|
||||
* Take configuration object and assign all commands as keys
|
||||
* in the internal CMDS object.
|
||||
*
|
||||
* @param {object} obj Configuration object
|
||||
**/
|
||||
private cmds;
|
||||
/**
|
||||
* Initialize the class by requiring ipcMain from electron
|
||||
* and creating logger.
|
||||
*
|
||||
**/
|
||||
private init;
|
||||
/**
|
||||
* Bind ipc listener to channel 'sequencer' or current id of
|
||||
* class.
|
||||
**/
|
||||
private listen;
|
||||
/**
|
||||
* Listener callback function. Called whenever ipc
|
||||
* message is sent to channel 'sequencer'.
|
||||
*
|
||||
* @param {object} event IPC message event
|
||||
* @param {object} arg Arguments provided in message
|
||||
**/
|
||||
private listener;
|
||||
/**
|
||||
* Sets the value of the loops in the grid sequence
|
||||
* to value sent by UI in ipc message.
|
||||
*
|
||||
* @param {integer} count Number of loops to set grid sequence to
|
||||
**/
|
||||
setLoops(count: number): void;
|
||||
/**
|
||||
* Sets multiple steps at once
|
||||
*
|
||||
* @param {array} steps Array of steps to set or update
|
||||
**/
|
||||
setSteps(steps: any[]): void;
|
||||
/**
|
||||
* Resets multiple steps to default 'undefined' state
|
||||
*
|
||||
* @param {array} steps Array containing the x location of steps to unset
|
||||
**/
|
||||
unsetSteps(steps: number[]): void;
|
||||
/**
|
||||
* Starts a sequence with the existing grid sequence,
|
||||
* or if one is provided in the arg object, starts
|
||||
* that sequence.
|
||||
*
|
||||
* @param {object} arg Arguments from ipc message
|
||||
**/
|
||||
start(arg: any): Promise<void>;
|
||||
/**
|
||||
* Pauses sequence from UI.
|
||||
**/
|
||||
pause(): void;
|
||||
/**
|
||||
* Stops the sequence
|
||||
**/
|
||||
stop(): void;
|
||||
/**
|
||||
* Execute command @ step x. Wrapper with try catch.
|
||||
*
|
||||
* @param {integer} x Step to execute command at
|
||||
**/
|
||||
private step;
|
||||
/**
|
||||
* Locate step @ position x and execute the command.
|
||||
*
|
||||
* @param {integer} x Step to execute command at
|
||||
**/
|
||||
private cmdExec;
|
||||
isRunning(): boolean;
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue