Doodle3D-API/src/doodle3dapi.js

173 lines
3.3 KiB
JavaScript

import rest from './restapi.js';
import ConfigAPI from './configapi.js';
import InfoAPI from './infoapi.js';
import NetworkAPI from './networkapi.js';
import PrinterAPI from './printerapi.js';
import SketchAPI from './sketchapi.js';
import SystemAPI from './systemapi.js';
import UpdateAPI from './updateapi.js';
export default class {
constructor (localIP) {
this.config = new ConfigAPI(localIP);
this.info = new InfoAPI(localIP);
this.network = new NetworkAPI(localIP);
this.printer = new PrinterAPI(localIP);
this.sketch = new SketchAPI(localIP);
this.system = new SystemAPI(localIP);
this.update = new UpdateAPI(localIP);
this.alive = false;
this.batchSize = 512;
this.maxBufferedLines = 4096;
this.state = {};
this._printBatches = [];
this._currentBatch = 0;
this.loaded = false;
}
startUpdateLoop () {
var scope = this;
this.network.alive(function (error, data) {
if (error) {
if (scope.alive) {
scope.alive = false;
if (scope.ondisconnect !== undefined) {
scope.ondisconnect();
}
}
console.warn(error);
setTimeout(function () {
scope.startUpdateLoop();
}, 1000);
return;
}
scope.alive = true;
if (scope.onconnect !== undefined) {
scope.onconnect();
}
if (!scope.loaded) {
scope.loaded = true;
}
scope._updateState();
});
return this;
}
print (gcode) {
this._currentBatch = 0;
gcode = gcode.split('\n');
//split gcode in batches
while (gcode.length > 0) {
var gcodeBatch = gcode.splice(0, Math.min(this.batchSize, gcode.length));
this._printBatches.push(gcodeBatch.join('\n'));
}
return this;
}
stopPrint (settings) {
var scope = this;
this._printBatches = [];
this._currentBatch = 0;
this.printer.stop({
'gcode': settings.endCode()
}, function (error, data) {
if (error) {
console.warn(error);
scope.startUpdateLoop();
return;
}
console.log('Printer stop command sent');
});
return this;
}
_updateLoop () {
var scope = this;
if (this._printBatches.length > 0 && (this.state['buffered_lines'] + this._printBatches[0].length) <= this.maxBufferedLines) {
//if (this._printBatches.length > 0 ) {
this._printBatch();
}
else {
setTimeout(function () {
scope._updateState();
}, 1000);
}
}
_updateState () {
//que api calls so they don't overload the d3d box
var scope = this;
this.info.status(function (error, data) {
if (error) {
console.warn(error);
scope.startUpdateLoop();
return;
}
scope.state = data;
if (scope.onupdate !== undefined) {
scope.onupdate(data);
}
scope._updateLoop();
});
}
_printBatch () {
var scope = this;
var gcode = this._printBatches.shift();
this.printer.print({
'start': ((this._currentBatch === 0) ? true : false),
'first': ((this._currentBatch === 0) ? true : false),
'gcode': gcode,
'last': ((this._printBatches.length === 0) ? true : false) //only for debug purposes
}, function (error, data) {
if (error) {
scope._printBatches.unshift(gcode);
console.warn(error);
scope.startUpdateLoop();
return;
}
console.log('batch sent: ' + scope._currentBatch, data);
if (scope._printBatches.length > 0) {
scope._currentBatch ++;
}
else {
console.log('Finish sending gcode to printer');
}
scope._updateState();
});
}
}