diff --git a/src/app/containers/Settings/Events/CreateRecord.jsx b/src/app/containers/Settings/Events/CreateRecord.jsx
index 0d1016354..6f34a65bb 100644
--- a/src/app/containers/Settings/Events/CreateRecord.jsx
+++ b/src/app/containers/Settings/Events/CreateRecord.jsx
@@ -134,6 +134,7 @@ class CreateRecord extends PureComponent {
+
diff --git a/src/app/containers/Settings/Events/TableRecords.jsx b/src/app/containers/Settings/Events/TableRecords.jsx
index 90e5e169d..5306095f9 100644
--- a/src/app/containers/Settings/Events/TableRecords.jsx
+++ b/src/app/containers/Settings/Events/TableRecords.jsx
@@ -112,9 +112,10 @@ class TableRecords extends PureComponent {
key: 'event',
render: (value, row, index) => {
const eventText = {
- 'startup': i18n._('Startup'),
- 'port:open': i18n._('Open a serial port'),
- 'port:close': i18n._('Close a serial port'),
+ 'startup': i18n._('Startup (System only)'),
+ 'port:open': i18n._('Open a serial port (System only)'),
+ 'port:close': i18n._('Close a serial port (System only)'),
+ 'controller:ready': i18n._('Ready to start'),
'gcode:load': i18n._('G-code: Load'),
'gcode:unload': i18n._('G-code: Unload'),
'gcode:start': i18n._('G-code: Start'),
diff --git a/src/app/containers/Settings/Events/UpdateRecord.jsx b/src/app/containers/Settings/Events/UpdateRecord.jsx
index 0d8decc93..f63b3a10a 100644
--- a/src/app/containers/Settings/Events/UpdateRecord.jsx
+++ b/src/app/containers/Settings/Events/UpdateRecord.jsx
@@ -134,6 +134,7 @@ class UpdateRecord extends PureComponent {
+
diff --git a/src/package.json b/src/package.json
index 445950382..d00d4927f 100644
--- a/src/package.json
+++ b/src/package.json
@@ -12,12 +12,12 @@
},
"main": "main.js",
"dependencies": {
- "@babel/polyfill": "~7.4.0",
- "@babel/runtime": "~7.4.2",
+ "@babel/polyfill": "~7.4.3",
+ "@babel/runtime": "~7.4.3",
"bcrypt-nodejs": "0.0.3",
"body-parser": "~1.18.3",
"chalk": "~2.4.2",
- "commander": "~2.19.0",
+ "commander": "~2.20.0",
"compression": "~1.7.4",
"connect-multiparty": "~2.2.0",
"connect-restreamer": "~1.0.3",
@@ -25,7 +25,7 @@
"cookie-parser": "~1.4.4",
"debug": "~4.1.1",
"deep-keys": "~0.5.0",
- "electron-store": "~2.0.0",
+ "electron-store": "~3.1.0",
"ensure-array": "~1.0.0",
"errorhandler": "~1.5.0",
"escodegen": "~1.11.1",
@@ -37,7 +37,7 @@
"gcode-parser": "~1.3.6",
"hogan.js": "~3.0.2",
"http-proxy": "~1.17.0",
- "i18next": "~15.0.8",
+ "i18next": "~15.0.9",
"i18next-express-middleware": "~1.7.3",
"i18next-node-fs-backend": "~2.1.2",
"is-electron": "~2.2.0",
@@ -48,7 +48,7 @@
"morgan": "~1.9.1",
"range_check": "~1.4.0",
"registry-auth-token": "~3.4.0",
- "registry-url": "~5.0.0",
+ "registry-url": "~5.1.0",
"rimraf": "~2.6.3",
"serialport": "~7.1.4",
"serve-favicon": "~2.5.0",
diff --git a/src/server/controllers/Grbl/GrblController.js b/src/server/controllers/Grbl/GrblController.js
index a83f839b9..2e2758c76 100644
--- a/src/server/controllers/Grbl/GrblController.js
+++ b/src/server/controllers/Grbl/GrblController.js
@@ -543,22 +543,19 @@ class GrblController {
this.runner.on('startup', (res) => {
this.emit('serialport:read', res.raw);
- // Check the initialized flag
+ // The startup message always prints upon startup, after a reset, or at program end.
+ // Setting the initial state when Grbl has completed re-initializing all systems.
+ this.clearActionValues();
+
+ // Set ready flag to true when a startup message has arrived
+ this.ready = true;
+
if (!this.initialized) {
this.initialized = true;
- // https://github.com/cncjs/cncjs/issues/206
- // $13=0 (report in mm)
- // $13=1 (report in inches)
- this.writeln('$$');
+ // Initialize controller
+ this.initController();
}
-
- // Set the ready flag to true when a startup message has arrived
- this.ready = true;
-
- // The startup message always prints upon startup, after a reset, or at program end.
- // Setting the initial state when Grbl has completed re-initializing all systems.
- this.clearActionValues();
});
this.runner.on('others', (res) => {
@@ -673,7 +670,6 @@ class GrblController {
// Check the ready flag
if (!(this.ready)) {
- // Wait for the bootloader to complete before sending commands
return;
}
@@ -704,6 +700,15 @@ class GrblController {
}
}, 250);
}
+ async initController() {
+ // https://github.com/cncjs/cncjs/issues/206
+ // $13=0 (report in mm)
+ // $13=1 (report in inches)
+ this.writeln('$$');
+
+ await delay(50);
+ this.event.trigger('controller:ready');
+ }
populateContext(context) {
// Machine position
const {
diff --git a/src/server/controllers/Marlin/MarlinController.js b/src/server/controllers/Marlin/MarlinController.js
index fc8969346..e3b57823f 100644
--- a/src/server/controllers/Marlin/MarlinController.js
+++ b/src/server/controllers/Marlin/MarlinController.js
@@ -10,6 +10,7 @@ import Workflow, {
WORKFLOW_STATE_PAUSED,
WORKFLOW_STATE_RUNNING
} from '../../lib/Workflow';
+import delay from '../../lib/delay';
import ensurePositiveNumber from '../../lib/ensure-positive-number';
import evaluateAssignmentExpression from '../../lib/evaluate-assignment-expression';
import logger from '../../lib/logger';
@@ -81,6 +82,7 @@ class MarlinController {
// Marlin
controller = null;
ready = false;
+ initialized = false;
state = {};
settings = {};
feedOverride = 100;
@@ -560,12 +562,16 @@ class MarlinController {
this.runner.on('start', (res) => {
this.emit('serialport:read', res.raw);
- // M115: Get Firmware Version and Capabilities
- this.command('gcode', 'M115');
-
- // Set ready flag to true when receiving a start message
- // Note: It might have chance of receiving garbage characters on startup due to electronic noise.
+ // Set ready flag to true when a start message has arrived
+ // It might have chance of receiving garbage characters on startup due to electronic noise.
this.ready = true;
+
+ if (!this.initialized) {
+ this.initialized = true;
+
+ // Initialize controller
+ this.initController();
+ }
});
this.runner.on('echo', (res) => {
@@ -715,7 +721,6 @@ class MarlinController {
// Check the ready flag
if (!(this.ready)) {
- // Wait for the bootloader to complete before sending commands
return;
}
@@ -756,6 +761,13 @@ class MarlinController {
}
}, 250);
}
+ async initController() {
+ // M115: Get firmware version and capabilities
+ this.command('gcode', 'M115');
+
+ await delay(50);
+ this.event.trigger('controller:ready');
+ }
populateContext(context) {
// Work position
const {
diff --git a/src/server/controllers/Smoothie/SmoothieController.js b/src/server/controllers/Smoothie/SmoothieController.js
index 21760381f..75b1e585a 100644
--- a/src/server/controllers/Smoothie/SmoothieController.js
+++ b/src/server/controllers/Smoothie/SmoothieController.js
@@ -577,7 +577,6 @@ class SmoothieController {
// Check the ready flag
if (!(this.ready)) {
- // Wait for the bootloader to complete before sending commands
return;
}
@@ -728,13 +727,11 @@ class SmoothieController {
}
}
async initController() {
- // Wait for the bootloader to complete before sending commands
- await delay(1000);
-
// Check if it is Smoothieware
this.command('gcode', 'version');
- this.ready = true;
+ await delay(50);
+ this.event.trigger('controller:ready');
}
get status() {
return {
@@ -768,7 +765,7 @@ class SmoothieController {
this.connection.on('close', this.connectionEventListener.close);
this.connection.on('error', this.connectionEventListener.error);
- this.connection.open((err) => {
+ this.connection.open(async (err) => {
if (err) {
log.error(`Error opening serial port "${port}":`, err);
this.emit('serialport:error', { err: err, port: port });
@@ -805,6 +802,12 @@ class SmoothieController {
this.command('unload');
}
+ // Wait for the bootloader to complete before sending commands
+ await delay(1000);
+
+ // Set ready flag to true
+ this.ready = true;
+
// Initialize controller
this.initController();
});
diff --git a/src/server/controllers/TinyG/TinyGController.js b/src/server/controllers/TinyG/TinyGController.js
index d61b1f674..251625560 100644
--- a/src/server/controllers/TinyG/TinyGController.js
+++ b/src/server/controllers/TinyG/TinyGController.js
@@ -618,7 +618,6 @@ class TinyGController {
// Check the ready flag
if (!(this.ready)) {
- // Wait for the bootloader to complete before sending commands
return;
}
@@ -668,9 +667,6 @@ class TinyGController {
return json.replace(/"/g, '').replace(/true/g, 't');
};
- // Wait for the bootloader to complete before sending commands
- await delay(1000);
-
// Enable JSON mode
// 0=text mode, 1=JSON mode
send('{ej:1}');
@@ -733,7 +729,8 @@ class TinyGController {
// Request status report
send('{sr:n}');
- this.ready = true;
+ await delay(50);
+ this.event.trigger('controller:ready');
}
populateContext(context) {
// Machine position
@@ -886,7 +883,7 @@ class TinyGController {
this.connection.on('close', this.connectionEventListener.close);
this.connection.on('error', this.connectionEventListener.error);
- this.connection.open((err) => {
+ this.connection.open(async (err) => {
if (err) {
log.error(`Error opening serial port "${port}":`, err);
this.emit('serialport:error', { err: err, port: port });
@@ -923,6 +920,12 @@ class TinyGController {
this.command('unload');
}
+ // Wait for the bootloader to complete before sending commands
+ await delay(1000);
+
+ // Set ready flag to true
+ this.ready = true;
+
// Initialize controller
this.initController();
});