0
0
mirror of https://github.com/Doodle3D/Doodle3D-API synced 2024-11-14 00:17:55 +01:00

Merge branch 'develop'

This commit is contained in:
casperlamboo 2017-11-30 17:57:59 +01:00
commit e236858f27
22 changed files with 166887 additions and 290 deletions

12
.gitignore vendored
View File

@ -1,8 +1,4 @@
jspm_packages/*
example/test.gcode
node_modules/*
build.js
build.js.map
node_modules
dist
lib
module

2
.npmignore Normal file
View File

@ -0,0 +1,2 @@
node_modules
jspm_packages

View File

@ -1,28 +0,0 @@
import { Doodle3DManager } from 'src/index.js';
const doodle3DManager = new Doodle3DManager();
doodle3DManager.setAutoUpdate(true, 1000);
doodle3DManager.addEventListener('boxappeared', ({ box }) => {
box.setAutoUpdate(true, 1000);
box.addEventListener('connect', () => {
console.log('connect to box', box);
});
box.addEventListener('disconnect', () => {
console.log('disonnect to box', box);
});
box.addEventListener('update', ({ state }) => {
console.log(state);
});
});
doodle3DManager.addEventListener('boxdisappeared', ({ box }) => {
box.setAutoUpdate(false);
});
doodle3DManager.addEventListener('boxeschanged', ({ boxes }) => {
});

View File

@ -1,14 +0,0 @@
<!DOCTYPE>
<html>
<head>
<title>Doodle3D Box</title>
<script type="text/javascript" src="../jspm_packages/system.js"></script>
<script type="text/javascript" src="../jspm.config.js"></script>
</head>
<body>
<script type="text/javascript">
System.import('./app.js');
</script>
</body>
</html>

72
index.js Normal file
View File

@ -0,0 +1,72 @@
import React from 'react';
import { render } from 'react-dom';
import { Doodle3DManager } from './src/index.js';
class Box extends React.Component {
state = {
status: {}
};
componentWillMount() {
const { box } = this.props;
box.setAutoUpdate(true, 1000);
box.addEventListener('update', ({ state }) => {
this.setState({ status: state });
});
}
componentWillUnMount() {
const { box } = this.props;
box.setAutoUpdate(false);
}
render() {
return (
<div>
<p><b>name: {this.props.box.boxData.wifiboxid}</b></p>
<ul>
{Object.entries(this.state.status).map(([key, value]) => <li key={key}>{key}: {value}</li>)}
</ul>
</div>
);
};
}
class OverView extends React.Component {
state = {
boxes: []
};
componentWillMount() {
const doodle3DManager = new Doodle3DManager();
doodle3DManager.checkNonServerBoxes = false;
doodle3DManager.setAutoUpdate(true, 1000);
doodle3DManager.addEventListener('boxappeared', ({ box }) => {
this.setState({ boxes: [...this.state.boxes, <Box box={box} />] })
});
doodle3DManager.addEventListener('boxdisappeared', ({ box }) => {
this.setState({ boxes: this.state.boxes.filter(box => box.props.box.boxData.id !== box.boxData.id) })
});
this.setState({ doodle3DManager })
}
componentWillUnMount() {
const { doodle3DManager } = this.state;
if (doodle3DManager) doodle3DManager.setAutoUpdate(false);
}
render() {
const { boxes } = this.state;
return (
<div>
{boxes.map((box, i) => <span key={i}>{box}</span>)}
</div>
);
};
}
render(<OverView />, document.getElementById('app'));

View File

@ -1,51 +0,0 @@
SystemJS.config({
paths: {
"github:": "jspm_packages/github/",
"npm:": "jspm_packages/npm/",
"Doodle3D-API/": "src/"
},
browserConfig: {
"baseURL": "/"
},
devConfig: {
"map": {
"babel-runtime": "npm:babel-runtime@5.8.38",
"core-js": "npm:core-js@1.2.7",
"traceur": "github:jmcriffey/bower-traceur@0.0.90",
"traceur-runtime": "github:jmcriffey/bower-traceur-runtime@0.0.90",
"process": "github:jspm/nodelibs-process@0.2.0-alpha",
"fs": "github:jspm/nodelibs-fs@0.2.0-alpha",
"plugin-babel": "npm:systemjs-plugin-babel@0.0.12",
"path": "github:jspm/nodelibs-path@0.2.0-alpha"
}
},
transpiler: "plugin-babel",
babelOptions: {
"optional": [
"runtime"
],
"stage": 0
},
map: {
"babel": "npm:babel-core@5.7.4"
},
packages: {
"Doodle3D-API": {
"main": "index.js"
}
}
});
SystemJS.config({
packageConfigPaths: [
"npm:@*/*.json",
"npm:*.json",
"github:*/*.json"
],
map: {
"EventDispatcher": "github:mrdoob/eventdispatcher.js@1.0.0",
"github/fetch": "github:github/fetch@0.9.0",
"jquery": "github:components/jquery@2.2.4"
},
packages: {}
});

7170
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,57 +1,58 @@
{
"jspm": {
"name": "Doodle3D-API",
"main": "index.js",
"directories": {
"lib": "src"
},
"dependencies": {
"EventDispatcher": "github:mrdoob/eventdispatcher.js@^1.0.0",
"github/fetch": "github:github/fetch@^0.9.0",
"jquery": "github:components/jquery@^2.1.4"
},
"devDependencies": {
"babel-runtime": "npm:babel-runtime@^5.1.13",
"core-js": "npm:core-js@^1.2.0",
"fs": "github:jspm/nodelibs-fs@^0.2.0-alpha",
"path": "github:jspm/nodelibs-path@^0.2.0-alpha",
"plugin-babel": "npm:systemjs-plugin-babel@^0.0.12",
"process": "github:jspm/nodelibs-process@^0.2.0-alpha",
"traceur": "github:jmcriffey/bower-traceur@0.0.90",
"traceur-runtime": "github:jmcriffey/bower-traceur-runtime@0.0.90"
},
"overrides": {
"github:components/jquery@2.2.4": {
"main": "jquery"
},
"github:jmcriffey/bower-traceur-runtime@0.0.90": {
"format": "global",
"meta": {
"traceur-runtime.js": {
"exports": "$traceurRuntime",
"format": "global"
}
}
},
"github:jmcriffey/bower-traceur@0.0.90": {
"format": "global",
"meta": {
"traceur.js": {
"exports": "traceur",
"format": "global"
}
}
},
"npm:babel-runtime@5.8.38": {
"main": false,
"dependencies": {},
"optionalDependencies": {
"core-js": "^1.2.0"
}
}
}
"name": "@doodle3d/doodle3d-api",
"version": "1.0.0",
"description": "Doodle3D API for communication with the Doodle3D WiFi-Box",
"main": "lib/index.js",
"module": "module/index.js",
"esnext": "src/index.js",
"scripts": {
"start": "webpack-dev-server -w",
"prepare": "npm run build",
"build": "npm run build:main && npm run build:module",
"build:main": "BABEL_ENV=main babel src -s -d lib",
"build:module": "BABEL_ENV=module babel src -s -d module"
},
"dependencies": {
"jspm": "^0.17.0-beta.25"
}
"eventdispatcher.js": "0.0.2",
"whatwg-fetch": "^2.0.3"
},
"devDependencies": {
"react": "^16.0.0",
"react-dom": "^16.0.0",
"babel-plugin-inline-import": "^2.0.6",
"babel-preset-stage-0": "^6.24.1",
"babel-plugin-syntax-dynamic-import": "^6.18.0",
"babel-plugin-transform-class-properties": "^6.24.1",
"babel-plugin-transform-es2015-classes": "^6.24.1",
"babel-plugin-transform-object-rest-spread": "^6.26.0",
"babel-preset-env": "^1.6.1",
"babel-preset-react": "^6.24.1",
"babel-cli": "6.24.1",
"babel-core": "6.24.1",
"babel-loader": "7.0.0",
"babel-plugin-add-module-exports": "0.2.1",
"babel-preset-es2015": "6.24.1",
"babel-polyfill": "^6.23.0",
"file-saver": "^1.3.3",
"html-webpack-template": "^6.0.2",
"imports-loader": "^0.7.1",
"material-ui": "^0.19.4",
"react-tap-event-plugin": "^3.0.2",
"url-loader": "^0.5.9",
"babel-plugin-transform-runtime": "^6.23.0",
"html-webpack-plugin": "^2.29.0",
"webpack": "^3.3.0",
"webpack-dev-server": "^2.5.1",
"worker-loader": "^0.8.1"
},
"repository": {
"type": "git",
"url": "git+https://github.com/casperlamboo/Doodle3D-API.git"
},
"author": "",
"license": "ISC",
"bugs": {
"url": "https://github.com/casperlamboo/Doodle3D-API/issues"
},
"homepage": "https://github.com/casperlamboo/Doodle3D-API#readme"
}

View File

@ -1,16 +1,20 @@
import * as rest from '../rest.js';
import { parseFetch } from '../utils.js';
export default class Config {
constructor(api) {
this.api = api;
}
get(...keys) {
return rest.get(`${ this.api }config/?${ keys.join('=&') }=`);
return fetch(`${this.api}config/?${keys.join('=&')}=`, { method: 'GET' }).then(parseFetch);
}
getAll() {
return rest.get(`${ this.api }config/all`);
return fetch(`${this.api}config/all`, { method: 'GET' }).then(parseFetch);
}
set(data) {
return rest.post(`${ this.api }config`, data);
return fetch(`${this.api}config`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
}).then(parseFetch);
}
}

View File

@ -1,19 +1,19 @@
import * as rest from '../rest.js';
import { parseFetch } from '../utils.js';
export default class Info {
constructor(api) {
this.api = api;
}
get() {
return rest.get(`${ this.api }info`);
return fetch(`${this.api}info`, { method: 'GET' }).then(parseFetch);
}
status() {
return rest.get(`${ this.api }info/status`);
return fetch(`${this.api}info/status`, { method: 'GET' }).then(parseFetch);
}
downloadLogFiles() {
window.location = `${ this.api }info/logfiles`;
window.location = `${this.api}info/logfiles`;
}
acces() {
return rest.get(`${ this.api }info/access`);
return fetch(`${this.api}info/access`, { method: 'GET' }).then(parseFetch);
}
}

View File

@ -1,39 +1,54 @@
import * as rest from '../rest.js';
import { parseFetch } from '../utils.js';
export default class Network {
constructor(api) {
this.api = api;
}
scan() {
return rest.get(`${ this.api }network/scan`);
return fecth(`${this.api}network/scan`, { method: 'GET' }).then(parseFetch);
}
known() {
return rest.get(`${ this.api }network/known`);
return fecth(`${this.api}network/known`, { method: 'GET' }).then(parseFetch);
}
status() {
return rest.get(`${ this.api }network/status`);
return fecth(`${this.api}network/status`, { method: 'GET' }).then(parseFetch);
}
assosiate(ssid, phrase, recreate = false) {
return rest.post(`${ this.api }network/associate`, { ssid, phrase, recreate });
return fetch(`${this.api}network/associate`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ ssid, phrase, recreate })
}).then(parseFetch);
}
disassociate() {
//not tested
return rest.post(`${ this.api }network/disassociate`, {});
return fetch(`${this.api}network/disassociate`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({})
}).then(parseFetch);
}
openAccesPoint() {
//not tested
return rest.post(`${ this.api }network/openap`, {});
return fetch(`${this.api}network/openap`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({})
}).then(parseFetch);
}
remove(ssid) {
return rest.post(`${ this.api }network/remove`, { ssid });
return fetch(`${this.api}network/remove`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ ssid })
}).then(parseFetch);
}
signin() {
return rest.get(`${ this.api }network/signin`);
return fecth(`${this.api}network/signin`, { method: 'GET' }).then(parseFetch);
}
async alive() {
try {
await rest.get(`${ this.api }network/alive`);
await fetch(`${this.api}network/alive`, { method: 'GET' }).then(parseFetch);
return true;
} catch(error) {
return false;

View File

@ -1,40 +1,49 @@
import * as rest from '../rest.js';
import { parseFetch, sleep } from '../utils.js';
export default class Printer {
constructor(api) {
this.api = api;
}
temperature() {
return rest.get(`${ this.api }printer/temperature`);
return fetch(`${this.api}printer/temperature`, { method: 'GET' }).then(parseFetch);
}
progress() {
return rest.get(`${ this.api }printer/progress`);
return fetch(`${this.api}printer/progress`, { method: 'GET' }).then(parseFetch);
}
state() {
return rest.get(`${ this.api }printer/state`);
return fetch(`${this.api}printer/state`, { method: 'GET' }).then(parseFetch);
}
listAll() {
return rest.get(`${ this.api }printer/listall`);
return fetch(`${this.api}printer/listall`, { method: 'GET' }).then(parseFetch);
}
heatup() {
return rest.post(`${ this.api }printer/heatup`, {});
return fetch(`${this.api}printer/heatup`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({})
}).then(parseFetch);
}
print(gcode = '', first = false, start = false, last) {
return rest.post(`${ this.api }printer/print`, { gcode, first, start, last });
return fetch(`${this.api}printer/print`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ gcode, first, start, last })
}).then(parseFetch);
}
stop(gcode = '') {
return rest.post(`${ this.api }printer/stop`, { gcode });
return fetch(`${this.api}printer/stop`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ gcode, first, start, last })
}).then(parseFetch);
}
async _sendBatch(gcode, start, index) {
try {
const response = await this.print(gcode, start, start);
console.log(`batch sent: ${ index }`);
console.log(`batch sent: ${index}`);
} catch(error) {
console.log(`failed sending batch: ${ index }`);
console.log(`failed sending batch: ${index}`);
await sleep(1000);
await this._sendBatch(gcode, index);
}
}

View File

@ -1,19 +1,27 @@
import * as rest from '../rest.js';
import { parseFetch } from '../utils.js';
export default class Sketch {
constructor(api) {
this.api = api;
}
getSketch(id) {
return rest.get(`${ this.api }sketch/?id=${ id }`);
return fetch(`${this.api}sketch/?id=${id}`, { method: 'GET' }).then(parseFetch);
}
set(data = '') {
return rest.post(`${ this.api }sketch`, { data });
return fetch(`${this.api}sketch`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ data })
}).then(parseFetch);
}
status() {
return rest.get(`${ this.api }sketch/status`);
return fetch(`${this.api}sketch/status`, { method: 'GET' }).then(parseFetch);
}
clear() {
return rest.post(`${ this.api }sketch/clear`);
return fetch(`${this.api}sketch/clear`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({})
}).then(parseFetch);
}
}

View File

@ -1,10 +1,10 @@
import * as rest from '../rest.js';
import { parseFetch } from '../utils.js';
export default class System {
constructor(api) {
this.api = api;
}
versions() {
return rest.get(`${ this.api }system/fwversions`);
return fetch(`${this.api}system/fwversions`, { method: 'GET' }).then(parseFetch);
}
}

View File

@ -1,22 +1,34 @@
import * as rest from '../rest.js';
import { parseFetch } from '../utils.js';
export default class Update {
constructor(api) {
this.api = api;
}
status() {
return rest.get(`${ this.api }update/status`);
return fetch(`${this.api}update/status`, { method: 'GET' }).then(parseFetch);
}
download() {
//not tested
return rest.post(`${ this.api }update/download`, {});
return fetch(`${this.api}update/download`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({})
}).then(parseFetch);
}
install() {
//not tested
return rest.post(`${ this.api }update/install`, {});
return fetch(`${this.api}update/install`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({})
}).then(parseFetch);
}
clear() {
//not tested
return rest.post(`${ this.api }update/clear`, {});
return fetch(`${this.api}update/clear`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({})
}).then(parseFetch);
}
}

View File

@ -1,4 +1,4 @@
import EventDispatcher from 'EventDispatcher';
import EventDispatcher from 'eventdispatcher.js';
import { sleep } from './utils.js';
import ConfigAPI from './api/config.js';
import InfoAPI from './api/info.js';
@ -14,7 +14,7 @@ export default class Doodle3DBox extends EventDispatcher {
this.boxData = boxData;
this.api = `http://${ boxData.localip }/d3dapi/`;
this.api = `http://${boxData.localip}/d3dapi/`;
this.alive = false;
this.autoUpdate = false;
@ -54,7 +54,7 @@ export default class Doodle3DBox extends EventDispatcher {
async sendGCode(gcode) {
const printerState = await this.printer.state();
if (printerState.state !== 'idle') {
throw `Cannot print, print state is ${ printerState.state }`;
throw `Cannot print, print state is ${printerState.state}`;
}
if (!gcode.endsWith('\n')) {

View File

@ -1,7 +1,6 @@
import * as rest from './rest.js';
import Doodle3DBox from './doodle3dbox.js';
import EventDispatcher from 'EventDispatcher';
import { sleep } from './utils.js';
import EventDispatcher from 'eventdispatcher.js';
import { sleep, parseFetch } from './utils.js';
export default class Doodle3DManager extends EventDispatcher {
constructor() {
@ -41,7 +40,7 @@ export default class Doodle3DManager extends EventDispatcher {
async _checkNew() {
let boxes = [];
try {
boxes = await rest.get(`${ this.api }list.php`);
boxes = await fetch(`${this.api}list.php`, { method: 'GET' }).then(parseFetch);
} catch(error) {
console.warn('fail connecting to Doodle3D server');
}

View File

@ -1,3 +1,5 @@
import 'whatwg-fetch';
import Doodle3DManager from './doodle3dmanager.js';
import Doodle3DBox from './doodle3dbox.js';

View File

@ -1,84 +0,0 @@
import $ from 'jquery';
const GET_TIMEOUT = 5000;
const POST_TIMEOUT = 10000;
export function get(url) {
return send(url, 'GET');
}
export function post(url, data) {
return send(url, 'POST', data);
}
function send(url, type, data) {
const timeout = (type === 'GET') ? GET_TIMEOUT : POST_TIMEOUT;
return new Promise((resolve, reject) => {
$.ajax({
url, type, data, timeout, dataType: 'json',
success: (response) => {
if (response.status === 'success') {
resolve(response.data);
}
else {
reject(response.msg);
}
}
}).fail(reject);
});
}
/*
import 'github/fetch';
export function get (url) {
return new Promise((resolve, reject) => {
fetch(url).then((response) => {
return response.json();
}).then((json) => {
if (json.status === 'success') {
resolve(json.data);
}
else {
reject(json.msg);
}
}).catch(reject);
});
}
export function post (url, data) {
return new Promise((resolve, reject) => {
fetch(url, {
method: 'post',
enctype: 'x-www-form-urlencoded',
headers: {
'Accept': 'application/json'
},
body: JSON.stringify(data)
}).then((response) => {
return response.json();
}).then((json) => {
if (json.status === 'success') {
resolve(json.data);
}
else {
reject(json.msg);
}
}).catch(reject);
});
}
*/

View File

@ -3,3 +3,10 @@ export function sleep(time) {
setTimeout(resolve, time);
});
}
export function parseFetch(response) {
return response.json().then(({ status, data, msg }) => {
if (!status === 'success') throw new Error(msg);
return data;
});
}

159423
test.gcode Normal file

File diff suppressed because it is too large Load Diff

54
webpack.config.js Normal file
View File

@ -0,0 +1,54 @@
const path = require('path');
// const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
const HTMLWebpackPlugin = require('html-webpack-plugin');
const babelLoader = {
loader: 'babel-loader',
options: {
presets: [
require('babel-preset-env'),
require('babel-preset-react')
],
plugins: [
require('babel-plugin-transform-object-rest-spread'),
require('babel-plugin-transform-class-properties'),
require('babel-plugin-transform-runtime')
],
babelrc: false
}
};
module.exports = {
entry: './index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: babelLoader
}, { // make THREE global available to three.js examples
test: /three\/examples\/.+\.js/,
use: 'imports-loader?THREE=three'
}, {
test: /\.worker\.js$/,
use: ['worker-loader', babelLoader]
}
]
},
plugins: [
new HTMLWebpackPlugin({
title: 'Doodle3D API - Simple example',
template: require('html-webpack-template'),
inject: false,
appMountId: 'app'
}),
],
devtool: "source-map",
devServer: {
contentBase: 'dist'
}
};