diff --git a/.gitignore b/.gitignore index 9601ceb..1390f49 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules *.DS_Store +.env diff --git a/default.env b/default.env new file mode 100644 index 0000000..1d56d55 --- /dev/null +++ b/default.env @@ -0,0 +1,9 @@ +HOST=0.0.0.0 +PORT=8081 +WS_HOST=0.0.0.0 +WS_PORT=8081 +WIDTH=2560 +HEIGHT=1600 +FD=../filmout_display/build/bin/fd +FD_HOST=localhost +FD_PORT=8081 \ No newline at end of file diff --git a/dist/fd/index.js b/dist/fd/index.js new file mode 100644 index 0000000..f95b90c --- /dev/null +++ b/dist/fd/index.js @@ -0,0 +1,79 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.FD = void 0; +const net_1 = __importDefault(require("net")); +const log_1 = require("../log"); +const shell_1 = require("../shell"); +const delay_1 = require("../delay"); +class FD { + constructor(bin, width, height, host, port) { + this.socketAvailable = false; + this.socketConnected = false; + this.bin = bin; + this.width = width; + this.height = height; + this.host = host; + this.port = port; + this.log = (0, log_1.createLog)('fd'); + this.shell = new shell_1.Shell([this.bin, `${this.width}`, `${this.height}`], this.logstd.bind(this), this.logsterr.bind(this), null, true); + this.startDisplay(); + this.startClient(); + this.test(); + } + async startDisplay() { + this.log.info(`Launching fd binary ${this.bin}`); + this.shell.execute(); + } + async startClient() { + this.client = new net_1.default.Socket(); + this.log.info(`Waiting for TCP socket server on ${this.host}:${this.port}...`); + while (!this.socketAvailable) { + await (0, delay_1.delay)(10); + } + this.log.info(`TCP socket server on ${this.host}:${this.port} is available`); + this.client.connect(this.port, this.host, async function () { + this.socketConnected = true; + this.log.info(`TCP socket client connected to ${this.host}:${this.port}`); + /*const data = { + action : 1, + image: 'filename.tif', + }; + this.log.info('SENDING'); + this.log.info(data); + this.client.write(JSON.stringify(data)); + await delay(2000); + data.action = 2; + this.log.info('SENDING'); + this.log.info(data); + this.client.write(JSON.stringify(data));*/ + }.bind(this)); + this.client.on('data', (data) => { + this.log.info('RECEIVED'); + this.log.info(data.toString()); + }); + this.client.on('close', () => { + this.log.info('Closing connection'); + }); + this.client.on('error', (err) => { + this.log.error('Error:', err); + }); + } + logstd(data) { + this.log.info(data); + if (data.indexOf('TCP server listening on port') !== -1 && data.indexOf(`${this.port}`) !== -1) { + this.socketAvailable = true; + } + } + logsterr(data) { + this.log.error(data); + } + async test() { + await (0, delay_1.delay)(10000); + this.shell.kill(); + } +} +exports.FD = FD; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/fd/index.js.map b/dist/fd/index.js.map new file mode 100644 index 0000000..5e49c44 --- /dev/null +++ b/dist/fd/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fd/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.js b/dist/index.js index aa53b97..6dfb86f 100644 --- a/dist/index.js +++ b/dist/index.js @@ -2,23 +2,50 @@ Object.defineProperty(exports, "__esModule", { value: true }); require("dotenv/config"); const log_1 = require("./log"); -const shell_1 = require("./shell"); -const delay_1 = require("./delay"); +const fd_1 = require("./fd"); +let fd; let log = (0, log_1.createLog)('fm'); -let logfd = (0, log_1.createLog)('fd'); log.info('Starting filmout_manager'); -function logfdstd(data) { - logfd.info(data); -} -function logfdstderr(data) { - logfd.error(data); +function settings() { + if (typeof process.env['FD'] === 'undefined') { + log.error('Please include an FD value containing the path to your fd binary in .env'); + process.exit(1); + } + else { + log.info(`FD=${process.env['FD']}`); + } + if (typeof process.env['WIDTH'] === 'undefined') { + log.error('Please include a WIDTH value containing the width of the screen you are using in .env'); + process.exit(2); + } + else { + log.info(`WIDTH=${process.env['WIDTH']}`); + } + if (typeof process.env['HEIGHT'] === 'undefined') { + log.error('Please include a HEIGHT value containing the height of the screen you are using in .env'); + process.exit(3); + } + else { + log.info(`HEIGHT=${process.env['HEIGHT']}`); + } + if (typeof process.env['FD_HOST'] === 'undefined') { + log.error('Please include a FD_HOST value with the host that the fd socket server is hosted on in .env'); + process.exit(4); + } + else { + log.info(`FD_HOST=${process.env['FD_HOST']}`); + } + if (typeof process.env['FD_PORT'] === 'undefined') { + log.error('Please include a FD_PORT value with the port that the fd socket server is hosted in in .env'); + process.exit(5); + } + else { + log.info(`FD_PORT=${process.env['FD_PORT']}`); + } } async function main() { - let shell = new shell_1.Shell(['../filmout_display/build/bin/fd', '2560', '1600'], logfdstd, logfdstderr, null, true); - shell.execute(); - await (0, delay_1.delay)(5000); - shell.kill(); - process.exit(); + settings(); + fd = new fd_1.FD(process.env['FD'], parseInt(process.env['WIDTH']), parseInt(process.env['HEIGHT']), process.env['FD_HOST'], parseInt(process.env['FD_PORT'])); } main(); //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map index 8048d77..a4e8b40 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,yBAAsB;AAgBtB,+BAAiC;AAEjC,mCAAgC;AAChC,mCAAgC;AAEhC,IAAI,GAAG,GAAY,IAAA,eAAS,EAAC,IAAI,CAAC,CAAC;AACnC,IAAI,KAAK,GAAY,IAAA,eAAS,EAAC,IAAI,CAAC,CAAC;AAErC,GAAG,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;AAErC,SAAS,QAAQ,CAAE,IAAU;IAC5B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAClB,CAAC;AACD,SAAS,WAAW,CAAE,IAAU;IAC/B,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,IAAI;IAClB,IAAI,KAAK,GAAW,IAAI,aAAK,CAAC,CAAE,iCAAiC,EAAE,MAAM,EAAE,MAAM,CAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACxH,KAAK,CAAC,OAAO,EAAE,CAAC;IAChB,MAAM,IAAA,aAAK,EAAC,IAAI,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,EAAE,CAAC;IACb,OAAO,CAAC,IAAI,EAAE,CAAC;AAChB,CAAC;AAED,IAAI,EAAE,CAAA"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,yBAAsB;AAgBtB,+BAAiC;AAIjC,6BAA0B;AAG1B,IAAI,EAAO,CAAC;AAEZ,IAAI,GAAG,GAAY,IAAA,eAAS,EAAC,IAAI,CAAC,CAAC;AAEnC,GAAG,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;AAErC,SAAS,QAAQ;IAChB,IAAI,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,WAAW,EAAE,CAAC;QAC9C,GAAG,CAAC,KAAK,CAAC,0EAA0E,CAAC,CAAC;QACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;SAAM,CAAC;QACP,GAAG,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,WAAW,EAAE,CAAC;QACjD,GAAG,CAAC,KAAK,CAAC,uFAAuF,CAAC,CAAC;QACnG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;SAAM,CAAC;QACP,GAAG,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,WAAW,EAAE,CAAC;QAClD,GAAG,CAAC,KAAK,CAAC,yFAAyF,CAAC,CAAC;QACrG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;SAAM,CAAC;QACP,GAAG,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,WAAW,EAAE,CAAC;QACnD,GAAG,CAAC,KAAK,CAAC,6FAA6F,CAAC,CAAC;QACzG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;SAAM,CAAC;QACP,GAAG,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,WAAW,EAAE,CAAC;QACnD,GAAG,CAAC,KAAK,CAAC,6FAA6F,CAAC,CAAA;QACxG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;SAAM,CAAC;QACP,GAAG,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC;AACF,CAAC;AAED,KAAK,UAAU,IAAI;IAClB,QAAQ,EAAE,CAAC;IACX,EAAE,GAAG,IAAI,OAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAC9J,CAAC;AAED,IAAI,EAAE,CAAC"} \ No newline at end of file diff --git a/dist/shell/index.js b/dist/shell/index.js index c958c2e..cd8f910 100644 --- a/dist/shell/index.js +++ b/dist/shell/index.js @@ -18,19 +18,24 @@ class Shell { this.stderr = stderr; this.silent = silent; this.after = after; - this.log = (0, log_1.createLog)(bin); + if (!this.silent) + this.log = (0, log_1.createLog)(bin); } async execute() { return new Promise((resolve, reject) => { this.child = (0, child_process_1.spawn)(this.bin, this.args); - this.log.info(`Shell: ${this.bin} ${this.args.join(' ')}`); + if (!this.silent) + this.log.info(`Shell: ${this.bin} ${this.args.join(' ')}`); this.child.stdout.on('data', (data) => { if (!this.silent) this.log.info(data.toString()); if (this.after !== null) this.lines.push(data); if (this.stdio !== null) { - this.stdio(data.toString()); + let lines = data.toString().split(os_1.EOL).filter(el => el.trim() !== ''); + for (let line of lines) { + this.stdio(line); + } } }); this.child.stderr.on('data', (data) => { @@ -45,18 +50,21 @@ class Shell { this.after(this.lines.join(os_1.EOL)); } if (code === 0) { - this.log.info(`Complete: ${this.bin} ${this.args.join(' ')}`); + if (!this.silent) + this.log.info(`Complete: ${this.bin} ${this.args.join(' ')}`); return resolve(code); } else { - this.log.error(`Error executing: ${this.bin} ${this.args.join(' ')}`); + if (!this.silent) + this.log.error(`Error executing: ${this.bin} ${this.args.join(' ')}`); return reject(code); } }); }); } kill() { - this.log.warn(`Killing: ${this.bin} ${this.args.join(' ')}`); + if (!this.silent) + this.log.warn(`Killing: ${this.bin} ${this.args.join(' ')}`); //this.child.stdin.pause(); this.child.kill(); } diff --git a/dist/shell/index.js.map b/dist/shell/index.js.map index 83447e6..9fd94f7 100644 --- a/dist/shell/index.js.map +++ b/dist/shell/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/shell/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/shell/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/fd/index.ts b/src/fd/index.ts new file mode 100644 index 0000000..4f30fb4 --- /dev/null +++ b/src/fd/index.ts @@ -0,0 +1,92 @@ +import type { Logger } from 'winston'; +import net from 'net'; +import type { Socket } from 'net'; +import { createLog } from '../log' +import { Shell } from '../shell'; +import { delay } from '../delay'; + +export class FD { + private bin : string; + private width : number; + private height : number; + private host : string; + private port : number; + private shell : Shell; + private log : Logger; + private client : Socket; + private socketAvailable : boolean = false; + private socketConnected : boolean = false; + + constructor (bin: string, width : number, height : number, host : string, port : number) { + this.bin = bin; + this.width = width; + this.height = height; + this.host = host; + this.port = port; + this.log = createLog('fd'); + this.shell = new Shell([ this.bin, `${this.width}`, `${this.height}` ], this.logstd.bind(this), this.logsterr.bind(this), null, true); + this.startDisplay(); + this.startClient(); + this.test(); + } + + private async startDisplay () { + this.log.info(`Launching fd binary ${this.bin}`); + this.shell.execute(); + } + + private async startClient () { + this.client = new net.Socket(); + this.log.info(`Waiting for TCP socket server on ${this.host}:${this.port}...`); + while (!this.socketAvailable) { + await delay(10); + } + this.log.info(`TCP socket server on ${this.host}:${this.port} is available`); + this.client.connect(this.port, this.host, async function () { + this.socketConnected = true; + this.log.info(`TCP socket client connected to ${this.host}:${this.port}`); + /*const data = { + action : 1, + image: 'filename.tif', + }; + this.log.info('SENDING'); + this.log.info(data); + this.client.write(JSON.stringify(data)); + await delay(2000); + data.action = 2; + this.log.info('SENDING'); + this.log.info(data); + this.client.write(JSON.stringify(data));*/ + }.bind(this)); + + this.client.on('data', (data : string) => { + this.log.info('RECEIVED'); + this.log.info(data.toString()); + }); + + this.client.on('close', () => { + this.log.info('Closing connection'); + }); + + this.client.on('error', (err : Error) => { + this.log.error('Error:', err); + }); + } + + private logstd ( data : string ) { + this.log.info(data); + if (data.indexOf('TCP server listening on port') !== -1 && data.indexOf(`${this.port}`) !== -1) { + this.socketAvailable = true; + } + } + + private logsterr ( data : string) { + this.log.error(data); + } + + private async test () { + await delay(10000); + this.shell.kill(); + } +} + diff --git a/src/index.ts b/src/index.ts index 36a6dd2..d8f9e73 100644 --- a/src/index.ts +++ b/src/index.ts @@ -18,25 +18,51 @@ import { createLog } from './log' import { sendMail } from './mail'; import { Shell } from './shell'; import { delay } from './delay'; +import { FD } from './fd'; + + +let fd : FD; let log : Logger = createLog('fm'); -let logfd : Logger = createLog('fd'); log.info('Starting filmout_manager'); -function logfdstd (data : any) { - logfd.info(data); -} -function logfdstderr (data : any) { - logfd.error(data); +function settings () { + if (typeof process.env['FD'] === 'undefined') { + log.error('Please include an FD value containing the path to your fd binary in .env'); + process.exit(1); + } else { + log.info(`FD=${process.env['FD']}`); + } + if (typeof process.env['WIDTH'] === 'undefined') { + log.error('Please include a WIDTH value containing the width of the screen you are using in .env'); + process.exit(2); + } else { + log.info(`WIDTH=${process.env['WIDTH']}`); + } + if (typeof process.env['HEIGHT'] === 'undefined') { + log.error('Please include a HEIGHT value containing the height of the screen you are using in .env'); + process.exit(3); + } else { + log.info(`HEIGHT=${process.env['HEIGHT']}`); + } + if (typeof process.env['FD_HOST'] === 'undefined') { + log.error('Please include a FD_HOST value with the host that the fd socket server is hosted on in .env'); + process.exit(4); + } else { + log.info(`FD_HOST=${process.env['FD_HOST']}`); + } + if (typeof process.env['FD_PORT'] === 'undefined') { + log.error('Please include a FD_PORT value with the port that the fd socket server is hosted in in .env') + process.exit(5); + } else { + log.info(`FD_PORT=${process.env['FD_PORT']}`); + } } async function main () { - let shell : Shell = new Shell([ '../filmout_display/build/bin/fd', '2560', '1600' ], logfdstd, logfdstderr, null, true); - shell.execute(); - await delay(5000); - shell.kill(); - process.exit(); + settings(); + fd = new FD(process.env['FD'], parseInt(process.env['WIDTH']), parseInt(process.env['HEIGHT']), process.env['FD_HOST'], parseInt(process.env['FD_PORT'])); } -main() \ No newline at end of file +main(); \ No newline at end of file diff --git a/src/shell/index.ts b/src/shell/index.ts index f289b86..97d0590 100644 --- a/src/shell/index.ts +++ b/src/shell/index.ts @@ -22,20 +22,23 @@ export class Shell { this.stderr = stderr; this.silent = silent; this.after = after; - this.log = createLog(bin); + if (!this.silent) this.log = createLog(bin); } public async execute () : Promise { return new Promise((resolve : Function, reject : Function) => { this.child = spawn(this.bin, this.args); - this.log.info(`Shell: ${this.bin} ${this.args.join(' ')}`); + if (!this.silent) this.log.info(`Shell: ${this.bin} ${this.args.join(' ')}`); this.child.stdout.on('data', (data : string) => { if (!this.silent) this.log.info(data.toString()); if (this.after !== null) this.lines.push(data); if (this.stdio !== null) { - this.stdio(data.toString()); + let lines : string[] = data.toString().split(EOL).filter( el => el.trim() !== ''); + for (let line of lines) { + this.stdio(line); + } } }); @@ -51,10 +54,10 @@ export class Shell { this.after(this.lines.join(EOL)); } if (code === 0) { - this.log.info(`Complete: ${this.bin} ${this.args.join(' ')}`); + if (!this.silent) this.log.info(`Complete: ${this.bin} ${this.args.join(' ')}`); return resolve(code); } else { - this.log.error(`Error executing: ${this.bin} ${this.args.join(' ')}`); + if (!this.silent) this.log.error(`Error executing: ${this.bin} ${this.args.join(' ')}`); return reject(code); } }); @@ -62,7 +65,7 @@ export class Shell { } public kill () { - this.log.warn(`Killing: ${this.bin} ${this.args.join(' ')}`); + if (!this.silent) this.log.warn(`Killing: ${this.bin} ${this.args.join(' ')}`); //this.child.stdin.pause(); this.child.kill(); }