diff --git a/app/lib/cam/Readme.md b/app/lib/cam/Readme.md
new file mode 100644
index 0000000..3825697
--- /dev/null
+++ b/app/lib/cam/Readme.md
@@ -0,0 +1,49 @@
+
+
+## Camera
+class representing camera functions
+
+**Kind**: global class
+
+* [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)
+
+
+
+### camera.init()
+**Kind**: instance method of [Camera
](#Camera)
+
+
+### camera.listen()
+**Kind**: instance method of [Camera
](#Camera)
+
+
+### camera.set()
+**Kind**: instance method of [Camera
](#Camera)
+
+
+### camera.move()
+**Kind**: instance method of [Camera
](#Camera)
+
+
+### camera.exposure()
+**Kind**: instance method of [Camera
](#Camera)
+
+
+### camera.connectIntval()
+**Kind**: instance method of [Camera
](#Camera)
+
+
+### camera.listener()
+**Kind**: instance method of [Camera
](#Camera)
+
+
+### camera.end()
+**Kind**: instance method of [Camera
](#Camera)
diff --git a/app/lib/cam/index.js b/app/lib/cam/index.js
new file mode 100644
index 0000000..c757ccf
--- /dev/null
+++ b/app/lib/cam/index.js
@@ -0,0 +1,183 @@
+'use strict';
+Object.defineProperty(exports, "__esModule", { value: true });
+const Intval = require("intval");
+/** class representing camera functions **/
+class Camera {
+ /**
+ *
+ **/
+ constructor(arduino, cfg, ui) {
+ this.state = { dir: true, digital: false };
+ this.arduino = null;
+ this.intval = null;
+ this.arduino = arduino;
+ this.cfg = cfg;
+ this.ui = ui;
+ this.init();
+ }
+ /**
+ *
+ **/
+ async init() {
+ this.log = await require('log')({});
+ this.ipc = require('electron').ipcMain;
+ this.listen();
+ }
+ /**
+ *
+ **/
+ listen() {
+ this.ipc.on('cam', this.listener.bind(this));
+ this.ipc.on('intval', this.connectIntval.bind(this));
+ }
+ /**
+ *
+ **/
+ async set(dir, id) {
+ let cmd;
+ let ms;
+ if (dir) {
+ cmd = this.cfg.arduino.cmd.cam_forward;
+ }
+ else {
+ cmd = this.cfg.arduino.cmd.cam_backward;
+ }
+ this.state.dir = dir;
+ if (this.intval) {
+ try {
+ ms = await this.intval.setDir(dir);
+ }
+ catch (err) {
+ this.log.error(err);
+ }
+ }
+ else {
+ try {
+ ms = await this.arduino.send('camera', cmd);
+ }
+ catch (err) {
+ this.log.error(err);
+ }
+ }
+ return await this.end(cmd, id, ms);
+ }
+ /**
+ *
+ **/
+ async move(frame, id) {
+ const cmd = this.cfg.arduino.cmd.camera;
+ let ms;
+ //if (this.state.digital) {
+ //await this.dig.start()
+ //}
+ if (this.intval) {
+ try {
+ ms = await this.intval.move();
+ }
+ catch (err) {
+ this.log.error(err);
+ }
+ }
+ else {
+ try {
+ ms = await this.arduino.send('camera', cmd);
+ }
+ catch (err) {
+ this.log.error(err);
+ }
+ }
+ //if (this.state.digital) {
+ // await this.dig.end()
+ //}
+ this.log.info('Camera move time', { ms });
+ return this.end(cmd, id, ms);
+ }
+ /**
+ *
+ **/
+ exposure(exposure, id) {
+ let cmd = 'E';
+ this.intval.setExposure('camera', exposure, (ms) => {
+ this.end(cmd, id, ms);
+ });
+ }
+ /**
+ *
+ **/
+ async connectIntval(event, arg) {
+ return new Promise((resolve, reject) => {
+ if (arg.connect) {
+ this.intval = new Intval(arg.url);
+ this.intval.connect((err, ms, state) => {
+ if (err) {
+ this.ui.send('intval', { connected: false });
+ this.log.info(`Cannot connect to ${arg.url}`, 'INTVAL');
+ this.intval = null;
+ }
+ else {
+ this.ui.send('intval', { connected: true, url: arg.url, state: state });
+ this.log.info(`Connected to INTVAL3 @ ${arg.url}`, 'INTVAL');
+ }
+ return resolve(true);
+ });
+ }
+ else if (arg.disconnect) {
+ this.intval = null;
+ return resolve(false);
+ }
+ });
+ }
+ /**
+ *
+ **/
+ async listener(event, arg) {
+ if (typeof arg.dir !== 'undefined') {
+ try {
+ await this.set(arg.dir, arg.id);
+ }
+ catch (err) {
+ console.trace();
+ this.log.error(err);
+ }
+ }
+ else if (typeof arg.frame !== 'undefined') {
+ try {
+ await this.move(arg.frame, arg.id);
+ }
+ catch (err) {
+ console.trace();
+ this.log.error(err);
+ }
+ }
+ event.returnValue = true;
+ }
+ /**
+ *
+ **/
+ async end(cmd, id, ms) {
+ let message = '';
+ if (cmd === this.cfg.arduino.cmd.cam_forward) {
+ message = 'Camera set to FORWARD';
+ }
+ else if (cmd === this.cfg.arduino.cmd.cam_backward) {
+ message = 'Camera set to BACKWARD';
+ }
+ else if (cmd === this.cfg.arduino.cmd.camera) {
+ message = 'Camera ';
+ if (this.state.dir) {
+ message += 'ADVANCED';
+ }
+ else {
+ message += 'REWOUND';
+ }
+ message += ' 1 frame';
+ }
+ this.log.info(message, 'CAMERA', true, true);
+ this.ui.send('cam', { cmd: cmd, id: id, ms: ms });
+ }
+ ;
+}
+module.exports = function (arduino, cfg, ui) {
+ return new Camera(arduino, cfg, ui);
+};
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/app/lib/cam/index.js.map b/app/lib/cam/index.js.map
new file mode 100644
index 0000000..5a02f24
--- /dev/null
+++ b/app/lib/cam/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cam/index.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/app/lib/cam/package.json b/app/lib/cam/package.json
new file mode 100644
index 0000000..980dbbd
--- /dev/null
+++ b/app/lib/cam/package.json
@@ -0,0 +1,11 @@
+{
+ "name": "cam",
+ "version": "1.0.0",
+ "description": "",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "author": "",
+ "license": "ISC"
+}
diff --git a/app/lib/ui/cam.js b/app/lib/ui/cam.js
index a376387..8d01f8e 100644
--- a/app/lib/ui/cam.js
+++ b/app/lib/ui/cam.js
@@ -1,4 +1,4 @@
-var cam = {};
+const cam = {};
cam.queue = {};
cam.lock = false;
diff --git a/cli/lib/cam/index.js b/cli/lib/cam/index.js
new file mode 100644
index 0000000..c757ccf
--- /dev/null
+++ b/cli/lib/cam/index.js
@@ -0,0 +1,183 @@
+'use strict';
+Object.defineProperty(exports, "__esModule", { value: true });
+const Intval = require("intval");
+/** class representing camera functions **/
+class Camera {
+ /**
+ *
+ **/
+ constructor(arduino, cfg, ui) {
+ this.state = { dir: true, digital: false };
+ this.arduino = null;
+ this.intval = null;
+ this.arduino = arduino;
+ this.cfg = cfg;
+ this.ui = ui;
+ this.init();
+ }
+ /**
+ *
+ **/
+ async init() {
+ this.log = await require('log')({});
+ this.ipc = require('electron').ipcMain;
+ this.listen();
+ }
+ /**
+ *
+ **/
+ listen() {
+ this.ipc.on('cam', this.listener.bind(this));
+ this.ipc.on('intval', this.connectIntval.bind(this));
+ }
+ /**
+ *
+ **/
+ async set(dir, id) {
+ let cmd;
+ let ms;
+ if (dir) {
+ cmd = this.cfg.arduino.cmd.cam_forward;
+ }
+ else {
+ cmd = this.cfg.arduino.cmd.cam_backward;
+ }
+ this.state.dir = dir;
+ if (this.intval) {
+ try {
+ ms = await this.intval.setDir(dir);
+ }
+ catch (err) {
+ this.log.error(err);
+ }
+ }
+ else {
+ try {
+ ms = await this.arduino.send('camera', cmd);
+ }
+ catch (err) {
+ this.log.error(err);
+ }
+ }
+ return await this.end(cmd, id, ms);
+ }
+ /**
+ *
+ **/
+ async move(frame, id) {
+ const cmd = this.cfg.arduino.cmd.camera;
+ let ms;
+ //if (this.state.digital) {
+ //await this.dig.start()
+ //}
+ if (this.intval) {
+ try {
+ ms = await this.intval.move();
+ }
+ catch (err) {
+ this.log.error(err);
+ }
+ }
+ else {
+ try {
+ ms = await this.arduino.send('camera', cmd);
+ }
+ catch (err) {
+ this.log.error(err);
+ }
+ }
+ //if (this.state.digital) {
+ // await this.dig.end()
+ //}
+ this.log.info('Camera move time', { ms });
+ return this.end(cmd, id, ms);
+ }
+ /**
+ *
+ **/
+ exposure(exposure, id) {
+ let cmd = 'E';
+ this.intval.setExposure('camera', exposure, (ms) => {
+ this.end(cmd, id, ms);
+ });
+ }
+ /**
+ *
+ **/
+ async connectIntval(event, arg) {
+ return new Promise((resolve, reject) => {
+ if (arg.connect) {
+ this.intval = new Intval(arg.url);
+ this.intval.connect((err, ms, state) => {
+ if (err) {
+ this.ui.send('intval', { connected: false });
+ this.log.info(`Cannot connect to ${arg.url}`, 'INTVAL');
+ this.intval = null;
+ }
+ else {
+ this.ui.send('intval', { connected: true, url: arg.url, state: state });
+ this.log.info(`Connected to INTVAL3 @ ${arg.url}`, 'INTVAL');
+ }
+ return resolve(true);
+ });
+ }
+ else if (arg.disconnect) {
+ this.intval = null;
+ return resolve(false);
+ }
+ });
+ }
+ /**
+ *
+ **/
+ async listener(event, arg) {
+ if (typeof arg.dir !== 'undefined') {
+ try {
+ await this.set(arg.dir, arg.id);
+ }
+ catch (err) {
+ console.trace();
+ this.log.error(err);
+ }
+ }
+ else if (typeof arg.frame !== 'undefined') {
+ try {
+ await this.move(arg.frame, arg.id);
+ }
+ catch (err) {
+ console.trace();
+ this.log.error(err);
+ }
+ }
+ event.returnValue = true;
+ }
+ /**
+ *
+ **/
+ async end(cmd, id, ms) {
+ let message = '';
+ if (cmd === this.cfg.arduino.cmd.cam_forward) {
+ message = 'Camera set to FORWARD';
+ }
+ else if (cmd === this.cfg.arduino.cmd.cam_backward) {
+ message = 'Camera set to BACKWARD';
+ }
+ else if (cmd === this.cfg.arduino.cmd.camera) {
+ message = 'Camera ';
+ if (this.state.dir) {
+ message += 'ADVANCED';
+ }
+ else {
+ message += 'REWOUND';
+ }
+ message += ' 1 frame';
+ }
+ this.log.info(message, 'CAMERA', true, true);
+ this.ui.send('cam', { cmd: cmd, id: id, ms: ms });
+ }
+ ;
+}
+module.exports = function (arduino, cfg, ui) {
+ return new Camera(arduino, cfg, ui);
+};
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/cli/lib/cam/index.js.map b/cli/lib/cam/index.js.map
new file mode 100644
index 0000000..5a02f24
--- /dev/null
+++ b/cli/lib/cam/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cam/index.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/cli/lib/cam/package.json b/cli/lib/cam/package.json
new file mode 100644
index 0000000..980dbbd
--- /dev/null
+++ b/cli/lib/cam/package.json
@@ -0,0 +1,11 @@
+{
+ "name": "cam",
+ "version": "1.0.0",
+ "description": "",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "author": "",
+ "license": "ISC"
+}
diff --git a/lib/cam/index.js b/lib/cam/index.js
new file mode 100644
index 0000000..c757ccf
--- /dev/null
+++ b/lib/cam/index.js
@@ -0,0 +1,183 @@
+'use strict';
+Object.defineProperty(exports, "__esModule", { value: true });
+const Intval = require("intval");
+/** class representing camera functions **/
+class Camera {
+ /**
+ *
+ **/
+ constructor(arduino, cfg, ui) {
+ this.state = { dir: true, digital: false };
+ this.arduino = null;
+ this.intval = null;
+ this.arduino = arduino;
+ this.cfg = cfg;
+ this.ui = ui;
+ this.init();
+ }
+ /**
+ *
+ **/
+ async init() {
+ this.log = await require('log')({});
+ this.ipc = require('electron').ipcMain;
+ this.listen();
+ }
+ /**
+ *
+ **/
+ listen() {
+ this.ipc.on('cam', this.listener.bind(this));
+ this.ipc.on('intval', this.connectIntval.bind(this));
+ }
+ /**
+ *
+ **/
+ async set(dir, id) {
+ let cmd;
+ let ms;
+ if (dir) {
+ cmd = this.cfg.arduino.cmd.cam_forward;
+ }
+ else {
+ cmd = this.cfg.arduino.cmd.cam_backward;
+ }
+ this.state.dir = dir;
+ if (this.intval) {
+ try {
+ ms = await this.intval.setDir(dir);
+ }
+ catch (err) {
+ this.log.error(err);
+ }
+ }
+ else {
+ try {
+ ms = await this.arduino.send('camera', cmd);
+ }
+ catch (err) {
+ this.log.error(err);
+ }
+ }
+ return await this.end(cmd, id, ms);
+ }
+ /**
+ *
+ **/
+ async move(frame, id) {
+ const cmd = this.cfg.arduino.cmd.camera;
+ let ms;
+ //if (this.state.digital) {
+ //await this.dig.start()
+ //}
+ if (this.intval) {
+ try {
+ ms = await this.intval.move();
+ }
+ catch (err) {
+ this.log.error(err);
+ }
+ }
+ else {
+ try {
+ ms = await this.arduino.send('camera', cmd);
+ }
+ catch (err) {
+ this.log.error(err);
+ }
+ }
+ //if (this.state.digital) {
+ // await this.dig.end()
+ //}
+ this.log.info('Camera move time', { ms });
+ return this.end(cmd, id, ms);
+ }
+ /**
+ *
+ **/
+ exposure(exposure, id) {
+ let cmd = 'E';
+ this.intval.setExposure('camera', exposure, (ms) => {
+ this.end(cmd, id, ms);
+ });
+ }
+ /**
+ *
+ **/
+ async connectIntval(event, arg) {
+ return new Promise((resolve, reject) => {
+ if (arg.connect) {
+ this.intval = new Intval(arg.url);
+ this.intval.connect((err, ms, state) => {
+ if (err) {
+ this.ui.send('intval', { connected: false });
+ this.log.info(`Cannot connect to ${arg.url}`, 'INTVAL');
+ this.intval = null;
+ }
+ else {
+ this.ui.send('intval', { connected: true, url: arg.url, state: state });
+ this.log.info(`Connected to INTVAL3 @ ${arg.url}`, 'INTVAL');
+ }
+ return resolve(true);
+ });
+ }
+ else if (arg.disconnect) {
+ this.intval = null;
+ return resolve(false);
+ }
+ });
+ }
+ /**
+ *
+ **/
+ async listener(event, arg) {
+ if (typeof arg.dir !== 'undefined') {
+ try {
+ await this.set(arg.dir, arg.id);
+ }
+ catch (err) {
+ console.trace();
+ this.log.error(err);
+ }
+ }
+ else if (typeof arg.frame !== 'undefined') {
+ try {
+ await this.move(arg.frame, arg.id);
+ }
+ catch (err) {
+ console.trace();
+ this.log.error(err);
+ }
+ }
+ event.returnValue = true;
+ }
+ /**
+ *
+ **/
+ async end(cmd, id, ms) {
+ let message = '';
+ if (cmd === this.cfg.arduino.cmd.cam_forward) {
+ message = 'Camera set to FORWARD';
+ }
+ else if (cmd === this.cfg.arduino.cmd.cam_backward) {
+ message = 'Camera set to BACKWARD';
+ }
+ else if (cmd === this.cfg.arduino.cmd.camera) {
+ message = 'Camera ';
+ if (this.state.dir) {
+ message += 'ADVANCED';
+ }
+ else {
+ message += 'REWOUND';
+ }
+ message += ' 1 frame';
+ }
+ this.log.info(message, 'CAMERA', true, true);
+ this.ui.send('cam', { cmd: cmd, id: id, ms: ms });
+ }
+ ;
+}
+module.exports = function (arduino, cfg, ui) {
+ return new Camera(arduino, cfg, ui);
+};
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/lib/cam/index.js.map b/lib/cam/index.js.map
new file mode 100644
index 0000000..5a02f24
--- /dev/null
+++ b/lib/cam/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cam/index.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/lib/cam/package.json b/lib/cam/package.json
new file mode 100644
index 0000000..980dbbd
--- /dev/null
+++ b/lib/cam/package.json
@@ -0,0 +1,11 @@
+{
+ "name": "cam",
+ "version": "1.0.0",
+ "description": "",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "author": "",
+ "license": "ISC"
+}
diff --git a/src/cam/index.ts b/src/cam/index.ts
new file mode 100644
index 0000000..b1a49bd
--- /dev/null
+++ b/src/cam/index.ts
@@ -0,0 +1,183 @@
+'use strict';
+
+import Intval = require('intval');
+
+/** class representing camera functions **/
+
+class Camera {
+ private state : any = { dir : true, digital : false };
+ private arduino : Arduino = null;
+ private intval : any = null;
+ private log : any;
+ private cfg : any;
+ private ui : any;
+ private ipc : any;
+ /**
+ *
+ **/
+ constructor (arduino : Arduino, cfg : any, ui : any) {
+ this.arduino = arduino;
+ this.cfg = cfg;
+ this.ui = ui;
+ this.init();
+ }
+
+ /**
+ *
+ **/
+ private async init () {
+ this.log = await require('log')({});
+ this.ipc = require('electron').ipcMain;
+ this.listen();
+ }
+
+ /**
+ *
+ **/
+ private listen () {
+ this.ipc.on('cam', this.listener.bind(this));
+ this.ipc.on('intval', this.connectIntval.bind(this));
+ }
+
+ /**
+ *
+ **/
+ public async set (dir : boolean, id : string) {
+ let cmd : string;
+ let ms : number;
+
+ if (dir) {
+ cmd = this.cfg.arduino.cmd.cam_forward;
+ } else {
+ cmd = this.cfg.arduino.cmd.cam_backward;
+ }
+ this.state.dir = dir;
+
+ if (this.intval) {
+ try {
+ ms = await this.intval.setDir(dir);
+ } catch (err) {
+ this.log.error(err);
+ }
+ } else {
+ try {
+ ms = await this.arduino.send('camera', cmd);
+ } catch (err) {
+ this.log.error(err);
+ }
+ }
+ return await this.end(cmd, id, ms);
+ }
+
+ /**
+ *
+ **/
+ public async move (frame : number, id : string) {
+ const cmd : string = this.cfg.arduino.cmd.camera;
+ let ms : number;
+ //if (this.state.digital) {
+ //await this.dig.start()
+ //}
+ if (this.intval) {
+ try {
+ ms = await this.intval.move();
+ } catch (err) {
+ this.log.error(err);
+ }
+ } else {
+ try {
+ ms = await this.arduino.send('camera', cmd);
+ } catch (err) {
+ this.log.error(err);
+ }
+ }
+ //if (this.state.digital) {
+ // await this.dig.end()
+ //}
+ this.log.info('Camera move time', { ms });
+ return this.end(cmd, id, ms);
+ }
+
+ /**
+ *
+ **/
+ public exposure (exposure : number, id : string) {
+ let cmd : string = 'E';
+ this.intval.setExposure('camera', exposure, (ms : number) => {
+ this.end(cmd, id, ms);
+ });
+ }
+
+ /**
+ *
+ **/
+ private async connectIntval (event : any, arg : any) {
+ return new Promise((resolve, reject) => {
+ if (arg.connect) {
+ this.intval = new Intval(arg.url)
+ this.intval.connect((err : any, ms : number, state : boolean) => {
+ if (err) {
+ this.ui.send('intval', { connected : false })
+ this.log.info(`Cannot connect to ${arg.url}`, 'INTVAL')
+ this.intval = null
+ } else {
+ this.ui.send('intval', { connected : true, url : arg.url, state : state })
+ this.log.info(`Connected to INTVAL3 @ ${arg.url}`, 'INTVAL')
+ }
+ return resolve(true)
+ })
+ } else if (arg.disconnect) {
+ this.intval = null
+ return resolve(false)
+ }
+ })
+ }
+
+ /**
+ *
+ **/
+ private async listener (event : any, arg : any) {
+ if (typeof arg.dir !== 'undefined') {
+ try {
+ await this.set(arg.dir, arg.id)
+ } catch (err) {
+ console.trace()
+ this.log.error(err)
+ }
+ } else if (typeof arg.frame !== 'undefined') {
+ try {
+ await this.move(arg.frame, arg.id)
+ } catch (err) {
+ console.trace()
+ this.log.error(err)
+ }
+ }
+ event.returnValue = true
+ }
+
+ /**
+ *
+ **/
+ private async end (cmd : string, id : string, ms : number) {
+ let message = ''
+ if (cmd === this.cfg.arduino.cmd.cam_forward) {
+ message = 'Camera set to FORWARD'
+ } else if (cmd === this.cfg.arduino.cmd.cam_backward) {
+ message = 'Camera set to BACKWARD'
+ } else if (cmd === this.cfg.arduino.cmd.camera) {
+ message = 'Camera '
+ if (this.state.dir) {
+ message += 'ADVANCED'
+ } else {
+ message += 'REWOUND'
+ }
+ message += ' 1 frame'
+ }
+ this.log.info(message, 'CAMERA', true, true)
+ this.ui.send('cam', {cmd: cmd, id : id, ms: ms})
+ };
+}
+
+module.exports = function (arduino : Arduino, cfg : any, ui : any) {
+ return new Camera(arduino, cfg, ui);
+}
\ No newline at end of file