Merge branch 'master' of https://github.com/sixteenmillimeter/mcopy
This commit is contained in:
commit
0a28c84ef9
|
@ -1,4 +1,3 @@
|
||||||
data/cfg.json
|
|
||||||
node_modules/*
|
node_modules/*
|
||||||
logs/*
|
logs/*
|
||||||
data/transfer*.json
|
data/transfer*.json
|
|
@ -1,3 +1,6 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
electron-packager . mcopy --overwrite --asar=true --platform=linux --arch=x64 --icon=assets/icons/icon.png --prune=true --out=../dist
|
#package app
|
||||||
|
./node_modules/.bin/electron-packager . mcopy --overwrite --asar=true --platform=linux --arch=x64 --icon=assets/icons/icon.png --prune=true --out=../dist
|
||||||
|
#build a .deb installer
|
||||||
|
./node_modules/.bin/electron-installer-debian --src ../dist/mcopy-linux-x64/ --dest ../dist/installers/ --arch amd64
|
|
@ -1,3 +1,9 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
electron-packager . --overwrite --platform=darwin --arch=x64 --icon=assets/icons/icon.icns --prune=true --out=../dist
|
./node_modules/.bin/electron-packager . --overwrite --platform=darwin --arch=x64 --icon=assets/icons/icon.icns --prune=true --out=../dist
|
||||||
|
#build dmg for mac install
|
||||||
|
mkdir ../dist/installers
|
||||||
|
./node_modules/.bin/electron-installer-dmg ../dist/mcopy-darwin-x64 mcopy --out=../dist/installers --icon=assets/icons/icon.icns Path to the icon file that will be the app icon in the DMG window.
|
||||||
|
# --icon-size=<px> How big to make the icon for the app in the DMG. [Default: `80`].
|
||||||
|
# --background=<path> Path to a PNG image to use as the background of the DMG.
|
||||||
|
#--overwrite Overwrite any existing DMG.
|
|
@ -1,3 +1,5 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
electron-packager . mcopy --overwrite --asar=true --platform=win32 --arch=x64 --icon=assets/icons/win/icon.ico --prune=true --out=../dist --version-string.CompanyName="sixteenmillimeter.com" --version-string.FileDescription="Open Source Optical Printer Platform" --version-string.ProductName="mcopy"
|
./node_modules/.bin/electron-packager . mcopy --overwrite --asar=true --platform=win32 --arch=x64 --icon=assets/icons/win/icon.ico --prune=true --out=../dist --version-string.CompanyName="sixteenmillimeter.com" --version-string.FileDescription="Open Source Optical Printer Platform" --version-string.ProductName="mcopy"
|
||||||
|
|
||||||
|
mkdir ../dist/installers
|
|
@ -545,6 +545,7 @@ button:focus {
|
||||||
.cmd {
|
.cmd {
|
||||||
width: 240px;
|
width: 240px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
margin: 0 auto;
|
||||||
}
|
}
|
||||||
.cmd i {
|
.cmd i {
|
||||||
float: left;
|
float: left;
|
||||||
|
@ -589,6 +590,58 @@ button:focus {
|
||||||
::-webkit-scrollbar-thumb:window-inactive {
|
::-webkit-scrollbar-thumb:window-inactive {
|
||||||
background: rgba(0, 0, 0, 0.05);
|
background: rgba(0, 0, 0, 0.05);
|
||||||
}
|
}
|
||||||
|
#settings > div {
|
||||||
|
width: 300px;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
#settings > div > div {
|
||||||
|
width: 360px;
|
||||||
|
}
|
||||||
|
#settings input[type=text],
|
||||||
|
#settings select {
|
||||||
|
display: block;
|
||||||
|
border-radius: 5px;
|
||||||
|
border: 2px solid #fff;
|
||||||
|
text-align: center;
|
||||||
|
background: transparent;
|
||||||
|
color: #fff;
|
||||||
|
padding: 8px 0;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 400;
|
||||||
|
display: inline-block;
|
||||||
|
padding: 6px 12px;
|
||||||
|
font-size: 21px;
|
||||||
|
min-width: 300px;
|
||||||
|
}
|
||||||
|
#settings input[type=text] span,
|
||||||
|
#settings select span {
|
||||||
|
display: block;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 200;
|
||||||
|
}
|
||||||
|
#settings input[type=text]:active,
|
||||||
|
#settings select:active,
|
||||||
|
#settings input[type=text] .active,
|
||||||
|
#settings select .active {
|
||||||
|
background: #fff;
|
||||||
|
color: #272b30;
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
#settings input[type=text]:focus,
|
||||||
|
#settings select:focus {
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
#settings button {
|
||||||
|
margin-top: -1px;
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
#settings input[type=radio] {
|
||||||
|
float: right;
|
||||||
|
margin-right: 20px;
|
||||||
|
}
|
||||||
|
#settings .spacer {
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
#log {
|
#log {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
{
|
||||||
|
"version" : "2.0.0",
|
||||||
|
"ext_port" : 1111,
|
||||||
|
"arduino" : {
|
||||||
|
"baud" : 57600,
|
||||||
|
"board" : "uno",
|
||||||
|
"serialDelay" : 20,
|
||||||
|
"sequenceDelay" : 100,
|
||||||
|
"cam" : {
|
||||||
|
"time" : 750,
|
||||||
|
"delay" : 50,
|
||||||
|
"momentary" : 300
|
||||||
|
},
|
||||||
|
"proj" : {
|
||||||
|
"time" : 1300,
|
||||||
|
"delay" : 50,
|
||||||
|
"momentary" : 300
|
||||||
|
},
|
||||||
|
"black" : {
|
||||||
|
"before" : 250,
|
||||||
|
"after" : 250
|
||||||
|
},
|
||||||
|
"cmd" : {
|
||||||
|
"debug" : "d",
|
||||||
|
"connect": "i",
|
||||||
|
"light" : "l",
|
||||||
|
"camera" : "c",
|
||||||
|
"projector" : "p",
|
||||||
|
"black" : "b",
|
||||||
|
"cam_forward" : "e",
|
||||||
|
"cam_backward" : "f",
|
||||||
|
"proj_forward" : "g",
|
||||||
|
"proj_backward" : "h",
|
||||||
|
"proj_identifier" : "j",
|
||||||
|
"cam_identifier" : "k",
|
||||||
|
"mcopy_identifier" : "m",
|
||||||
|
"cam_timed" : "n",
|
||||||
|
"proj_identifier" : "j",
|
||||||
|
"cam_identifier" : "k",
|
||||||
|
"light_identifier" : "o",
|
||||||
|
"proj_light_identifier" : "q",
|
||||||
|
"proj_cam_light_identifier" : "r",
|
||||||
|
"proj_cam_identifier" : "s"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -11,7 +11,7 @@
|
||||||
<link href="./css/monokai.css" rel="stylesheet">
|
<link href="./css/monokai.css" rel="stylesheet">
|
||||||
<link href="./css/app.css" rel="stylesheet">
|
<link href="./css/app.css" rel="stylesheet">
|
||||||
</head>
|
</head>
|
||||||
<body onload="init();">
|
<body onload="init();" style="background:#272b30;">
|
||||||
<nav id="toolbar"></nav>
|
<nav id="toolbar"></nav>
|
||||||
<div id="screens">
|
<div id="screens">
|
||||||
<div id="sequencer" class="screen" style="display: block;">
|
<div id="sequencer" class="screen" style="display: block;">
|
||||||
|
@ -213,24 +213,38 @@
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
<div id="settings" class="screen">
|
<div id="settings" class="screen">
|
||||||
<h4>Devices</h4>
|
<div>
|
||||||
<select id="devices">
|
<div>
|
||||||
|
<h4>Devices</h4>
|
||||||
</select>
|
<select id="devices">
|
||||||
<button title="Refresh devices"><i class="fa fa-refresh"></i></button>
|
<option>Not Set</option>
|
||||||
<h4>Projector</h4>
|
</select>
|
||||||
<select id="projector_device">
|
<button title="Refresh devices"><i class="fa fa-refresh"></i></button>
|
||||||
|
</div>
|
||||||
</select>
|
<div>
|
||||||
<h4>Camera</h4>
|
<h4>Projector</h4>
|
||||||
<select id="camera_device">
|
<select id="projector_device">
|
||||||
|
<option>Not Set</option>
|
||||||
</select>
|
</select>
|
||||||
<input type="text" id="intval" name="intval" placeholder="INTVAL3 URL"/>
|
</div>
|
||||||
<h4>Light</h4>
|
<div>
|
||||||
<select id="light_device">
|
<h4>Camera</h4>
|
||||||
|
<select id="camera_device">
|
||||||
</select>
|
<option>Not Set</option>
|
||||||
|
</select>
|
||||||
|
<input type="radio" name="camera_type" value="arduino" checked="checked" />
|
||||||
|
</div>
|
||||||
|
<div class="spacer">
|
||||||
|
<input type="text" id="intval" name="intval" placeholder="INTVAL3 URL"/>
|
||||||
|
<input type="radio" name="camera_type" value="intval" />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h4>Light</h4>
|
||||||
|
<select id="light_device">
|
||||||
|
<option>Not Set</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="overlay" onclick="gui.overlay(false);gui.spinner(false);"></div>
|
<div id="overlay" onclick="gui.overlay(false);gui.spinner(false);"></div>
|
||||||
|
|
|
@ -3,4 +3,3 @@
|
||||||
npm install -g gulp electron
|
npm install -g gulp electron
|
||||||
npm install
|
npm install
|
||||||
./node_modules/.bin/electron-rebuild
|
./node_modules/.bin/electron-rebuild
|
||||||
mkdir logs
|
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
@import "./seq.less";
|
@import "./seq.less";
|
||||||
@import "./cmd.less";
|
@import "./cmd.less";
|
||||||
@import "./scroll.less";
|
@import "./scroll.less";
|
||||||
|
@import "./settings.less";
|
||||||
|
|
||||||
#log{
|
#log{
|
||||||
position: fixed;
|
position: fixed;
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
.cmd{
|
.cmd{
|
||||||
width: 240px;
|
width: 240px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
margin: 0 auto;
|
||||||
i{
|
i{
|
||||||
float: left;
|
float: left;
|
||||||
margin-right: 5px;
|
margin-right: 5px;
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
#settings{
|
||||||
|
> div{
|
||||||
|
width: 300px;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
> div > div{
|
||||||
|
width: 360px;
|
||||||
|
}
|
||||||
|
input[type=text], select{
|
||||||
|
.button();
|
||||||
|
display: inline-block;
|
||||||
|
padding: 6px 12px;
|
||||||
|
font-size: 21px;
|
||||||
|
min-width: 300px;
|
||||||
|
}
|
||||||
|
button{
|
||||||
|
margin-top: -1px;
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
input[type=radio]{
|
||||||
|
float: right;
|
||||||
|
margin-right: 20px;
|
||||||
|
}
|
||||||
|
.spacer{
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,7 +1,11 @@
|
||||||
'use strict'
|
'use strict'
|
||||||
|
|
||||||
const SerialPort = require('serialport')
|
const SerialPort = require('serialport')
|
||||||
|
const Readline = SerialPort.parsers.Readline
|
||||||
const exec = require('child_process').exec
|
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 eventEmitter
|
||||||
|
|
||||||
const mcopy = {}
|
const mcopy = {}
|
||||||
|
@ -109,8 +113,8 @@ mcopy.arduino.connect = function (serial, device, confirm, callback) {
|
||||||
mcopy.arduino.alias[serial] = device;
|
mcopy.arduino.alias[serial] = device;
|
||||||
mcopy.arduino.serial[device] = new SerialPort(mcopy.arduino.path[serial], {
|
mcopy.arduino.serial[device] = new SerialPort(mcopy.arduino.path[serial], {
|
||||||
autoOpen : false,
|
autoOpen : false,
|
||||||
baudrate: mcopy.cfg.arduino.baud,
|
baudRate: mcopy.cfg.arduino.baud,
|
||||||
parser: SerialPort.parsers.readline("\n")
|
parser: parser
|
||||||
});
|
});
|
||||||
mcopy.arduino.serial[device].open(error => {
|
mcopy.arduino.serial[device].open(error => {
|
||||||
if (error) {
|
if (error) {
|
||||||
|
@ -120,13 +124,15 @@ mcopy.arduino.connect = function (serial, device, confirm, callback) {
|
||||||
console.log(`Opened connection with ${mcopy.arduino.path[serial]} as ${serial}`);
|
console.log(`Opened connection with ${mcopy.arduino.path[serial]} as ${serial}`);
|
||||||
if (!confirm) {
|
if (!confirm) {
|
||||||
mcopy.arduino.serial[device].on('data', data => {
|
mcopy.arduino.serial[device].on('data', data => {
|
||||||
data = data.replace('\r', '')
|
let d = data.toString('utf8')
|
||||||
mcopy.arduino.end(data)
|
d = d.replace(newlineRe, '').replace(returnRe, '')
|
||||||
|
mcopy.arduino.end(d)
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
mcopy.arduino.serial[device].on('data', data => {
|
mcopy.arduino.serial[device].on('data', data => {
|
||||||
data = data.replace('\r', '')
|
let d = data.toString('utf8')
|
||||||
mcopy.arduino.confirmEnd(data)
|
d = d.replace(newlineRe, '').replace(returnRe, '')
|
||||||
|
mcopy.arduino.confirmEnd(d)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
if (callback) {
|
if (callback) {
|
||||||
|
@ -138,6 +144,7 @@ mcopy.arduino.connect = function (serial, device, confirm, callback) {
|
||||||
|
|
||||||
mcopy.arduino.confirmExec = {};
|
mcopy.arduino.confirmExec = {};
|
||||||
mcopy.arduino.confirmEnd = function (data) {
|
mcopy.arduino.confirmEnd = function (data) {
|
||||||
|
//console.dir(data)
|
||||||
if (data === mcopy.cfg.arduino.cmd.connect
|
if (data === mcopy.cfg.arduino.cmd.connect
|
||||||
|| data === mcopy.cfg.arduino.cmd.proj_identifier
|
|| data === mcopy.cfg.arduino.cmd.proj_identifier
|
||||||
|| data === mcopy.cfg.arduino.cmd.cam_identifier
|
|| data === mcopy.cfg.arduino.cmd.cam_identifier
|
||||||
|
|
|
@ -1,9 +1,12 @@
|
||||||
'use strict'
|
'use strict'
|
||||||
|
|
||||||
const os = require('os')
|
const os = require('os')
|
||||||
|
const path = require('os')
|
||||||
const sqlite3 = require('sqlite3')
|
const sqlite3 = require('sqlite3')
|
||||||
const squel = require('squel')
|
const squel = require('squel')
|
||||||
|
|
||||||
|
const PATH = path.join(os.homedir(), '.mcopy/mcopy.db')
|
||||||
|
|
||||||
const actionTable = `CREATE TABLE IF NOT EXISTS actions (
|
const actionTable = `CREATE TABLE IF NOT EXISTS actions (
|
||||||
time INTEGER PRIMARY KEY,
|
time INTEGER PRIMARY KEY,
|
||||||
type TEXT,
|
type TEXT,
|
||||||
|
@ -11,6 +14,21 @@ const actionTable = `CREATE TABLE IF NOT EXISTS actions (
|
||||||
counter INTEGER,
|
counter INTEGER,
|
||||||
light TEXT,
|
light TEXT,
|
||||||
dir INTEGER,
|
dir INTEGER,
|
||||||
sequence INTEGER
|
sequence INTEGER,
|
||||||
|
device TEXT
|
||||||
|
);`
|
||||||
|
|
||||||
);`
|
var checkDir = function () {
|
||||||
|
const dir = path.join(os.homedir(), '.mcopy/')
|
||||||
|
if (!fs.existsSync(dir)) {
|
||||||
|
fs.mkdirSync(dir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class DB {
|
||||||
|
constructor () {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = DB
|
||||||
|
|
|
@ -11,7 +11,7 @@ class Intval {
|
||||||
const timeStart = +new Date()
|
const timeStart = +new Date()
|
||||||
const baseUrl = devices[device]
|
const baseUrl = devices[device]
|
||||||
const url = `${baseUrl}/frame`
|
const url = `${baseUrl}/frame`
|
||||||
console.log(url)
|
//console.log(url)
|
||||||
req(url, (err, res, body) => {
|
req(url, (err, res, body) => {
|
||||||
let ms = (+new Date()) - timeStart
|
let ms = (+new Date()) - timeStart
|
||||||
if (err) {
|
if (err) {
|
||||||
|
@ -24,7 +24,7 @@ class Intval {
|
||||||
const timeStart = +new Date()
|
const timeStart = +new Date()
|
||||||
const baseUrl = devices[device]
|
const baseUrl = devices[device]
|
||||||
const url = `${baseUrl}/dir?dir=${dir}`
|
const url = `${baseUrl}/dir?dir=${dir}`
|
||||||
console.log(url)
|
//console.log(url)
|
||||||
req(url, (err, res, body) => {
|
req(url, (err, res, body) => {
|
||||||
let ms = (+new Date()) - timeStart
|
let ms = (+new Date()) - timeStart
|
||||||
if (err) {
|
if (err) {
|
||||||
|
@ -38,7 +38,7 @@ class Intval {
|
||||||
const timeStart = +new Date()
|
const timeStart = +new Date()
|
||||||
const baseUrl = devices[device]
|
const baseUrl = devices[device]
|
||||||
const url = `${baseUrl}/exposure?exposure=${exposure}`
|
const url = `${baseUrl}/exposure?exposure=${exposure}`
|
||||||
console.log(url)
|
//console.log(url)
|
||||||
req(url, (err, res, body) => {
|
req(url, (err, res, body) => {
|
||||||
let ms = (+new Date()) - timeStart
|
let ms = (+new Date()) - timeStart
|
||||||
if (err) {
|
if (err) {
|
||||||
|
|
|
@ -9,63 +9,67 @@ let proj
|
||||||
let light
|
let light
|
||||||
|
|
||||||
class Server {
|
class Server {
|
||||||
constructor (mcopy) {
|
constructor (camera, projector, light) {
|
||||||
restify = require('restify')
|
restify = require('restify')
|
||||||
os = require('os')
|
os = require('os')
|
||||||
app = express()
|
app = restify.createServer({
|
||||||
|
name: 'mcopy-server',
|
||||||
|
version: '2.0.0'
|
||||||
|
})
|
||||||
|
|
||||||
|
this.ip = this.getIp()
|
||||||
|
|
||||||
this.getIp()
|
/*app.get('/', function (req, res) {
|
||||||
app.get('/', function (req, res) {
|
|
||||||
mcopy.mobile.log('Device connected');
|
mcopy.mobile.log('Device connected');
|
||||||
res.send(fs.readFileSync('tmpl/mcopy_index.html', 'utf8'));
|
res.send(fs.readFileSync('tmpl/mcopy_index.html', 'utf8'));
|
||||||
|
})
|
||||||
|
app.get('/js/mcopy_mobile.js', function (req, res) {
|
||||||
|
res.send(fs.readFileSync('js/mcopy_mobile.js', 'utf8'));
|
||||||
});
|
});
|
||||||
app.get('/js/mcopy_mobile.js', function (req, res) {
|
app.get('/js/jquery.js', function (req, res) {
|
||||||
res.send(fs.readFileSync('js/mcopy_mobile.js', 'utf8'));
|
res.send(fs.readFileSync('js/jquery.js', 'utf8'));
|
||||||
});
|
});
|
||||||
app.get('/js/jquery.js', function (req, res) {
|
app.get('/cmd/:cmd', function (req, res) {
|
||||||
res.send(fs.readFileSync('js/jquery.js', 'utf8'));
|
var cmd,
|
||||||
});
|
success = function (res) {
|
||||||
app.get('/cmd/:cmd', function (req, res) {
|
var obj = {
|
||||||
var cmd,
|
success: true,
|
||||||
success = function (res) {
|
cmd : cmd,
|
||||||
var obj = {
|
cam : mcopy.state.camera,
|
||||||
success: true,
|
proj : mcopy.state.projector
|
||||||
cmd : cmd,
|
}
|
||||||
cam : mcopy.state.camera,
|
res.json(obj);
|
||||||
proj : mcopy.state.projector
|
};
|
||||||
|
if (typeof req.params.cmd !== 'undefined') {
|
||||||
|
mcopy.log('Receiving command from mobile: ' + req.params.cmd);
|
||||||
|
cmd = req.params.cmd;
|
||||||
|
if (cmd === 'CF'){
|
||||||
|
mcopy.cmd.cam_forward(success);
|
||||||
|
} else if (cmd === 'CB') {
|
||||||
|
mcopy.cmd.cam_backward(success);
|
||||||
|
} else if (cmd === 'PF') {
|
||||||
|
mcopy.cmd.proj_forward(success);
|
||||||
|
} else if (cmd === 'PB') {
|
||||||
|
mcopy.cmd.proj_backward(success);
|
||||||
|
} else {
|
||||||
|
mcopy.mobile.fail(res, 'Command ' + cmd + ' not found');
|
||||||
}
|
}
|
||||||
res.json(obj);
|
|
||||||
};
|
|
||||||
if (typeof req.params.cmd !== 'undefined') {
|
|
||||||
mcopy.log('Receiving command from mobile: ' + req.params.cmd);
|
|
||||||
cmd = req.params.cmd;
|
|
||||||
if (cmd === 'CF'){
|
|
||||||
mcopy.cmd.cam_forward(success);
|
|
||||||
} else if (cmd === 'CB') {
|
|
||||||
mcopy.cmd.cam_backward(success);
|
|
||||||
} else if (cmd === 'PF') {
|
|
||||||
mcopy.cmd.proj_forward(success);
|
|
||||||
} else if (cmd === 'PB') {
|
|
||||||
mcopy.cmd.proj_backward(success);
|
|
||||||
} else {
|
} else {
|
||||||
mcopy.mobile.fail(res, 'Command ' + cmd + ' not found');
|
mcopy.mobile.fail(res, 'No command provided');
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
mcopy.mobile.fail(res, 'No command provided');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
app.get('/state', function (req, res) {
|
|
||||||
res.json({
|
|
||||||
cam: mcopy.state.camera,
|
|
||||||
proj: mcopy.state.projector
|
|
||||||
});
|
});
|
||||||
});
|
app.get('/state', function (req, res) {
|
||||||
var http = require('http');
|
res.json({
|
||||||
http.createServer(app).listen(mcopy.cfg.ext_port);
|
cam: mcopy.state.camera,
|
||||||
|
proj: mcopy.state.projector
|
||||||
|
});
|
||||||
|
});*/
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
end () {
|
end () {
|
||||||
app.close()
|
app.close()
|
||||||
|
app = null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
'use strict'
|
|
||||||
|
|
||||||
const os = require('os');
|
const os = require('os');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
|
@ -11,42 +9,61 @@ settings.state = {
|
||||||
port : 1111,
|
port : 1111,
|
||||||
enabled : true
|
enabled : true
|
||||||
},
|
},
|
||||||
|
devices : [],
|
||||||
camera : {},
|
camera : {},
|
||||||
projector : {},
|
projector : {},
|
||||||
light : {}
|
light : {}
|
||||||
}
|
}
|
||||||
|
|
||||||
settings.checkDir = function () {
|
settings.checkDir = function () {
|
||||||
const dir = path.join(os.homedir(), '.mcopy/')
|
'use strict'
|
||||||
|
const dir = path.join(os.homedir(), '.mcopy/');
|
||||||
if (!fs.existsSync(dir)) {
|
if (!fs.existsSync(dir)) {
|
||||||
fs.mkdirSync(dir);
|
fs.mkdirSync(dir);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
settings.save = function () {
|
settings.save = function () {
|
||||||
|
'use strict'
|
||||||
const str = JSON.stringify(settings.state, null, '\t');
|
const str = JSON.stringify(settings.state, null, '\t');
|
||||||
settings.checkDir()
|
settings.checkDir();
|
||||||
fs.writeFile(settings.file, str, 'utf8', (err) => {
|
fs.writeFile(settings.file, str, 'utf8', (err) => {
|
||||||
if (err) console.error(err);
|
if (err) console.error(err);
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
settings.update = function (key, val) {
|
settings.update = function (key, val) {
|
||||||
settings.state[key] = val
|
'use strict'
|
||||||
|
settings.state[key] = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
settings.get = function (key) {
|
settings.get = function (key) {
|
||||||
return settings.state[key]
|
'use strict'
|
||||||
|
return settings.state[key];
|
||||||
|
}
|
||||||
|
|
||||||
|
settings.all = function () {
|
||||||
|
'use strict'
|
||||||
|
return settings.state;
|
||||||
}
|
}
|
||||||
|
|
||||||
settings.restore = function () {
|
settings.restore = function () {
|
||||||
let str
|
'use strict'
|
||||||
settings.checkDir()
|
let str;
|
||||||
|
settings.checkDir();
|
||||||
if (fs.existsSync(settings.file)) {
|
if (fs.existsSync(settings.file)) {
|
||||||
str = fs.readFileSync(settings.file, 'utf8')
|
str = fs.readFileSync(settings.file, 'utf8')
|
||||||
settings.state = JSON.parse(str)
|
settings.state = JSON.parse(str);
|
||||||
} else {
|
} else {
|
||||||
settings.save()
|
settings.save();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
settings.reset = function () {
|
||||||
|
'use strict'
|
||||||
|
if (fs.existsSync(settings.file)) {
|
||||||
|
fs.unlinkSync(settings.file);
|
||||||
|
}
|
||||||
|
settings.restore();
|
||||||
|
};
|
||||||
|
|
||||||
module.exports = settings
|
module.exports = settings
|
|
@ -3,9 +3,11 @@ var cmd = {};
|
||||||
cmd.proj_forward = function (callback) {
|
cmd.proj_forward = function (callback) {
|
||||||
'use strict';
|
'use strict';
|
||||||
var res = function (ms) {
|
var res = function (ms) {
|
||||||
|
$('#cmd_proj_forward').removeClass('active');
|
||||||
gui.updateState();
|
gui.updateState();
|
||||||
if (callback) { callback(ms); }
|
if (callback) { callback(ms); }
|
||||||
};
|
};
|
||||||
|
$('#cmd_proj_forward').addClass('active');
|
||||||
if (!mcopy.state.projector.direction) {
|
if (!mcopy.state.projector.direction) {
|
||||||
proj.set(true, function (ms) {
|
proj.set(true, function (ms) {
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
|
@ -21,9 +23,11 @@ cmd.proj_forward = function (callback) {
|
||||||
cmd.proj_backward = function (callback) {
|
cmd.proj_backward = function (callback) {
|
||||||
'use strict';
|
'use strict';
|
||||||
var res = function (ms) {
|
var res = function (ms) {
|
||||||
|
$('#cmd_proj_backward').removeClass('active');
|
||||||
gui.updateState();
|
gui.updateState();
|
||||||
if (callback) { callback(ms); }
|
if (callback) { callback(ms); }
|
||||||
};
|
};
|
||||||
|
$('#cmd_proj_backward').addClass('active');
|
||||||
if (mcopy.state.projector.direction) {
|
if (mcopy.state.projector.direction) {
|
||||||
proj.set(false, function (ms) {
|
proj.set(false, function (ms) {
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
|
@ -38,15 +42,18 @@ cmd.proj_backward = function (callback) {
|
||||||
};
|
};
|
||||||
cmd.cam_forward = function (rgb, callback) {
|
cmd.cam_forward = function (rgb, callback) {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
var off = [0, 0, 0];
|
||||||
var res = function (ms) {
|
var res = function (ms) {
|
||||||
gui.updateState();
|
gui.updateState();
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
light.display([0,0,0]);
|
light.display(off);
|
||||||
light.set([0, 0, 0], function () {
|
light.set(off, function () {
|
||||||
|
$('#cmd_cam_forward').removeClass('active');
|
||||||
if (callback) { callback(ms); }
|
if (callback) { callback(ms); }
|
||||||
});
|
});
|
||||||
}, mcopy.cfg.arduino.serialDelay);
|
}, mcopy.cfg.arduino.serialDelay);
|
||||||
};
|
};
|
||||||
|
$('#cmd_cam_forward').addClass('active');
|
||||||
if (!mcopy.state.camera.direction) {
|
if (!mcopy.state.camera.direction) {
|
||||||
cam.set(true, function () {
|
cam.set(true, function () {
|
||||||
setTimeout( function () {
|
setTimeout( function () {
|
||||||
|
@ -70,17 +77,43 @@ cmd.cam_forward = function (rgb, callback) {
|
||||||
cmd.black_forward = function (callback) {
|
cmd.black_forward = function (callback) {
|
||||||
'use strict';
|
'use strict';
|
||||||
var off = [0, 0, 0];
|
var off = [0, 0, 0];
|
||||||
cmd.cam_forward(off, callback);
|
var res = function (ms) {
|
||||||
|
$('#cmd_black_forward').removeClass('active');
|
||||||
|
gui.updateState();
|
||||||
|
};
|
||||||
|
$('#cmd_black_forward').addClass('active');
|
||||||
|
if (!mcopy.state.camera.direction) {
|
||||||
|
cam.set(true, function () {
|
||||||
|
setTimeout( function () {
|
||||||
|
light.display(off);
|
||||||
|
light.set(off, function () {
|
||||||
|
setTimeout( function () {
|
||||||
|
cam.move(res);
|
||||||
|
}, mcopy.cfg.arduino.serialDelay);
|
||||||
|
});
|
||||||
|
}, mcopy.cfg.arduino.serialDelay);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
light.display(off);
|
||||||
|
light.set(off, function () {
|
||||||
|
setTimeout(function () {
|
||||||
|
cam.move(res);
|
||||||
|
}, mcopy.cfg.arduino.serialDelay);
|
||||||
|
});
|
||||||
|
}
|
||||||
};
|
};
|
||||||
cmd.cam_backward = function (rgb, callback) {
|
cmd.cam_backward = function (rgb, callback) {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
var off = [0, 0, 0];
|
||||||
var res = function (ms) {
|
var res = function (ms) {
|
||||||
gui.updateState();
|
gui.updateState();
|
||||||
light.display([0,0,0]);
|
light.display(off);
|
||||||
light.set([0, 0, 0], function () {
|
light.set(off, function () {
|
||||||
|
$('#cmd_cam_backward').removeClass('active');
|
||||||
if (callback) { callback(ms); }
|
if (callback) { callback(ms); }
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
$('#cmd_cam_backward').addClass('active');
|
||||||
if (mcopy.state.camera.direction) {
|
if (mcopy.state.camera.direction) {
|
||||||
cam.set(false, function () {
|
cam.set(false, function () {
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
|
@ -102,7 +135,28 @@ cmd.cam_backward = function (rgb, callback) {
|
||||||
cmd.black_backward = function (callback) {
|
cmd.black_backward = function (callback) {
|
||||||
'use strict';
|
'use strict';
|
||||||
var off = [0, 0, 0];
|
var off = [0, 0, 0];
|
||||||
cmd.cam_backward(off, callback);
|
var res = function (ms) {
|
||||||
|
$('#cmd_black_backward').removeClass('active');
|
||||||
|
gui.updateState();
|
||||||
|
};
|
||||||
|
$('#cmd_black_backward').addClass('active');
|
||||||
|
if (mcopy.state.camera.direction) {
|
||||||
|
cam.set(false, function () {
|
||||||
|
setTimeout(function () {
|
||||||
|
light.display(off);
|
||||||
|
light.set(off, function () {
|
||||||
|
cam.move(res);
|
||||||
|
});
|
||||||
|
}, mcopy.cfg.arduino.serialDelay);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
setTimeout(function () {
|
||||||
|
light.display(off);
|
||||||
|
light.set(off, function () {
|
||||||
|
cam.move(res);
|
||||||
|
});
|
||||||
|
}, mcopy.cfg.arduino.serialDelay);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = cmd;
|
module.exports = cmd;
|
|
@ -8,22 +8,22 @@ devices.init = function () {
|
||||||
};
|
};
|
||||||
devices.listen = function () {
|
devices.listen = function () {
|
||||||
'use strict';
|
'use strict';
|
||||||
let opt
|
|
||||||
ipcRenderer.on('ready', function (event, arg) {
|
ipcRenderer.on('ready', devices.ready);
|
||||||
opt = $('<option>')
|
|
||||||
opt.value = arg.camera
|
|
||||||
opt.text = arg.camera
|
|
||||||
$('#camera_device').empty()
|
|
||||||
$('#camera_device').append(opt)
|
|
||||||
console.dir(arg)
|
|
||||||
devices.ready();
|
|
||||||
return event.returnValue = true;
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
devices.ready = function () {
|
devices.ready = function (event, arg) {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
let opt;
|
||||||
gui.spinner(false);
|
gui.spinner(false);
|
||||||
gui.overlay(false);
|
gui.overlay(false);
|
||||||
|
for (let i in arg) {
|
||||||
|
opt = $('<option>');
|
||||||
|
opt.val(arg[i]);
|
||||||
|
opt.text(arg[i]);
|
||||||
|
$(`#${i}_device`).empty();
|
||||||
|
$(`#${i}_device`).append(opt);
|
||||||
|
}
|
||||||
|
return event.returnValue = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = devices;
|
module.exports = devices;
|
51
app/main.js
51
app/main.js
|
@ -31,9 +31,8 @@ let log = {}
|
||||||
|
|
||||||
//console.log(process.version)
|
//console.log(process.version)
|
||||||
|
|
||||||
//cfg is now hardcoded, should only be modified by developers
|
|
||||||
//settings is now the source of user editable variables
|
|
||||||
mcopy.cfg = require('./data/cfg.json')
|
mcopy.cfg = require('./data/cfg.json')
|
||||||
|
mcopy.settings = {}
|
||||||
|
|
||||||
var enumerateDevices = function (err, devices) {
|
var enumerateDevices = function (err, devices) {
|
||||||
if (err) {
|
if (err) {
|
||||||
|
@ -61,6 +60,7 @@ var distinguishDevice = function (device, callback) {
|
||||||
return console.error(err)
|
return console.error(err)
|
||||||
}
|
}
|
||||||
log.info(`Verified ${device} as mcopy device`, 'SERIAL', true, true)
|
log.info(`Verified ${device} as mcopy device`, 'SERIAL', true, true)
|
||||||
|
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
arduino.distinguish(distinguishCb);
|
arduino.distinguish(distinguishCb);
|
||||||
}, 1000);
|
}, 1000);
|
||||||
|
@ -69,6 +69,8 @@ var distinguishDevice = function (device, callback) {
|
||||||
if (err) {
|
if (err) {
|
||||||
return console.error(err)
|
return console.error(err)
|
||||||
}
|
}
|
||||||
|
rememberDevice(device, type)
|
||||||
|
|
||||||
log.info(`Determined ${device} to be ${type}`, 'SERIAL', true, true)
|
log.info(`Determined ${device} to be ${type}`, 'SERIAL', true, true)
|
||||||
if (callback) { callback(err, type); }
|
if (callback) { callback(err, type); }
|
||||||
}
|
}
|
||||||
|
@ -155,6 +157,8 @@ var distinguishDevices = function (devices) {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
console.dir(mcopy.settings)
|
||||||
|
console.dir(checklist)
|
||||||
|
|
||||||
checklist = devices.map(device => {
|
checklist = devices.map(device => {
|
||||||
return next => {
|
return next => {
|
||||||
|
@ -182,6 +186,24 @@ var distinguishDevices = function (devices) {
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var rememberDevice = function (device, type) {
|
||||||
|
let deviceEntry
|
||||||
|
let match = mcopy.settings.devices.filter(dev => {
|
||||||
|
if (dev.arduino && dev.arduino === device) {
|
||||||
|
return dev
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (match.length === 0) {
|
||||||
|
deviceEntry = {
|
||||||
|
arduino : device,
|
||||||
|
type : type
|
||||||
|
}
|
||||||
|
mcopy.settings.devices.push(deviceEntry)
|
||||||
|
settings.update('devices', mcopy.settings.devices)
|
||||||
|
settings.save()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var devicesReady = function (projector, camera, light) {
|
var devicesReady = function (projector, camera, light) {
|
||||||
mainWindow.webContents.send('ready', {camera: camera, projector: projector, light: light })
|
mainWindow.webContents.send('ready', {camera: camera, projector: projector, light: light })
|
||||||
settings.update('camera', { arduino : camera })
|
settings.update('camera', { arduino : camera })
|
||||||
|
@ -291,7 +313,6 @@ cam.state = {
|
||||||
}
|
}
|
||||||
cam.init = function () {
|
cam.init = function () {
|
||||||
cam.listen()
|
cam.listen()
|
||||||
cam.intval = new Intval('camera', '192.168.1.224')
|
|
||||||
}
|
}
|
||||||
cam.set = function (dir, id) {
|
cam.set = function (dir, id) {
|
||||||
let cmd
|
let cmd
|
||||||
|
@ -304,14 +325,27 @@ cam.set = function (dir, id) {
|
||||||
arduino.send('camera', cmd, (ms) => {
|
arduino.send('camera', cmd, (ms) => {
|
||||||
cam.end(cmd, id, ms)
|
cam.end(cmd, id, ms)
|
||||||
})
|
})
|
||||||
|
/*
|
||||||
|
intval.setDir('camera', dir, (ms) => {
|
||||||
|
cam.end(cmd, id, ms)
|
||||||
|
})
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
cam.move = function (frame, id) {
|
cam.move = function (frame, id) {
|
||||||
let cmd = mcopy.cfg.arduino.cmd.camera
|
let cmd = mcopy.cfg.arduino.cmd.camera
|
||||||
/*arduino.send('camera', cmd, (ms) => {
|
arduino.send('camera', cmd, (ms) => {
|
||||||
cam.end(cmd, id, ms)
|
cam.end(cmd, id, ms)
|
||||||
})*/
|
})
|
||||||
cam.intval.move('camera', (ms) => {
|
/*
|
||||||
|
intval.move('camera', (ms) => {
|
||||||
|
cam.end(cmd, id, ms)
|
||||||
|
})
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
cam.exposure = function (exposure, id) {
|
||||||
|
intval.setDir('camera', exposure, (ms) => {
|
||||||
cam.end(cmd, id, ms)
|
cam.end(cmd, id, ms)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -414,8 +448,6 @@ transfer.listen = function () {
|
||||||
}
|
}
|
||||||
|
|
||||||
var init = function () {
|
var init = function () {
|
||||||
|
|
||||||
settings.restore()
|
|
||||||
|
|
||||||
createWindow()
|
createWindow()
|
||||||
//createMenu()
|
//createMenu()
|
||||||
|
@ -429,7 +461,10 @@ var init = function () {
|
||||||
|
|
||||||
arduino = require('./lib/arduino')(mcopy.cfg, ee)
|
arduino = require('./lib/arduino')(mcopy.cfg, ee)
|
||||||
mscript = require('./lib/mscript')
|
mscript = require('./lib/mscript')
|
||||||
|
|
||||||
|
|
||||||
|
settings.restore()
|
||||||
|
mcopy.settings = settings.all()
|
||||||
|
|
||||||
setTimeout( () => {
|
setTimeout( () => {
|
||||||
arduino.enumerate(enumerateDevices)
|
arduino.enumerate(enumerateDevices)
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -35,11 +35,11 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"async": "^2.6.0",
|
"async": "^2.6.0",
|
||||||
"electron": "^1.7.10",
|
"electron": "^1.8.2-beta.4",
|
||||||
"humanize-duration": "^3.10.0",
|
"humanize-duration": "^3.12.1",
|
||||||
"moment": "^2.17.1",
|
"moment": "^2.17.1",
|
||||||
"node-notifier": "^4.6.1",
|
"node-notifier": "^5.1.2",
|
||||||
"serialport": "^4.0.7",
|
"serialport": "^6.0.4",
|
||||||
"sqlite3": "^3.1.13",
|
"sqlite3": "^3.1.13",
|
||||||
"uuid": "^3.0.1",
|
"uuid": "^3.0.1",
|
||||||
"winston": "^2.3.0"
|
"winston": "^2.3.0"
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
volatile char cmd_char = 'z';
|
volatile char cmd_char = 'z';
|
||||||
|
|
||||||
|
const char cmd_id = 'i';
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
Serial.begin(57600);
|
Serial.begin(57600);
|
||||||
Serial.flush();
|
Serial.flush();
|
||||||
|
@ -17,7 +19,7 @@ void loop() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmd (char val) {
|
void cmd (char val) {
|
||||||
if (val == 'i') {
|
if (val == cmd_id) {
|
||||||
Serial.println("i");//End of action
|
Serial.println(cmd_id);//End of action
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,225 @@
|
||||||
|
//MCOPY firmware.
|
||||||
|
//Projector + Light
|
||||||
|
//
|
||||||
|
// LIGHT WIRING
|
||||||
|
// ARDUINO PIXIE
|
||||||
|
// GND -----> -
|
||||||
|
// PIN 3 -----> in
|
||||||
|
//
|
||||||
|
// POWER SUPPLY 5V PIXIE
|
||||||
|
// GND -----> -
|
||||||
|
// +5VDC -----> +
|
||||||
|
|
||||||
|
/*
|
||||||
|
PROJECTOR WIRING
|
||||||
|
----------------------------------------------------
|
||||||
|
Microswitch (use INPUT_PULLUP!!)
|
||||||
|
GND-----\ | \-----PIN
|
||||||
|
----------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
//LIGHT HEADERS
|
||||||
|
#include "SoftwareSerial.h"
|
||||||
|
#include "Adafruit_Pixie.h"
|
||||||
|
|
||||||
|
#define NUMPIXELS 1 // Number of Pixies in the strip
|
||||||
|
#define PIXIEPIN 6 // Pin number for SoftwareSerial output
|
||||||
|
|
||||||
|
SoftwareSerial pixieSerial(-1, PIXIEPIN);
|
||||||
|
Adafruit_Pixie light = Adafruit_Pixie(NUMPIXELS, &pixieSerial);
|
||||||
|
|
||||||
|
//PROJECTOR HEADERS
|
||||||
|
|
||||||
|
boolean debug_state = false;
|
||||||
|
|
||||||
|
//LIGHT VARIABLES
|
||||||
|
String color = "000,000,000";
|
||||||
|
|
||||||
|
volatile int commaR = 0;
|
||||||
|
volatile int commaG = 0;
|
||||||
|
|
||||||
|
String strR = "000";
|
||||||
|
String strG = "000";
|
||||||
|
String strB = "000";
|
||||||
|
|
||||||
|
volatile int r = 0;
|
||||||
|
volatile int g = 0;
|
||||||
|
volatile int b = 0;
|
||||||
|
|
||||||
|
unsigned long light_time;
|
||||||
|
|
||||||
|
//PROJECTOR VARIABLES
|
||||||
|
//const int proj_time = {{proj.time}};
|
||||||
|
//const int proj_delay = {{proj.delay}};
|
||||||
|
|
||||||
|
const int proj_fwd_pin = 8;
|
||||||
|
const int proj_bwd_pin = 9;
|
||||||
|
volatile boolean proj_running = false;
|
||||||
|
const int proj_micro_pin = 4;
|
||||||
|
volatile int proj_micro_raw;
|
||||||
|
boolean proj_dir = true;
|
||||||
|
|
||||||
|
//APP
|
||||||
|
unsigned long now; //to be compared to stored values every loop
|
||||||
|
|
||||||
|
const char cmd_light = 'l';
|
||||||
|
const char cmd_projector = 'p';
|
||||||
|
const char cmd_proj_forward = 'g';
|
||||||
|
const char cmd_proj_backward = 'h';
|
||||||
|
const char cmd_mcopy_identifier = 'm';
|
||||||
|
|
||||||
|
//for just proj
|
||||||
|
//const char cmd_proj_identifier = 'j';
|
||||||
|
//for proj + light
|
||||||
|
const char cmd_proj_identifier = 'q';
|
||||||
|
|
||||||
|
const char cmd_debug = 'd';
|
||||||
|
const char cmd_connect = 'i';
|
||||||
|
volatile char cmd_char = 'z';
|
||||||
|
const int serialDelay = 5;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(57600);
|
||||||
|
Serial.flush();
|
||||||
|
Serial.setTimeout(serialDelay);
|
||||||
|
|
||||||
|
pixieSerial.begin(115200); // Pixie REQUIRES this baud rate
|
||||||
|
light.setPixelColor(0, 0, 0, 0);
|
||||||
|
light.show();
|
||||||
|
|
||||||
|
pinMode(proj_micro_pin, INPUT_PULLUP);
|
||||||
|
pinMode(proj_fwd_pin, OUTPUT);
|
||||||
|
pinMode(proj_bwd_pin, OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
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';
|
||||||
|
}
|
||||||
|
now = millis();
|
||||||
|
if (proj_running) {
|
||||||
|
proj_reading();
|
||||||
|
}
|
||||||
|
//send light signal to pixie every second
|
||||||
|
if (now - light_time >= 1000) {
|
||||||
|
light.setPixelColor(0, r, g, b);
|
||||||
|
light.show();
|
||||||
|
light_time = now;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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_projector) {
|
||||||
|
proj_start();
|
||||||
|
} else if (val == cmd_proj_forward) {
|
||||||
|
proj_direction(true);
|
||||||
|
} else if (val == cmd_proj_backward) {
|
||||||
|
proj_direction(false);
|
||||||
|
} else if (val == cmd_light) {
|
||||||
|
light_set();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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_proj_identifier);
|
||||||
|
log("identify()");
|
||||||
|
}
|
||||||
|
|
||||||
|
void light_set () {
|
||||||
|
while (Serial.available() == 0) {
|
||||||
|
//Wait for color string
|
||||||
|
}
|
||||||
|
color = Serial.readString();
|
||||||
|
//Serial.println(color);
|
||||||
|
|
||||||
|
commaR = color.indexOf(','); //comma trailing R
|
||||||
|
commaG = color.indexOf(',', commaR + 1);
|
||||||
|
|
||||||
|
strR = color.substring(0, commaR);
|
||||||
|
strG = color.substring(commaR + 1, commaG);
|
||||||
|
strB = color.substring(commaG + 1);
|
||||||
|
|
||||||
|
r = strR.toInt();
|
||||||
|
g = strG.toInt();
|
||||||
|
b = strB.toInt();
|
||||||
|
|
||||||
|
light.setPixelColor(0, r, g, b);
|
||||||
|
light.show();
|
||||||
|
|
||||||
|
Serial.println(cmd_light);//confirm light change
|
||||||
|
log(color);
|
||||||
|
}
|
||||||
|
|
||||||
|
void proj_start () {
|
||||||
|
if (proj_dir) {
|
||||||
|
digitalWrite(proj_fwd_pin, HIGH);
|
||||||
|
digitalWrite(proj_bwd_pin, LOW);
|
||||||
|
} else {
|
||||||
|
digitalWrite(proj_bwd_pin, HIGH);
|
||||||
|
digitalWrite(proj_fwd_pin, LOW);
|
||||||
|
}
|
||||||
|
proj_running = true;
|
||||||
|
delay(500); // Let bump pass out of microswitch
|
||||||
|
|
||||||
|
//delay(1300); //TEMPORARY DELAY FOR TESTING TIMING
|
||||||
|
}
|
||||||
|
|
||||||
|
void proj_reading () {
|
||||||
|
proj_micro_raw = digitalRead(proj_micro_pin);
|
||||||
|
if (proj_micro_raw == 1) {
|
||||||
|
//do nothing
|
||||||
|
} else if (proj_micro_raw == 0) {
|
||||||
|
proj_stop();
|
||||||
|
}
|
||||||
|
//delay(1); //needed?
|
||||||
|
}
|
||||||
|
|
||||||
|
void proj_stop () {
|
||||||
|
digitalWrite(proj_bwd_pin, LOW);
|
||||||
|
digitalWrite(proj_fwd_pin, LOW);
|
||||||
|
|
||||||
|
proj_running = false;
|
||||||
|
|
||||||
|
Serial.println(cmd_projector);
|
||||||
|
log("projector()");
|
||||||
|
}
|
||||||
|
|
||||||
|
void proj_direction (boolean state) {
|
||||||
|
proj_dir = state;
|
||||||
|
if (state) {
|
||||||
|
Serial.println(cmd_proj_forward);
|
||||||
|
log("proj_direction -> true");
|
||||||
|
} else {
|
||||||
|
Serial.println(cmd_proj_backward);
|
||||||
|
log("proj_direction -> false");
|
||||||
|
}
|
||||||
|
//delay(50); //delay after direction change to account for slippage of the belt
|
||||||
|
}
|
||||||
|
|
||||||
|
void log (String msg) {
|
||||||
|
if (debug_state) {
|
||||||
|
Serial.println(msg);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,10 +1,12 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Wiring
|
Wiring
|
||||||
|
|
||||||
|
HOLD OFF FOR NOW
|
||||||
For "MONITOR" pins with INPUT_PULLUP resistors:
|
For "MONITOR" pins with INPUT_PULLUP resistors:
|
||||||
GND-----\ | \-----PIN
|
GND-----\ | \-----PIN
|
||||||
No additional resistors/caps needed.
|
No additional resistors/caps needed.
|
||||||
|
--Note: not needed in prototype
|
||||||
|
|
||||||
|
|
||||||
CAMERA + CAMERA_DIR and PROJECTOR + PROJECTOR_DIR:
|
CAMERA + CAMERA_DIR and PROJECTOR + PROJECTOR_DIR:
|
||||||
Wire directly to corresponding relay pins.
|
Wire directly to corresponding relay pins.
|
||||||
|
@ -14,27 +16,25 @@
|
||||||
|
|
||||||
boolean debug_state = false;
|
boolean debug_state = false;
|
||||||
|
|
||||||
unsigned long now; //to be compared to stored values every loop
|
//unsigned long now; //to be compared to stored values every loop
|
||||||
|
|
||||||
|
//CAMERA CONSTANTS
|
||||||
const int CAMERA = 2;
|
const int CAMERA = 2;
|
||||||
const int CAMERA_DIR = 3;
|
const int CAMERA_FWD = 3;
|
||||||
const int CAMERA_MONITOR = 4;
|
const int CAMERA_BWD = 4;
|
||||||
|
const int CAMERA_MOMENT = 200;
|
||||||
unsigned long cam_momentary_end;
|
const int CAMERA_FRAME = 800;
|
||||||
const long cam_moment = 300;
|
//CAMERA VARIABLES
|
||||||
boolean cam_dir = true;
|
boolean cam_dir = true;
|
||||||
boolean cam_running = false;
|
|
||||||
boolean cam_momentary = false;
|
|
||||||
|
|
||||||
|
//PROJECTOR CONSTANTS
|
||||||
const int PROJECTOR = 8;
|
const int PROJECTOR = 8;
|
||||||
const int PROJECTOR_DIR = 9;
|
const int PROJECTOR_FWD = 9;
|
||||||
const int PROJECTOR_MONITOR = 10;
|
const int PROJECTOR_BWD = 10;
|
||||||
|
const int PROJECTOR_MOMENT = 200;
|
||||||
unsigned long proj_momentary_end;
|
const int PROJECTOR_FRAME = 800;
|
||||||
const long proj_moment = 300;
|
//PROJECTOR VARIABLES
|
||||||
boolean proj_dir = true;
|
boolean proj_dir = true;
|
||||||
boolean proj_running = false;
|
|
||||||
boolean proj_momentary = false;
|
|
||||||
|
|
||||||
//PROJECTOR COMMANDS
|
//PROJECTOR COMMANDS
|
||||||
const char cmd_projector = 'p';
|
const char cmd_projector = 'p';
|
||||||
|
@ -59,13 +59,13 @@ const int serialDelay = 5;
|
||||||
void setup () {
|
void setup () {
|
||||||
Serial.begin(57600);
|
Serial.begin(57600);
|
||||||
Serial.flush();
|
Serial.flush();
|
||||||
Serial.setTimeout(serialDelay);
|
//Serial.setTimeout(serialDelay);
|
||||||
|
|
||||||
pins();
|
pins();
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop () {
|
void loop () {
|
||||||
now = millis();
|
//now = millis();
|
||||||
if (Serial.available()) {
|
if (Serial.available()) {
|
||||||
/* read the most recent byte */
|
/* read the most recent byte */
|
||||||
cmd_char = (char)Serial.read();
|
cmd_char = (char)Serial.read();
|
||||||
|
@ -74,14 +74,11 @@ void loop () {
|
||||||
cmd(cmd_char);
|
cmd(cmd_char);
|
||||||
cmd_char = 'z';
|
cmd_char = 'z';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cam_running) {
|
|
||||||
monitorCam();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (proj_running) {
|
/*delay(2000);
|
||||||
monitorProj();
|
cam_start();
|
||||||
}
|
delay(2000);
|
||||||
|
proj_start();*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void pins () {
|
void pins () {
|
||||||
|
@ -89,18 +86,20 @@ void pins () {
|
||||||
pinMode(CAMERA, OUTPUT);
|
pinMode(CAMERA, OUTPUT);
|
||||||
pinMode(PROJECTOR, OUTPUT);
|
pinMode(PROJECTOR, OUTPUT);
|
||||||
|
|
||||||
pinMode(CAMERA_DIR, OUTPUT);
|
pinMode(CAMERA_FWD, OUTPUT);
|
||||||
pinMode(PROJECTOR_DIR, OUTPUT);
|
pinMode(CAMERA_BWD, OUTPUT);
|
||||||
|
pinMode(PROJECTOR_FWD, OUTPUT);
|
||||||
//PULLUP
|
pinMode(PROJECTOR_BWD, OUTPUT);
|
||||||
pinMode(CAMERA_MONITOR, INPUT_PULLUP);
|
|
||||||
pinMode(PROJECTOR_MONITOR, INPUT_PULLUP);
|
|
||||||
|
|
||||||
//SET LOW
|
//SET LOW
|
||||||
digitalWrite(CAMERA, LOW);
|
digitalWrite(CAMERA, LOW);
|
||||||
digitalWrite(CAMERA_DIR, LOW);
|
|
||||||
digitalWrite(PROJECTOR, LOW);
|
digitalWrite(PROJECTOR, LOW);
|
||||||
digitalWrite(PROJECTOR_DIR, LOW);
|
|
||||||
|
digitalWrite(CAMERA_FWD, HIGH);
|
||||||
|
digitalWrite(CAMERA_BWD, LOW);
|
||||||
|
|
||||||
|
digitalWrite(PROJECTOR_FWD, HIGH);
|
||||||
|
digitalWrite(PROJECTOR_BWD, LOW);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmd (char val) {
|
void cmd (char val) {
|
||||||
|
@ -125,42 +124,6 @@ void cmd (char val) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void monitorCam () {
|
|
||||||
int position = digitalRead(CAMERA_MONITOR);
|
|
||||||
if (cam_momentary && now >= cam_momentary_end) {
|
|
||||||
digitalWrite(CAMERA, LOW);
|
|
||||||
cam_momentary = false;
|
|
||||||
}
|
|
||||||
if (!cam_momentary) {
|
|
||||||
if (position == LOW) {
|
|
||||||
cam_stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void monitorProj () {
|
|
||||||
int position = digitalRead(PROJECTOR_MONITOR);
|
|
||||||
if (proj_momentary && now >= proj_momentary_end) {
|
|
||||||
digitalWrite(PROJECTOR, LOW);
|
|
||||||
proj_momentary = false;
|
|
||||||
}
|
|
||||||
if (!proj_momentary) {
|
|
||||||
//If internam microswitch is set to LOW?
|
|
||||||
if (position == LOW) {
|
|
||||||
proj_stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void setDir (int pin, boolean dir) {
|
|
||||||
if (dir) {
|
|
||||||
digitalWrite(pin, HIGH);
|
|
||||||
} else {
|
|
||||||
digitalWrite(pin, LOW);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void debug () {
|
void debug () {
|
||||||
debug_state = true;
|
debug_state = true;
|
||||||
Serial.println(cmd_debug);
|
Serial.println(cmd_debug);
|
||||||
|
@ -177,39 +140,52 @@ void identify () {
|
||||||
log("identify()");
|
log("identify()");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setDir (int pin, boolean dir) {
|
||||||
|
if (!dir) {
|
||||||
|
digitalWrite(pin, HIGH);
|
||||||
|
} else {
|
||||||
|
digitalWrite(pin, LOW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void proj_start () {
|
void proj_start () {
|
||||||
digitalWrite(PROJECTOR, HIGH);
|
digitalWrite(PROJECTOR, HIGH);
|
||||||
proj_running = true;
|
delay(PROJECTOR_MOMENT);
|
||||||
proj_momentary = true;
|
digitalWrite(PROJECTOR, LOW);
|
||||||
proj_momentary_end = now + proj_moment;
|
delay(PROJECTOR_FRAME);
|
||||||
|
proj_stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
void cam_start () {
|
void cam_start () {
|
||||||
digitalWrite(CAMERA, HIGH);
|
digitalWrite(CAMERA, HIGH);
|
||||||
cam_running = true;
|
delay(CAMERA_MOMENT);
|
||||||
cam_momentary = true;
|
digitalWrite(CAMERA, LOW);
|
||||||
cam_momentary_end = now + cam_moment;
|
delay(CAMERA_FRAME);
|
||||||
|
cam_stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
void proj_stop () {
|
void proj_stop () {
|
||||||
proj_running = false;
|
|
||||||
Serial.println(cmd_projector);
|
Serial.println(cmd_projector);
|
||||||
log("projector()");
|
log("projector()");
|
||||||
}
|
}
|
||||||
|
|
||||||
void cam_stop () {
|
void cam_stop () {
|
||||||
cam_running = false;
|
|
||||||
Serial.println(cmd_camera);
|
Serial.println(cmd_camera);
|
||||||
log("camera()");
|
log("camera()");
|
||||||
}
|
}
|
||||||
|
|
||||||
void proj_direction (boolean state) {
|
void proj_direction (boolean state) {
|
||||||
proj_dir = state;
|
proj_dir = state;
|
||||||
setDir(PROJECTOR_DIR, state);
|
|
||||||
if (state) {
|
if (state) {
|
||||||
|
digitalWrite(PROJECTOR_BWD, LOW);
|
||||||
|
delay(10);
|
||||||
|
digitalWrite(PROJECTOR_FWD, HIGH);
|
||||||
Serial.println(cmd_proj_forward);
|
Serial.println(cmd_proj_forward);
|
||||||
log("proj_direction -> true");
|
log("proj_direction -> true");
|
||||||
} else {
|
} else {
|
||||||
|
digitalWrite(PROJECTOR_FWD, LOW);
|
||||||
|
delay(10);
|
||||||
|
digitalWrite(PROJECTOR_BWD, HIGH);
|
||||||
Serial.println(cmd_proj_backward);
|
Serial.println(cmd_proj_backward);
|
||||||
log("proj_direction -> false");
|
log("proj_direction -> false");
|
||||||
}
|
}
|
||||||
|
@ -217,11 +193,16 @@ void proj_direction (boolean state) {
|
||||||
|
|
||||||
void cam_direction (boolean state) {
|
void cam_direction (boolean state) {
|
||||||
cam_dir = state;
|
cam_dir = state;
|
||||||
setDir(CAMERA_DIR, state);
|
|
||||||
if (state) {
|
if (state) {
|
||||||
|
digitalWrite(CAMERA_BWD, LOW);
|
||||||
|
delay(10);
|
||||||
|
digitalWrite(CAMERA_FWD, HIGH);
|
||||||
Serial.println(cmd_cam_forward);
|
Serial.println(cmd_cam_forward);
|
||||||
log("cam_direction -> true");
|
log("cam_direction -> true");
|
||||||
} else {
|
} else {
|
||||||
|
digitalWrite(CAMERA_FWD, LOW);
|
||||||
|
delay(10);
|
||||||
|
digitalWrite(CAMERA_BWD, HIGH);
|
||||||
Serial.println(cmd_cam_backward);
|
Serial.println(cmd_cam_backward);
|
||||||
log("cam_direction -> false");
|
log("cam_direction -> false");
|
||||||
}
|
}
|
||||||
|
@ -231,4 +212,5 @@ void log (String msg) {
|
||||||
if (debug_state) {
|
if (debug_state) {
|
||||||
Serial.println(msg);
|
Serial.println(msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
JK modules
|
||||||
|
|
||||||
|
Directional switch connector =
|
||||||
|
Philmore
|
||||||
|
Mobile Connector
|
||||||
|
Panel Mount 3 Pin Male/Female
|
||||||
|
No. 61-623
|
||||||
|
.625" Diameter
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
module jk_male_connector_mount () {
|
||||||
|
$fn = 200;
|
||||||
|
D = 17;
|
||||||
|
OD = 28;
|
||||||
|
H = 25;
|
||||||
|
|
||||||
|
difference () {
|
||||||
|
union () {
|
||||||
|
cylinder(r = OD / 2, h = H, center = true);
|
||||||
|
//cube([12, 48, 3], center = true);
|
||||||
|
}
|
||||||
|
//main void
|
||||||
|
translate([0, 0, -3]) cylinder(r = (OD / 2) - 3, h = H, center = true);
|
||||||
|
//connector void
|
||||||
|
cylinder(r = D / 2, h = H * 2, center = true);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
rotate([180, 0, 0]) jk_male_connector_mount();
|
|
@ -0,0 +1,9 @@
|
||||||
|
$fn=200;
|
||||||
|
module lens_cap_back () {
|
||||||
|
difference() {
|
||||||
|
cylinder(r = 36 / 2, h = 9, center = true);
|
||||||
|
translate([0, 0, 2]) cylinder(r = 33 / 2, h = 9, center = true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lens_cap_back();
|
178
scad/light.scad
178
scad/light.scad
|
@ -48,7 +48,7 @@ module pixie_mount () {
|
||||||
}
|
}
|
||||||
|
|
||||||
//pins for mounting pixie
|
//pins for mounting pixie
|
||||||
translate ([0, -3, 0]) rotate([90, 0, 0]) {
|
translate ([0, -0.5, 0]) rotate([90, 0, 0]) {
|
||||||
translate([W/2, 0, -2]) cylinder(r = INNER_D / 2, h = Z + 1, center = true);
|
translate([W/2, 0, -2]) cylinder(r = INNER_D / 2, h = Z + 1, center = true);
|
||||||
translate([-W/2, 0, -2]) cylinder(r = INNER_D / 2, h = Z + 1, center = true);
|
translate([-W/2, 0, -2]) cylinder(r = INNER_D / 2, h = Z + 1, center = true);
|
||||||
|
|
||||||
|
@ -76,14 +76,20 @@ module pixie_mount () {
|
||||||
|
|
||||||
//outer shell surrounding pixie
|
//outer shell surrounding pixie
|
||||||
translate ([0, -1 + LENS_OFFSET, -6]) {
|
translate ([0, -1 + LENS_OFFSET, -6]) {
|
||||||
|
|
||||||
difference () {
|
difference () {
|
||||||
translate([0, 0, 6]) rounded_cube([W + 16, 36, 32], d = 6, center = true);
|
translate([0, 0, 6]) rounded_cube([W + 20, 40, 32], d = 6, center = true);
|
||||||
translate([0, 0, 6]) rounded_cube([(W + 16) - 4, 36 - 4, 32 + 1], d = 4, center = true);
|
translate([0, 0, 6]) rounded_cube([(W + 16) - 4, 36 - 4, 32 + 1], d = 4, center = true);
|
||||||
translate([0, -8, 8]) rotate([90, 0, 0]) cylinder(r = 10, h = 5, center = true);//circular void
|
//inner tab for centering
|
||||||
translate([0, -50, 0]) cube([100, 100, 100], center = true); //half
|
translate([0, 0, 6]) cube([W + 16, 10, 32 - 10], center = true);
|
||||||
|
//cylinder void for bolt
|
||||||
|
translate([0, 3, 6]) rotate([0, 90, 0]) cylinder(r = 1, h = 40 + 1, center = true, $fn = 60);
|
||||||
|
//cut in half
|
||||||
|
translate([0, -50, 0]) cube([100, 100, 100], center = true);
|
||||||
|
|
||||||
//wires
|
//wires
|
||||||
translate([0, 0, -3]) cube([10, 40, 5], center = true);
|
translate([0, 0, -3]) cube([10, 40, 5], center = true);
|
||||||
|
translate([-5, 0, -5.5]) cube([2, 40, 10], center = true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -93,29 +99,50 @@ module diffuser_mount () {
|
||||||
W = 0.8 * 25.4;
|
W = 0.8 * 25.4;
|
||||||
translate ([0, 0, -6]) {
|
translate ([0, 0, -6]) {
|
||||||
difference () {
|
difference () {
|
||||||
translate([0, 0, 6]) rounded_cube([W + 16, 36, 32], d = 6, center = true);
|
translate([0, 0, 6]) rounded_cube([W + 20, 40, 32], d = 6, center = true);
|
||||||
translate([0, 0, 6]) rounded_cube([(W + 16) - 4, 36 - 4, 32 + 1], d = 4, center = true);
|
translate([0, 0, 6]) rounded_cube([(W + 16) - 4, 36 - 4, 32 + 1], d = 4, center = true);
|
||||||
translate([0, -8, 8]) rotate([90, 0, 0]) cylinder(r = 10, h = 5, center = true);//circular void
|
//circular void
|
||||||
translate([0, 50, 0]) cube([100, 100, 100], center = true); //half
|
translate([0, -8, 8]) rotate([90, 0, 0]) cylinder(r = 10, h = 5, center = true);
|
||||||
|
//cylinder void for bolt
|
||||||
|
translate([0, 3, 6]) rotate([0, 90, 0]) cylinder(r = 1, h = 40 + 1, center = true, $fn = 60);
|
||||||
|
//cut in half
|
||||||
|
translate([0, 50, 0]) {
|
||||||
|
difference () {
|
||||||
|
cube([100, 100, 100], center = true);
|
||||||
|
translate([0, -50, 6]) cube([W + 16, 10, 32 - 10], center = true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
translate ([0, -18, 6]) rotate([90, 90, 0]) cylinder(r = 30 / 2, h = 20, center = true);
|
translate ([0, -18, 6]) rotate([90, 90, 0]) cylinder(r = 30 / 2, h = 20, center = true);
|
||||||
|
//void for attachment
|
||||||
|
//translate([20, -8.5, 6]) cube([8, 8, 8], center = true);
|
||||||
}
|
}
|
||||||
|
translate([22, -8.5, 6]) light_diffuser_notch();
|
||||||
}
|
}
|
||||||
translate ([0, -15.5, 0]) rotate([90, 90, 0]) {
|
translate ([0, -15.5, 0]) rotate([90, 90, 0]) {
|
||||||
difference () {
|
difference () {
|
||||||
cylinder(r = 30 / 2, h = 5, center = true);
|
cylinder(r = 30 / 2, h = 9, center = true);
|
||||||
cylinder(r = 28 / 2, h = 5 + 1, center = true);
|
cylinder(r = 28 / 2, h = 9 + 1, center = true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
module light_diffuser_notch () {
|
||||||
|
difference () {
|
||||||
|
cube([6, 12, 8], center = true);
|
||||||
|
translate([-1, 0, 7]) rotate([0, -20, 0]) cube([8, 12 + 1, 8], center = true);
|
||||||
|
translate([-1, 0, -7]) rotate([0, 20, 0]) cube([8, 12 + 1, 8], center = true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
module diffuser_spacer () {
|
module diffuser_spacer () {
|
||||||
$fn = 100;
|
$fn = 100;
|
||||||
LEN = 10;
|
LEN = 15;
|
||||||
|
THICKNESS = 3;
|
||||||
difference () {
|
difference () {
|
||||||
cylinder(r = 27.9 / 2, h = LEN, center = true);
|
cylinder(r = 27.9 / 2, h = LEN, center = true);
|
||||||
cylinder(r = 24 / 2, h = LEN + 1, center = true);
|
cylinder(r = 23 / 2, h = LEN + 1, center = true);
|
||||||
translate([0, 0, (LEN / 2) - (2/2) ]) cylinder(r = 26 / 2, h = 2, center = true);
|
translate([0, 0, (LEN / 2) - (THICKNESS / 2)]) cylinder(r = 26 / 2, h = THICKNESS, center = true);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -156,24 +183,49 @@ module light_body () {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
module light_body35 () {
|
||||||
|
$fn = 60;
|
||||||
|
|
||||||
|
W = 0.8 * 25.4;
|
||||||
|
L = 0.78 * 25.4;
|
||||||
|
Z = 12;
|
||||||
|
FAN_W = 35;
|
||||||
|
FAN_Z = 10;
|
||||||
|
translate([0, 0, 5]) difference () {
|
||||||
|
rounded_cube([W + 20 + 6, 40 + 6, 13], d = 6, center = true);
|
||||||
|
rounded_cube([W + 20, 40, 13 + 1], d = 6, center = true);
|
||||||
|
translate([0, -15, 20 - 1.5]) rotate([90, 0, 0]) cylinder(r = 31 / 2, h = 30, center = true);
|
||||||
|
}
|
||||||
|
translate([0, 0, 0]) difference() {
|
||||||
|
rounded_cube([W + 20 + 6, 40 + 6, FAN_Z], d = 6, center = true);
|
||||||
|
rounded_cube([FAN_W + 0.2, FAN_W + 0.2, FAN_Z + 1], d = 4, center = true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
module light_vent_top () {
|
module light_vent_top () {
|
||||||
$fn = 60;
|
$fn = 60;
|
||||||
difference () {
|
W = 0.8 * 25.4;
|
||||||
rounded_cube([36+4, 36+4, 10], d = 6, center = true);
|
L = 0.78 * 25.4;
|
||||||
rounded_cube([36, 36, 10 + 1], d = 6, center = true);
|
Z = 12;
|
||||||
|
translate([0, 0, -1.5]) difference () {
|
||||||
|
rounded_cube([W + 20 + 6, 40 + 6, 13], d = 6, center = true);
|
||||||
|
rounded_cube([W + 20, 40, 13 + 1], d = 6, center = true);
|
||||||
|
translate([0, -15, -20 + 1.5]) rotate([90, 0, 0]) cylinder(r = 31 / 2, h = 30, center = true);
|
||||||
}
|
}
|
||||||
translate([0, 0, 1]) difference() {
|
translate([0, 0, 1]) difference() {
|
||||||
rounded_cube([36+2, 36+2, 8], d = 6, center = true);
|
rounded_cube([W + 20 + 1, 40 + 1, 8], d = 6, center = true);
|
||||||
for (i = [0:5]) {
|
for (i = [0:5]) {
|
||||||
translate([i * 6, 0, 0]) rotate([0, -40, 0]) cube([4, 36 + 3, 12], center = true);
|
translate([i * 6, 0, 0]) rotate([0, -40, 0]) cube([4, 36 + 3, 12], center = true);
|
||||||
translate([(i + 1) * -6, 0, 0]) rotate([0, -40, 0]) cube([4, 36 + 3, 12], center = true);
|
translate([(i + 1) * -6, 0, 0]) rotate([0, -40, 0]) cube([4, 36 + 3, 12], center = true);
|
||||||
}
|
}
|
||||||
|
//translate([50, 0, 0]) cube([100, 100, 100], center = true);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module fan () {
|
module fan (SIZE = 50) {
|
||||||
$fn = 60;
|
$fn = 60;
|
||||||
FAN_W = 50;
|
FAN_W = SIZE;
|
||||||
FAN_Z = 10;
|
FAN_Z = 10;
|
||||||
SCREW_D = 4;
|
SCREW_D = 4;
|
||||||
SCREW_INNER = 6;
|
SCREW_INNER = 6;
|
||||||
|
@ -185,4 +237,92 @@ module fan () {
|
||||||
translate([(FAN_W - SCREW_INNER)/2, -(FAN_W - SCREW_INNER)/2, 0]) cylinder(r = SCREW_D/2, h = FAN_Z + 1, center = true);
|
translate([(FAN_W - SCREW_INNER)/2, -(FAN_W - SCREW_INNER)/2, 0]) cylinder(r = SCREW_D/2, h = FAN_Z + 1, center = true);
|
||||||
cylinder(r = (FAN_W - SCREW_INNER) /2, h = FAN_Z + 1, center = true);
|
cylinder(r = (FAN_W - SCREW_INNER) /2, h = FAN_Z + 1, center = true);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module flashlight_mount () {
|
||||||
|
$fn = 100;
|
||||||
|
FLASHLIGHT_D = 25.3;
|
||||||
|
ROD_D = 12.6;
|
||||||
|
difference () {
|
||||||
|
rotate([0, 90, 0]) cylinder(r = FLASHLIGHT_D / 2 + 3, h = ROD_D, center = true);
|
||||||
|
rotate([0, 90, 0]) cylinder(r = FLASHLIGHT_D / 2, h = ROD_D + .1, center = true);
|
||||||
|
}
|
||||||
|
|
||||||
|
translate([0, -35, 0]) rotate([90, 0, 0]) {
|
||||||
|
difference () {
|
||||||
|
cylinder(r = ROD_D / 2, h = 43, center = true);
|
||||||
|
translate([-10, 0, 24.5]) cube([15, 15, 15], center = true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
translate([0, -46.4, 0]) {
|
||||||
|
difference() {
|
||||||
|
rotate ([90, 90, 0]) cylinder(r = (ROD_D / 2) + 2, h = 3, center = true);
|
||||||
|
translate([50 + (ROD_D / 2), 0, 0]) cube([100, 100, 100], center = true);
|
||||||
|
translate([-50 - (ROD_D / 2), 0, 0]) cube([100, 100, 100], center = true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module flashlight_mount_cap (DEBUG = false) {
|
||||||
|
$fn = 120;
|
||||||
|
ROD_D = 12.6;
|
||||||
|
translate([0, 0, 0]) rotate([90, 0, 0]) {
|
||||||
|
difference () {
|
||||||
|
union () {
|
||||||
|
translate([0, 0, 0]) cylinder(r = 9, h = 7, center = true);
|
||||||
|
translate([-6, 0, 0]) cube([12, 18, 7], center = true);
|
||||||
|
translate([-10.75, 0, -3]) cube([2.5, 18, 11], center = true);
|
||||||
|
}
|
||||||
|
difference () {
|
||||||
|
translate([0, 0, -(7 - 4.5) / 2 - .1]) cylinder(r = ROD_D / 2, h = 4.5, center = true);
|
||||||
|
translate([-10, 0, 0]) cube([15, 15, 15], center = true);
|
||||||
|
}
|
||||||
|
if (DEBUG) {
|
||||||
|
translate([0, 50, 0]) cube([100, 100, 100], center = true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module impromptu_mount () {
|
||||||
|
$fn = 100;
|
||||||
|
ROD_D = 12.6;
|
||||||
|
|
||||||
|
translate([0, -35, 0]) rotate([90, 0, 0]) {
|
||||||
|
difference () {
|
||||||
|
union() {
|
||||||
|
cylinder(r = ROD_D / 2, h = 43, center = true);
|
||||||
|
translate([0, 0, -5]) cylinder(r = (ROD_D / 2) + 2, h = 30, center = true);
|
||||||
|
}
|
||||||
|
//notch for cap
|
||||||
|
translate([-10, 0, 24.5]) cube([15, 15, 15], center = true);
|
||||||
|
translate([0, 0, -22.25]) cube([45, 45, 15], center = true);
|
||||||
|
translate([0, 0, -12.5 - 0.5]) scale([4, 1, 1]) rotate([0, -90, 90]) light_diffuser_notch();
|
||||||
|
|
||||||
|
}
|
||||||
|
difference () {
|
||||||
|
translate([0, 0, -12.25 + 1]) cube([40, 12, 7], center = true);
|
||||||
|
translate([0, 0, -12.5 - 0.5]) scale([4, 1, 1]) rotate([0, -90, 90]) light_diffuser_notch();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
translate([0, -46.4, 0]) {
|
||||||
|
difference() {
|
||||||
|
rotate ([90, 90, 0]) cylinder(r = (ROD_D / 2) + 2, h = 3, center = true);
|
||||||
|
translate([50 + (ROD_D / 2), 0, 0]) cube([100, 100, 100], center = true);
|
||||||
|
translate([-50 - (ROD_D / 2), 0, 0]) cube([100, 100, 100], center = true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module light_fresnel (D = 24, BASE = 3, RINGS = 4, d) {
|
||||||
|
$fn = 200;
|
||||||
|
STEP = D / RINGS;
|
||||||
|
|
||||||
|
cylinder(r = D / 2, h = BASE, center = true);
|
||||||
|
|
||||||
|
translate([0, 0, 4]) for (i = [0 : RINGS]) {
|
||||||
|
cylinder(r1 = (D - (STEP * (i + 1))) / 2, r2 = (D - (STEP * i)) / 2, h = 2, center = true);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -3,11 +3,17 @@ include <./connectors.scad>;
|
||||||
include <./light.scad>;
|
include <./light.scad>;
|
||||||
include <./motor.scad>;
|
include <./motor.scad>;
|
||||||
|
|
||||||
//rotate([90, 0, 0]) color("red") adafruit_pixie();
|
|
||||||
//translate([0, 6, 0]) pixie_mount();
|
//translate([0, 2.5, 0]) rotate([90, 0, 0]) color("red") adafruit_pixie();
|
||||||
//translate([0, 0, -50]) color("red") fan();
|
//translate([0, 6, 0]) color("blue") pixie_mount();
|
||||||
color("green") diffuser_mount();
|
//translate([0, 0, -50]) color("red") fan(35);
|
||||||
//translate([0, 0, -51.2]) light_body();
|
//color("green") diffuser_mount();
|
||||||
|
//translate([0, 0, -51.2]) light_body35();
|
||||||
//translate([0, 0, 20]) light_vent_top();
|
//translate([0, 0, 20]) light_vent_top();
|
||||||
//translate ([0, -20, 0]) rotate([90, 90, 0]) color("red") diffuser_insert();
|
//translate ([0, -20, 0]) rotate([90, 90, 0]) color("red") diffuser_insert();
|
||||||
//translate ([0, -20, 0]) rotate([90, 90, 0]) color("red") diffuser_spacer();
|
//translate ([0, -10, 0]) rotate([90, 90, 0]) color("red") diffuser_spacer();
|
||||||
|
//rotate([0, 0, 90]) flashlight_mount();
|
||||||
|
//translate([0, -8.5, 0]) rotate([0, 0, 90]) impromptu_mount();
|
||||||
|
//translate([30, -8.5, 0]) rotate([90, 0, 90]) flashlight_mount_cap();
|
||||||
|
//translate([0, -9, 0]) cube([15, 15, 15], center = true);
|
||||||
|
light_fresnel();
|
|
@ -489,9 +489,9 @@ module flashlight_mount_cap (DEBUG = false) {
|
||||||
translate([0, 0, 0]) rotate([90, 0, 0]) {
|
translate([0, 0, 0]) rotate([90, 0, 0]) {
|
||||||
difference () {
|
difference () {
|
||||||
union () {
|
union () {
|
||||||
translate([0, 0, 0]) cylinder(r = 9, h = 7, center = true);
|
translate([0, 0, 0]) cylinder(r = 11, h = 7, center = true);
|
||||||
translate([-6, 0, 0]) cube([12, 18, 7], center = true);
|
translate([-6, 0, 0]) cube([12, 22, 7], center = true);
|
||||||
translate([-10.75, 0, -3]) cube([2.5, 18, 11], center = true);
|
translate([-11.5, 0, -3]) cube([4, 22, 13], center = true);
|
||||||
}
|
}
|
||||||
difference () {
|
difference () {
|
||||||
translate([0, 0, -(7 - 4.5) / 2 - .1]) cylinder(r = ROD_D / 2, h = 4.5, center = true);
|
translate([0, 0, -(7 - 4.5) / 2 - .1]) cylinder(r = ROD_D / 2, h = 4.5, center = true);
|
||||||
|
@ -520,4 +520,5 @@ module bolex_stand () {
|
||||||
}
|
}
|
||||||
//translate([0, 0, 40]) cube([35, 150, 30], center = true);
|
//translate([0, 0, 40]) cube([35, 150, 30], center = true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue