From 6d206695e99f62e875ab6eb5d23256bd29a61dc3 Mon Sep 17 00:00:00 2001 From: Yusuke Miyazaki Date: Sat, 13 Feb 2016 23:12:03 +0900 Subject: [PATCH 1/7] Update ESLint --- .eslintrc.yml | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.eslintrc.yml b/.eslintrc.yml index 43d0809..c811c3b 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -13,8 +13,8 @@ rules: - always no-unused-vars: - 1 -ecmaFeatures: - modules: true +parserOptions: + sourceType: module env: es6: true node: true diff --git a/package.json b/package.json index 5e09126..f6a8782 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,6 @@ "yargs": "~3.32.0" }, "devDependencies": { - "eslint": "~1.10.3" + "eslint": "~2.0.0" } } From ee98fee9ebed70ea5a1acc003a9d0c20de4c2b3b Mon Sep 17 00:00:00 2001 From: Yusuke Miyazaki Date: Sat, 13 Feb 2016 23:20:22 +0900 Subject: [PATCH 2/7] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index f75b436..3326b9b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # now-client-camera [![Build Status](https://travis-ci.org/camphor-/now-client-camera.svg?branch=master)](https://travis-ci.org/camphor-/now-client-camera) +[![Dependency Status](https://david-dm.org/camphor-/now-client-camera.svg)](https://david-dm.org/camphor-/now-client-camera) +[![devDependency Status](https://david-dm.org/camphor-/now-client-camera/dev-status.svg)](https://david-dm.org/camphor-/now-client-camera#info=devDependencies) ## Run Examples: From 054264e6061a585903a7900a687d25b44b46d661 Mon Sep 17 00:00:00 2001 From: Yusuke Miyazaki Date: Thu, 18 Feb 2016 18:09:29 +0900 Subject: [PATCH 3/7] Refactor - Rename: mode -> driver - Split files --- README.md | 10 +++-- app.js | 87 +++++++++++++++------------------------ lib/drivers/raspistill.js | 16 +++++++ lib/drivers/sample.js | 11 +++++ 4 files changed, 68 insertions(+), 56 deletions(-) create mode 100644 lib/drivers/raspistill.js create mode 100644 lib/drivers/sample.js diff --git a/README.md b/README.md index 3326b9b..0a68655 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,10 @@ ## Run Examples: -- `npm start -- --mode=raspistill http://192.168.1.128:3000` -- `DEBUG=now-client-camera npm start -- --mode=sample http://192.168.1.128:3000` -- `npm start -- --mode=sample --authorization='Basic ' http://192.168.1.128:3000` +- `npm start -- --driver=raspistill http://192.168.1.128:3000` +- `DEBUG=now-client-camera npm start -- --driver=sample http://192.168.1.128:3000` +- `npm start -- --driver=sample --authorization='Basic ' http://192.168.1.128:3000` + +### Drivers +- `raspistill` - Raspberry Pi Camera Module +- `sample` - Sample JPEG image diff --git a/app.js b/app.js index 7eebd64..5c77d0e 100644 --- a/app.js +++ b/app.js @@ -1,9 +1,10 @@ import {argv} from 'yargs'; import debugLogger from 'debug'; -import {execSync} from 'child_process'; -import {readFile} from 'fs'; import io from 'socket.io-client'; +import raspistill from './lib/drivers/raspistill'; +import sampleFile from './lib/drivers/sample'; + // Constants const NAMESPACE = '/camera'; @@ -11,26 +12,26 @@ const NAMESPACE = '/camera'; const debug = debugLogger('now-client-camera'); // Parse command line arguments -let parseMode = (mode) => { - const _mode = (mode || '').toLowerCase(); - switch (_mode) { +let parseDriver = (driver) => { + const _driver = (driver || '').toLowerCase(); + switch (_driver) { case 'raspistill': - return _mode; + return _driver; case 'sample': - return _mode; + return _driver; default: return 'sample'; } }; const url = argv._[0] || 'http://localhost:3000'; -const mode = parseMode(argv.mode); +const driver = parseDriver(argv.driver); const authorization = argv.authorization; // Start debug(`Server URL: ${url}`); debug(`Namespace: ${NAMESPACE}`); -debug(`Mode: ${mode}`); +debug(`Driver: ${driver}`); const extraHeaders = {}; if (authorization) { @@ -49,52 +50,32 @@ socket.on('disconnect', () => { debug('disconnected'); }); -let raspistill = (responseEvent) => { - try { - const picture = execSync('raspistill -w 320 -h 240 -n -e jpg -o -'); - debug('success'); - socket.emit(responseEvent, { - success: true, - data: picture - }); - } catch (e) { - const message = e.toString(); - debug(`error: ${message}`); - socket.emit(responseEvent, { - success: false, - message: message - }); - } -}; - -let sampleFile = (responseEvent) => { - readFile('./test.jpg', (err, data) => { - if (err) { +socket.on('take picture', (data) => { + debug('take picture'); + const responseEvent = data.responseEvent; + (() => { + switch (driver) { + case 'sample': + return sampleFile; + case 'raspistill': + return raspistill; + default: + return sampleFile; + } + })()().then( + (pictureData) => { + debug('success'); + socket.emit(responseEvent, { + success: true, + data: pictureData + }); + }, + (errorMessage) => { + debug(`error: ${errorMessage}`); socket.emit(responseEvent, { success: false, - message: err.toString() + message: errorMessage }); - return; } - socket.emit(responseEvent, { - success: true, - data: data - }); - }); -}; - -socket.on('take picture', (data) => { - debug('take picture'); - const responseEvent = data.responseEvent; - switch (mode) { - case 'sample': - sampleFile(responseEvent); - break; - case 'raspistill': - raspistill(responseEvent); - break; - default: - sampleFile(responseEvent); - break; - } + ); }); diff --git a/lib/drivers/raspistill.js b/lib/drivers/raspistill.js new file mode 100644 index 0000000..979400b --- /dev/null +++ b/lib/drivers/raspistill.js @@ -0,0 +1,16 @@ +import {exec} from 'child_process'; + +const MAX_BUFFER = 1 * 1024 * 1024; // 1MiB + +export default () => new Promise((resolve, reject) => { + exec('raspistill -w 320 -h 240 -n -e jpg -o -', { + encoding: 'buffer', + maxBuffer: MAX_BUFFER + }, (err, stdout, stderr) => { + if (err === null) { + resolve(stdout); + } else { + reject(err.toString()); + } + }); +}); diff --git a/lib/drivers/sample.js b/lib/drivers/sample.js new file mode 100644 index 0000000..1076f4a --- /dev/null +++ b/lib/drivers/sample.js @@ -0,0 +1,11 @@ +import {readFile} from 'fs'; + +export default () => new Promise((resolve, reject) => { + readFile('./test.jpg', (err, data) => { + if (err) { + reject(err.toString()); + } else { + resolve(data); + } + }); +}); From 887a129c413fe2bdb3d3b0fb082a9fe43341c5b1 Mon Sep 17 00:00:00 2001 From: Yusuke Miyazaki Date: Thu, 18 Feb 2016 18:44:08 +0900 Subject: [PATCH 4/7] Set width & height w/ raspistill driver --- README.md | 13 +++++++++++-- lib/drivers/raspistill.js | 14 +++++++++++++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0a68655..2ff615f 100644 --- a/README.md +++ b/README.md @@ -11,5 +11,14 @@ Examples: - `npm start -- --driver=sample --authorization='Basic ' http://192.168.1.128:3000` ### Drivers -- `raspistill` - Raspberry Pi Camera Module -- `sample` - Sample JPEG image +Specify a driver with `--driver=` option. (default: `sample`) + +#### raspistill +Raspberry Pi Camera Module + +Environment variables: +- `RASPISTILL_WIDTH` - Width of a picture (default: 320) +- `RASPISTILL_HEIGHT` - Height of a picture (default: 240) + +#### sample +Sample JPEG image diff --git a/lib/drivers/raspistill.js b/lib/drivers/raspistill.js index 979400b..f56e723 100644 --- a/lib/drivers/raspistill.js +++ b/lib/drivers/raspistill.js @@ -2,8 +2,20 @@ import {exec} from 'child_process'; const MAX_BUFFER = 1 * 1024 * 1024; // 1MiB +const parseInteger = (string, defaultValue) => { + const number = Number(string); + if (Number.isInteger(number)) { + return number; + } else { + return defaultValue; + } +}; + +const WIDTH = parseInteger(process.env.RASPISTILL_WIDTH, 320); +const HEIGHT = parseInteger(process.env.RASPISTILL_HEIGHT, 240); + export default () => new Promise((resolve, reject) => { - exec('raspistill -w 320 -h 240 -n -e jpg -o -', { + exec(`raspistill -w ${WIDTH} -h ${HEIGHT} -n -e jpg -o -`, { encoding: 'buffer', maxBuffer: MAX_BUFFER }, (err, stdout, stderr) => { From fb2f5c986f85adca0a2f55c044d85ce1bcff43da Mon Sep 17 00:00:00 2001 From: Yusuke Miyazaki Date: Thu, 18 Feb 2016 18:52:48 +0900 Subject: [PATCH 5/7] Update preset for babel --- .babelrc | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.babelrc b/.babelrc index c13c5f6..944ed78 100644 --- a/.babelrc +++ b/.babelrc @@ -1,3 +1,3 @@ { - "presets": ["es2015"] + "presets": ["es2015-node5"] } diff --git a/package.json b/package.json index f6a8782..b6ebcda 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "dependencies": { "babel": "~6.5.1", "babel-cli": "~6.5.1", - "babel-preset-es2015": "~6.5.0", + "babel-preset-es2015-node5": "~1.1.2", "debug": "~2.2.0", "socket.io-client": "~1.4.5", "yargs": "~3.32.0" From 57e96a90d62cf8fa99d7ec863767a4c13c58ca4e Mon Sep 17 00:00:00 2001 From: Yusuke Miyazaki Date: Thu, 18 Feb 2016 19:00:59 +0900 Subject: [PATCH 6/7] Update dependencies --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index b6ebcda..dbded86 100644 --- a/package.json +++ b/package.json @@ -12,9 +12,9 @@ "babel-preset-es2015-node5": "~1.1.2", "debug": "~2.2.0", "socket.io-client": "~1.4.5", - "yargs": "~3.32.0" + "yargs": "~4.1.0" }, "devDependencies": { - "eslint": "~2.0.0" + "eslint": "~2.1.0" } } From 7c0ecb6583d54e9d76acd85e7fe1aeb715e4962c Mon Sep 17 00:00:00 2001 From: Yusuke Miyazaki Date: Thu, 18 Feb 2016 19:06:11 +0900 Subject: [PATCH 7/7] Bump version to 0.2.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dbded86..1da92b3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "now-client-camera", - "version": "0.1.0", + "version": "0.2.0", "private": true, "scripts": { "eslint": "./node_modules/eslint/bin/eslint.js .",