Compare commits

..

No commits in common. "main" and "1.6.4" have entirely different histories.
main ... 1.6.4

375 changed files with 14822 additions and 3167545 deletions

10
.gitignore vendored
View File

@ -3,12 +3,4 @@
*.Parent
node_modules
dist
*.svd
*debug_custom.json
*debug.cfg
notes/mphd
./lib
dist

9
.gitmodules vendored
View File

@ -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

178
Readme.md
View File

@ -1,93 +1,85 @@
# mcopy
An open platform for controlling small-gauge film optical printers (16mm, Super8, 8mm).
## [Project Home - git.sixteenmillimeter.com/16mm/mcopy](https://git.sixteenmillimeter.com/16mm/mcopy)
* Github Mirror - [github.com/sixteenmillimeter/mcopy](https://github.com/sixteenmillimeter/mcopy)
* Gitlab Mirror - [gitlab.com/16mm/mcopy](https://gitlab.com/16mm/mcopy)
-------
1. <a href="#intro">Introduction</a>
2. <a href="#downloads">Downloads</a>
1. <a href="#usage">Usage</a>
2. <a href="#software">Software</a>
3. <a href="#firmware">Firmware</a>
3. <a href="#hardware">Hardware</a>
4. <a href="#why">Why?</a>
-------
## Introduction <a name="intro"></a>
The `mcopy` project is comprised of software and hardware for optical printers, built with re-purposed broken projectors.
#### Components
* Sequencer desktop app
* Scripting language, called `mscript`, for orchestrating complex sequences
* Arduino firmware for projectors, cameras, lights and existing printers
* 3D models of parts used for modifying projectors and printers
* Schematics for simple Arduino-based electronics
* Filmout feature for digitally transferring video and images to analog film
* Interoperability with the [intval3](https://github.com/sixteenmillimeter/intval3) intervalometer
## Downloads <a name="downloads"></a>
### Latest Installers
* [1.6.9](https://github.com/sixteenmillimeter/mcopy/releases/tag/1.6.9) for macOS, Linux (.deb) and Windows (.msi)
### Older Versions
* [1.6.7](https://github.com/sixteenmillimeter/mcopy/releases/tag/1.6.7) for macOS and Linux (.deb)
* [1.6.4](https://github.com/sixteenmillimeter/mcopy/releases/tag/1.6.4) for macOS, Linux (.deb) and Windows (.msi)
* [1.6.2](https://github.com/sixteenmillimeter/mcopy/releases/tag/1.6.2) for macOS
* [1.6.1](https://github.com/sixteenmillimeter/mcopy/releases/tag/1.6.1) for macOS
* [1.5.2](https://github.com/sixteenmillimeter/mcopy/releases/tag/1.5.2) for macOS
* [1.4.9](https://github.com/sixteenmillimeter/mcopy/releases/tag/1.4.9) for macOS and Linux (.deb)
* [1.2.0](https://github.com/sixteenmillimeter/mcopy/releases/tag/1.2.0) for macOS and Linux (.deb)
* [1.0.3](https://github.com/sixteenmillimeter/mcopy/releases/tag/1.0.3) for macOS and Linux (.deb)
For Windows, you can [install from source](https://github.com/sixteenmillimeter/mcopy/tree/master/app#mcopy-desktop-app) for now.
## Usage <a name="usage"></a>
The software requires your hardware to be in place before the mcopy control app is useful.
![mcopy app](docs/mcopy.png?raw=true "mcopy app")
## Software <a name="software"></a>
The mcopy desktop app is an Electron-based project which can be built for Linux, Windows and macOS.
Pre-built packages will be made available for macOS, initially, with the other two target platforms to follow.
To build the desktop app from source, see the [installation and running instructions](https://github.com/sixteenmillimeter/mcopy/tree/master/app#mcopy-desktop-app).
The desktop software also interoperates with two related projects; the Bluetooth + Wifi capable, Raspberry Pi-based [INTVAL3](https://github.com/sixteenmillimeter/intval3) and the Arduino-based [intval2](https://github.com/sixteenmillimeter/intval2).
## Firmware <a name="firmware"></a>
This project contains Arduino formware for controlling:
* a projector
* a camera (see [intval2](https://github.com/sixteenmillimeter/intval2) for more info)
* a light
* a projector + a camera
* a projector + a light
* a camera + a light
* a camera + a projector + a light
Using a simple serial interface, this modular platform can be used to control DIY components, modified existing optical printers or a mixture of components.
The desktop app can connect to multiple serial devices, so your mcopy optical printer can be built from various designs that suit your hardware tastes/needs/available parts.
## Hardware <a name="hardware"></a>
All non-electronic hardware for this project is available as plaintext OpenSCAD files and 3D print-able .STL files.
The hardware component of this project is aimed at modifying broken Bell & Howell projectors into USB serial-controlled projectors to be used in optical printing.
As a secondary capability, this desktop software and firmware package can be used to replace the sequencers for early-model JK optical printers, with some modification.
## Why? <a name="why"></a>
I'm interested in expanding the viability and access of the 16mm film format and to repurpose thre rising tide of discarded film technology.
# mcopy
An open platform for controlling small-gauge film optical printers (16mm, Super8, 8mm).
-------
1. <a href="#intro">Introduction</a>
2. <a href="#downloads">Downloads</a>
1. <a href="#usage">Usage</a>
2. <a href="#software">Software</a>
3. <a href="#firmware">Firmware</a>
3. <a href="#hardware">Hardware</a>
4. <a href="#why">Why?</a>
-------
## Introduction <a name="intro"></a>
The `mcopy` project is comprised of software and hardware for optical printers, built with re-purposed broken projectors.
#### Components
* Sequencer desktop app
* Scripting language, called `mscript`, for orchestrating complex sequences
* Arduino firmware for projectors, cameras, lights and existing printers
* 3D models of parts used for modifying projectors and printers
* Schematics for simple Arduino-based electronics
* Filmout feature for digitally transferring video and images to analog film
* Interoperability with the [intval3](https://github.com/sixteenmillimeter/intval3) intervalometer
## Downloads <a name="downloads"></a>
### Latest Installers
* [1.6.2](https://github.com/sixteenmillimeter/mcopy/releases/tag/1.6.2) for macOS, Linux (.deb) and Windows (.msi)
### Older Versions
* [1.6.1](https://github.com/sixteenmillimeter/mcopy/releases/tag/1.6.1) for macOS
* [1.5.2](https://github.com/sixteenmillimeter/mcopy/releases/tag/1.5.2) for macOS
* [1.4.9](https://github.com/sixteenmillimeter/mcopy/releases/tag/1.4.9) for macOS and Linux (.deb)
* [1.2.0](https://github.com/sixteenmillimeter/mcopy/releases/tag/1.2.0) for macOS and Linux (.deb)
* [1.0.3](https://github.com/sixteenmillimeter/mcopy/releases/tag/1.0.3) for macOS and Linux (.deb)
For Windows, you can [install from source](https://github.com/sixteenmillimeter/mcopy/tree/master/app#mcopy-desktop-app) for now.
## Usage <a name="usage"></a>
The software requires your hardware to be in place before the mcopy control app is useful.
![mcopy app](docs/mcopy.png?raw=true "mcopy app")
## Software <a name="software"></a>
The mcopy desktop app is an Electron-based project which can be built for Linux, Windows and macOS.
Pre-built packages will be made available for macOS, initially, with the other two target platforms to follow.
To build the desktop app from source, see the [installation and running instructions](https://github.com/sixteenmillimeter/mcopy/tree/master/app#mcopy-desktop-app).
The desktop software also interoperates with two related projects; the Bluetooth + Wifi capable, Raspberry Pi-based [INTVAL3](https://github.com/sixteenmillimeter/intval3) and the Arduino-based [intval2](https://github.com/sixteenmillimeter/intval2).
## Firmware <a name="firmware"></a>
This project contains Arduino formware for controlling:
* a projector
* a camera (see [intval2](https://github.com/sixteenmillimeter/intval2) for more info)
* a light
* a projector + a camera
* a projector + a light
* a camera + a light
* a camera + a projector + a light
Using a simple serial interface, this modular platform can be used to control DIY components, modified existing optical printers or a mixture of components.
The desktop app can connect to multiple serial devices, so your mcopy optical printer can be built from various designs that suit your hardware tastes/needs/available parts.
## Hardware <a name="hardware"></a>
All non-electronic hardware for this project is available as plaintext OpenSCAD files and 3D print-able .STL files.
The hardware component of this project is aimed at modifying broken Bell & Howell projectors into USB serial-controlled projectors to be used in optical printing.
As a secondary capability, this desktop software and firmware package can be used to replace the sequencers for early-model JK optical printers, with some modification.
## Why? <a name="why"></a>
I'm interested in expanding the viability and access of the 16mm film format and to repurpose thre rising tide of discarded film technology.

5
app/.gitignore vendored
View File

@ -1,6 +1,3 @@
node_modules/*
logs/*
data/transfer*.json
.appleId*
.applePwd*
.appleIdentity*
data/transfer*.json

View File

@ -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 {

View File

@ -1,5 +1,5 @@
{
"version": "1.8.120",
"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,24 +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_forward": "J",
"camera_open_backward": "K",
"camera_close_forward": "L",
"camera_close_backward": "M",
"takeup_forward": "D",
"takeup_backward": "F",
"error": "E",
"camera_exposure": "G",
"state": "H",
"home": "I",
"offset": "O"
"cameras_projectors_identifier": "7"
}
}
}

View File

@ -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)
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()

View File

@ -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>

View File

@ -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">
@ -45,8 +45,6 @@
<div id="camera_second_backward" class="row cam2" y="2"></div>
<div id="projector_backward" class="row" y="1"></div>
<div id="projector_second_backward" class="row proj2" y="3"></div>
<div id="black" class="row black"></div>
<div id="light_set" class="row spacer"></div>
<div id="numbers" class="row"></div>
@ -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>

View File

@ -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();
};

View File

@ -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;

View File

@ -42,10 +42,6 @@
background: @BACKWARD;
border-color: @BACKWARD;
}
&.capper{
background: white;
color: @BG;
}
i{
color: @BG;
}

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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;
}
}

View File

@ -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)

View File

@ -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>;
}

View File

@ -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

View File

@ -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"}

View File

@ -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 &#39;serial&#39; and &#39;device&#39;.
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.&lt;(boolean\|string)&gt;</code>
* [.sendString(device, str)](#module_lib/arduino..Arduino+sendString) ⇒ <code>Promise.&lt;(boolean\|string)&gt;</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.&lt;string&gt;</code>
* [.confirmEnd(data)](#module_lib/arduino..Arduino+confirmEnd)
* [.verify()](#module_lib/arduino..Arduino+verify) ⇒ <code>Promise.&lt;boolean&gt;</code>
* [.distinguish()](#module_lib/arduino..Arduino+distinguish) ⇒ <code>Promise.&lt;string&gt;</code>
* [.close()](#module_lib/arduino..Arduino+close) ⇒ <code>Promise.&lt;boolean&gt;</code>
* [.fakeConnect(serial)](#module_lib/arduino..Arduino+fakeConnect) ⇒ <code>Promise.&lt;boolean&gt;</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.&lt;(boolean\|string)&gt;</code>
* [.sendString(device, str)](#module_lib/arduino..Arduino+sendString) ⇒ <code>Promise.&lt;(boolean\|string)&gt;</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.&lt;string&gt;</code>
* [.confirmEnd(data)](#module_lib/arduino..Arduino+confirmEnd)
* [.verify()](#module_lib/arduino..Arduino+verify) ⇒ <code>Promise.&lt;boolean&gt;</code>
* [.distinguish()](#module_lib/arduino..Arduino+distinguish) ⇒ <code>Promise.&lt;string&gt;</code>
* [.close()](#module_lib/arduino..Arduino+close) ⇒ <code>Promise.&lt;boolean&gt;</code>
* [.fakeConnect(serial)](#module_lib/arduino..Arduino+fakeConnect) ⇒ <code>Promise.&lt;boolean&gt;</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.&lt;(boolean\|string)&gt;</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.&lt;(boolean\|string)&gt;</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.&lt;(boolean\|string)&gt;</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.&lt;(boolean\|string)&gt;</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.&lt;string&gt;</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.&lt;string&gt;</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.&lt;boolean&gt;</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.&lt;boolean&gt;</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.&lt;string&gt;</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.&lt;string&gt;</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.&lt;boolean&gt;</code>
Closes the connection to an Arduino.
**Kind**: instance method of [<code>Arduino</code>](#module_lib/arduino..Arduino)
**Returns**: <code>Promise.&lt;boolean&gt;</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.&lt;boolean&gt;</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.&lt;boolean&gt;</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

View File

@ -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;
}

View File

@ -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

View File

@ -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)

View File

@ -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 {};

View File

@ -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

View File

@ -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)

View File

@ -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 };

View File

@ -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

View File

@ -1 +0,0 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/capper/index.ts"],"names":[],"mappings":"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"}

View File

View File

@ -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 };

View File

@ -1,3 +0,0 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=index.js.map

View File

@ -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

View File

@ -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)

179
app/lib/cmd/index.d.ts vendored
View File

@ -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>;
}

View File

@ -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

View File

@ -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>;

View File

@ -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

View File

@ -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"}

View File

@ -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)

View File

@ -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 };

View File

@ -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

View File

@ -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)

View File

@ -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;
}

View File

@ -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

View File

@ -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 };

View File

@ -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

View File

@ -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"}

View File

@ -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;

View File

@ -16,5 +16,5 @@ function exit(msg, code = 0) {
process.exit(code);
}
}
module.exports = { exit };
module.exports.exit = exit;
//# sourceMappingURL=index.js.map

View File

@ -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"}

View File

@ -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)

View File

@ -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 };

View File

@ -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

View File

@ -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 |

View File

@ -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>;
}

View File

@ -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

View File

@ -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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"}

View File

@ -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)

View File

@ -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 };

View File

@ -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

View File

@ -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)

View File

@ -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 };

View File

@ -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

View File

@ -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"}

View File

@ -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)

View File

@ -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;
}

View File

@ -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

View File

@ -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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"}

View File

@ -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)

View File

@ -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 };

View File

@ -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

View File

@ -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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"}

View File

@ -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 |

View File

@ -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>;

View File

@ -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

View File

@ -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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"}

View File

@ -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)

View File

@ -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 };

View File

@ -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

View File

@ -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)

View File

@ -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>;
}

View File

@ -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

View File

@ -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"}

View File

@ -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)

View File

@ -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 };

View File

@ -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

View File

@ -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 |

View File

@ -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