Install libs from intval_go_node project
This commit is contained in:
parent
41553dd0f9
commit
95007d06a2
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"name": "arduino",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC"
|
||||||
|
}
|
|
@ -0,0 +1,127 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
const path = require('path');
|
||||||
|
const { BrowserWindow } = require('electron');
|
||||||
|
|
||||||
|
const exec = require('exec');
|
||||||
|
const spawn = require('spawn');
|
||||||
|
const delay = require('delay');
|
||||||
|
|
||||||
|
let wv;
|
||||||
|
let cp;
|
||||||
|
let system = {};
|
||||||
|
let digitalWindow;
|
||||||
|
|
||||||
|
let TMPDIR;
|
||||||
|
|
||||||
|
class WebView {
|
||||||
|
constructor() {
|
||||||
|
|
||||||
|
}
|
||||||
|
async open () {
|
||||||
|
digitalWindow = new BrowserWindow({
|
||||||
|
webPreferences: {
|
||||||
|
nodeIntegration: true,
|
||||||
|
allowRunningInsecureContent: false,
|
||||||
|
'unsafe-eval' : false
|
||||||
|
},
|
||||||
|
width: 800,
|
||||||
|
height: 600,
|
||||||
|
minWidth : 800,
|
||||||
|
minHeight : 600//,
|
||||||
|
//icon: path.join(__dirname, '../../assets/icons/icon.png')
|
||||||
|
});
|
||||||
|
digitalWindow.loadURL('file://' + __dirname + '../../../display.html');
|
||||||
|
if (process.argv.indexOf('-d') !== -1 || process.argv.indexOf('--dev') !== -1) {
|
||||||
|
digitalWindow.webContents.openDevTools();
|
||||||
|
}
|
||||||
|
digitalWindow.on('closed', () => {
|
||||||
|
digitalWindow = null
|
||||||
|
});
|
||||||
|
}
|
||||||
|
async fullScreen () {
|
||||||
|
return digitalWindow.setFullScreen(true);
|
||||||
|
}
|
||||||
|
async setImage (src) {
|
||||||
|
return digitalWindow.webContents.send('display', { src });
|
||||||
|
}
|
||||||
|
async setMeter () {
|
||||||
|
return digitalWindow.webContents.send('display', { meter : true });
|
||||||
|
}
|
||||||
|
async setGrid () {
|
||||||
|
return digitalWindow.webContents.send('display', { grid : true });
|
||||||
|
}
|
||||||
|
async close () {
|
||||||
|
if (digitalWindow) {
|
||||||
|
digitalWindow.close();
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
async move () {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function padded_frame (i) {
|
||||||
|
let len = (i + '').length;
|
||||||
|
let str = i + '';
|
||||||
|
for (let x = 0; x < 5 - len; x++) {
|
||||||
|
str = '0' + str;
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function display_eog (src) {
|
||||||
|
//timeout 3 eog --fullscreen ${src}
|
||||||
|
cp = spawn('eog', ['--fullscreen', src]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async function display_wv (src) {
|
||||||
|
await wv.open();
|
||||||
|
await wv.fullScreen();
|
||||||
|
await delay(200);
|
||||||
|
await wv.setImage(src);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function end () {
|
||||||
|
if (system.platform !== 'nix') {
|
||||||
|
await wv.close();
|
||||||
|
} else {
|
||||||
|
cp.kill()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function start (frame) {
|
||||||
|
let padded = padded_frame(frame);
|
||||||
|
let ext = 'tif';
|
||||||
|
let tmppath;
|
||||||
|
|
||||||
|
if (system.platform !== 'nix') {
|
||||||
|
ext = 'png';
|
||||||
|
}
|
||||||
|
|
||||||
|
tmppath = path.join(TMPDIR, `export-${padded}.${ext}`);
|
||||||
|
|
||||||
|
if (system.platform !== 'nix') {
|
||||||
|
display_wv(tmppath);
|
||||||
|
} else {
|
||||||
|
display_eog(tmppath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = function (sys) {
|
||||||
|
system = sys;
|
||||||
|
TMPDIR = path.join(system.tmp, 'intval_go_node');
|
||||||
|
|
||||||
|
if (system.platform !== 'nix') {
|
||||||
|
wv = new WebView();
|
||||||
|
} else {
|
||||||
|
//child process
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
start,
|
||||||
|
end
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"name": "display",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC"
|
||||||
|
}
|
|
@ -0,0 +1,158 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
const uuid = require('uuid').v4;
|
||||||
|
const path = require('path');
|
||||||
|
const fs = require('fs-extra');
|
||||||
|
|
||||||
|
const exec = require('exec');
|
||||||
|
//const spawn = require('spawn');
|
||||||
|
const exit = require('exit');
|
||||||
|
|
||||||
|
let system = {};
|
||||||
|
let TMPDIR;
|
||||||
|
|
||||||
|
function padded_frame (i) {
|
||||||
|
let len = (i + '').length;
|
||||||
|
let str = i + '';
|
||||||
|
for (let x = 0; x < 5 - len; x++) {
|
||||||
|
str = '0' + str;
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function frame (video, frame, obj) {
|
||||||
|
let padded = padded_frame(frame);
|
||||||
|
let ext = 'tif';
|
||||||
|
let tmpoutput;
|
||||||
|
let cmd;
|
||||||
|
let output;
|
||||||
|
|
||||||
|
if (system.platform !== 'nix') {
|
||||||
|
ext = 'png';
|
||||||
|
}
|
||||||
|
|
||||||
|
tmpoutput = path.join(TMPDIR, `export-${padded}.${ext}`)
|
||||||
|
|
||||||
|
cmd = `ffmpeg -i "${video}" -vf select='gte(n\\,${frame})' -vframes 1 -compression_algo raw -pix_fmt rgb24 "${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 {
|
||||||
|
output = await exec(cmd);
|
||||||
|
console.log(cmd);
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (output) console.log(`"${output}"`);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async function frames (video, obj) {
|
||||||
|
let tmppath = TMPDIR;
|
||||||
|
let ext = 'tif';
|
||||||
|
let tmpoutput;
|
||||||
|
|
||||||
|
if (system.platform !== 'nix') {
|
||||||
|
ext = 'png';
|
||||||
|
}
|
||||||
|
|
||||||
|
tmpoutput = path.join(tmppath, `export-%05d.${ext}`);
|
||||||
|
try {
|
||||||
|
await fs.mkdir(tmppath)
|
||||||
|
} catch (Err) {
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
//ffmpeg -i "${video}" -compression_algo raw -pix_fmt rgb24 "${tmpoutput}"
|
||||||
|
}
|
||||||
|
|
||||||
|
async function clear (frame) {
|
||||||
|
let padded = padded_frame(frame);
|
||||||
|
let ext = 'tif';
|
||||||
|
let tmppath;
|
||||||
|
let tmpoutput;
|
||||||
|
let cmd;
|
||||||
|
let exists;
|
||||||
|
|
||||||
|
if (system.platform !== 'nix') {
|
||||||
|
ext = 'png';
|
||||||
|
}
|
||||||
|
|
||||||
|
tmppath = path.join(TMPDIR, `export-${padded}.${ext}`);
|
||||||
|
|
||||||
|
try {
|
||||||
|
exists = await fs.exists(tmppath);
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!exists) return false;
|
||||||
|
|
||||||
|
try {
|
||||||
|
await fs.unlink(tmppath);
|
||||||
|
console.log(`Cleared frame ${tmppath}`);
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function clearAll () {
|
||||||
|
let tmppath = TMPDIR;
|
||||||
|
let files;
|
||||||
|
try {
|
||||||
|
files = await fs.readdir(tmppath);
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
|
if (files) {
|
||||||
|
files.forEach(async (file, index) => {
|
||||||
|
try {
|
||||||
|
await fs.unlink(path.join(tmppath, file));
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function checkDir () {
|
||||||
|
let exists;
|
||||||
|
try {
|
||||||
|
exists = await fs.exists(TMPDIR);
|
||||||
|
} catch (err) {
|
||||||
|
console.error('Error checking for tmp dir', err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!exists) {
|
||||||
|
try {
|
||||||
|
await fs.mkdir(TMPDIR);
|
||||||
|
console.log(`Created tmpdir ${TMPDIR}`);
|
||||||
|
} catch (err) {
|
||||||
|
console.error('Error creating tmp dir', err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
await clearAll();
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = (sys) => {
|
||||||
|
system = sys;
|
||||||
|
TMPDIR = path.join(system.tmp, 'intval_go_node');
|
||||||
|
|
||||||
|
checkDir();
|
||||||
|
|
||||||
|
return {
|
||||||
|
frames,
|
||||||
|
frame,
|
||||||
|
clear,
|
||||||
|
clearAll
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"name": "ffmpeg",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC"
|
||||||
|
}
|
|
@ -0,0 +1,91 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
const fs = require('fs-extra');
|
||||||
|
|
||||||
|
const exec = require('exec');
|
||||||
|
//const spawn = require('spawn');
|
||||||
|
const exit = require('exit');
|
||||||
|
|
||||||
|
let system = {};
|
||||||
|
|
||||||
|
async function info (video) {
|
||||||
|
let cmd = `ffprobe -v quiet -print_format json -show_format -show_streams "${video}"`
|
||||||
|
let exists;
|
||||||
|
let raw;
|
||||||
|
let json;
|
||||||
|
let vid;
|
||||||
|
|
||||||
|
try {
|
||||||
|
exists = await fs.exists(video);
|
||||||
|
} catch (err) {
|
||||||
|
return exit(err, 5);
|
||||||
|
}
|
||||||
|
if (!exists) {
|
||||||
|
return exit(`File ${video} does not exist`, 6);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
raw = await exec(cmd);
|
||||||
|
} catch (err) {
|
||||||
|
return exit(err, 7);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
json = JSON.parse(raw);
|
||||||
|
} catch (err) {
|
||||||
|
return raw;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (json && json.streams) {
|
||||||
|
vid = json.streams.find(stream => {
|
||||||
|
if (stream.width && stream.height) return stream;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vid) {
|
||||||
|
json.width = vid.width;
|
||||||
|
json.height = vid.height;
|
||||||
|
}
|
||||||
|
|
||||||
|
return json;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function frames (video) {
|
||||||
|
let cmd = `ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 "${video}"`;
|
||||||
|
let exists;
|
||||||
|
let raw;
|
||||||
|
let frames;
|
||||||
|
|
||||||
|
try {
|
||||||
|
exists = await fs.exists(video);
|
||||||
|
} catch (err) {
|
||||||
|
return exit(err, 5);
|
||||||
|
}
|
||||||
|
if (!exists) {
|
||||||
|
return exit(`File ${video} does not exist`, 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
raw = await exec(cmd);
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
frames = parseInt(raw)
|
||||||
|
} catch (err) {
|
||||||
|
return raw;
|
||||||
|
}
|
||||||
|
|
||||||
|
return frames;
|
||||||
|
}
|
||||||
|
|
||||||
|
function map (obj) {
|
||||||
|
console.dir(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = (sys) => {
|
||||||
|
system = sys;
|
||||||
|
return {
|
||||||
|
info,
|
||||||
|
frames
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"name": "ffprobe",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC"
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"name": "intval",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC"
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"name": "server",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC"
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"name": "settings",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC"
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
const spawnRaw = require('child_process').spawn;
|
||||||
|
|
||||||
|
function spawn (cmd, args) {
|
||||||
|
const sp = spawnRaw(cmd, args);
|
||||||
|
let output = '';
|
||||||
|
sp.stderr.on('data', (data) => {
|
||||||
|
output += data;
|
||||||
|
//console.log(`${data}`);
|
||||||
|
});
|
||||||
|
sp.on('close', (code) => {
|
||||||
|
console.log(output);
|
||||||
|
});
|
||||||
|
return sp;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = spawn;
|
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"name": "spawn",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC"
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
const os = require('os');
|
||||||
|
const electron = require('electron');
|
||||||
|
|
||||||
|
const exec = require('exec');
|
||||||
|
//const spawn = require('spawn');
|
||||||
|
const exit = require('exit');
|
||||||
|
|
||||||
|
async function dependencies (platform) {
|
||||||
|
let obj = {};
|
||||||
|
|
||||||
|
try {
|
||||||
|
await exec('ffmpeg -h');
|
||||||
|
obj.ffmpeg = 'ffmpeg';
|
||||||
|
} catch (err) {
|
||||||
|
return exit('ffmpeg is not installed', 3);
|
||||||
|
}
|
||||||
|
//if linux
|
||||||
|
if (platform === 'nix') {
|
||||||
|
try {
|
||||||
|
await exec('eog -h');
|
||||||
|
obj.eog = 'eog';
|
||||||
|
} catch (err) {
|
||||||
|
return exit('eog is not installed', 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function system () {
|
||||||
|
const obj = {};
|
||||||
|
let displays = electron.screen.getAllDisplays();
|
||||||
|
let platform;
|
||||||
|
|
||||||
|
try {
|
||||||
|
obj.tmp = os.tmpdir();
|
||||||
|
} catch (err) {
|
||||||
|
obj.tmp = '/tmp'
|
||||||
|
}
|
||||||
|
|
||||||
|
platform = os.type();
|
||||||
|
|
||||||
|
if (platform === 'Darwin') {
|
||||||
|
obj.platform = 'osx';
|
||||||
|
} else if (platform === 'Windows_NT') {
|
||||||
|
obj.platform = 'win';
|
||||||
|
} else {
|
||||||
|
obj.platform = 'nix';
|
||||||
|
}
|
||||||
|
|
||||||
|
obj.displays = displays.map(obj => {
|
||||||
|
return {
|
||||||
|
width : obj.workArea.width,
|
||||||
|
height : obj.workArea.height,
|
||||||
|
x : obj.bounds.x,
|
||||||
|
y : obj.bounds.y
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
obj.deps = await dependencies(obj.platform);
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = system;
|
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"name": "system",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC"
|
||||||
|
}
|
|
@ -0,0 +1,105 @@
|
||||||
|
boolean debug_state = false;
|
||||||
|
|
||||||
|
/* ------------------------------------------------
|
||||||
|
* pins
|
||||||
|
* ------------------------------------------------*/
|
||||||
|
//Arduino Uno + relay module
|
||||||
|
|
||||||
|
const int PIN_INDICATOR = 13;
|
||||||
|
const int PIN_CAMERA = 9;
|
||||||
|
|
||||||
|
volatile boolean running = false;
|
||||||
|
|
||||||
|
unsigned long timer = 0;
|
||||||
|
unsigned long frame_start = 0;
|
||||||
|
unsigned long delay_start = 0;
|
||||||
|
|
||||||
|
volatile long seq_delay = 42;
|
||||||
|
|
||||||
|
const char cmd_camera = 'c';
|
||||||
|
|
||||||
|
const char cmd_debug = 'd';
|
||||||
|
const char cmd_connect = 'i';
|
||||||
|
volatile char cmd_char = 'z';
|
||||||
|
const char cmd_mcopy_identifier = 'm';
|
||||||
|
const char cmd_cam_identifier = 'k';
|
||||||
|
|
||||||
|
const int serialDelay = 5;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(57600);
|
||||||
|
Serial.flush();
|
||||||
|
Serial.setTimeout(serialDelay);
|
||||||
|
|
||||||
|
Pins_init();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
if (Serial.available()) {
|
||||||
|
/* read the most recent byte */
|
||||||
|
cmd_char = (char)Serial.read();
|
||||||
|
}
|
||||||
|
if (cmd_char != 'z') {
|
||||||
|
cmd(cmd_char);
|
||||||
|
cmd_char = 'z';
|
||||||
|
}
|
||||||
|
timer = millis();
|
||||||
|
}
|
||||||
|
|
||||||
|
void cmd (char val) {
|
||||||
|
if (val == cmd_debug) {
|
||||||
|
debug();
|
||||||
|
} else if (val == cmd_connect) {
|
||||||
|
connect();
|
||||||
|
} else if (val == cmd_mcopy_identifier) {
|
||||||
|
identify();
|
||||||
|
} else if (val == cmd_camera) {
|
||||||
|
Frame();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void debug () {
|
||||||
|
debug_state = true;
|
||||||
|
Serial.println(cmd_debug);
|
||||||
|
log("debugging enabled");
|
||||||
|
}
|
||||||
|
|
||||||
|
void connect () {
|
||||||
|
Serial.println(cmd_connect);
|
||||||
|
log("connect()");
|
||||||
|
}
|
||||||
|
|
||||||
|
void identify () {
|
||||||
|
Serial.println(cmd_cam_identifier);
|
||||||
|
log("identify()");
|
||||||
|
}
|
||||||
|
|
||||||
|
void Pins_init () {
|
||||||
|
pinMode(PIN_CAMERA, OUTPUT);
|
||||||
|
pinMode(PIN_INDICATOR, OUTPUT);
|
||||||
|
|
||||||
|
digitalWrite(PIN_CAMERA, LOW);
|
||||||
|
digitalWrite(PIN_INDICATOR, LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Frame () {
|
||||||
|
frame_start = millis();
|
||||||
|
running = true;
|
||||||
|
|
||||||
|
digitalWrite(PIN_CAMERA, HIGH);
|
||||||
|
digitalWrite(PIN_INDICATOR, HIGH);
|
||||||
|
delay(200);
|
||||||
|
digitalWrite(PIN_CAMERA, LOW);
|
||||||
|
digitalWrite(PIN_INDICATOR, LOW);
|
||||||
|
delay(600);
|
||||||
|
running = false;
|
||||||
|
|
||||||
|
Serial.println(cmd_camera);
|
||||||
|
log("Frame completed");
|
||||||
|
}
|
||||||
|
|
||||||
|
void log (String msg) {
|
||||||
|
if (debug_state) {
|
||||||
|
Serial.println(msg);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue