From 4594581e3559dca7c39f52c68402dd271730b0cd Mon Sep 17 00:00:00 2001 From: Sophia Beluli Date: Mon, 29 Apr 2024 13:53:22 -0400 Subject: [PATCH 1/4] change spindle delay to number 0+; fix bug with saving spindle delay on backend store --- .../containers/Preferences/Preferences.jsx | 14 ++++---- .../Preferences/SpindleLaser/index.js | 35 ++++++++++--------- src/app/sagas/controllerSagas.js | 5 +++ src/app/store/defaultState.js | 2 +- src/server/controllers/Grbl/GrblController.js | 4 +-- .../controllers/Grblhal/GrblHalController.js | 4 +-- 6 files changed, 35 insertions(+), 29 deletions(-) diff --git a/src/app/containers/Preferences/Preferences.jsx b/src/app/containers/Preferences/Preferences.jsx index 8da689411..486b194c6 100644 --- a/src/app/containers/Preferences/Preferences.jsx +++ b/src/app/containers/Preferences/Preferences.jsx @@ -177,6 +177,7 @@ class PreferencesPage extends PureComponent { }, showWarning: store.get('widgets.visualizer.showWarning'), showLineWarnings: store.get('widgets.visualizer.showLineWarnings'), + spindleDelay: store.get('widgets.spindle.delay'), shouldWarnZero: store.get('workspace.shouldWarnZero', false), ipRange: store.get('widgets.connection.ip', [192, 168, 5, 1]), toolChange: { @@ -527,13 +528,9 @@ class PreferencesPage extends PureComponent { pubsub.publish('spindle:updated', newSpindleValue); }, - handleDelayToggle: (hasDelay) => { - const { spindle } = this.state; + handleDelayChange: (delay) => { this.setState({ - spindle: { - ...spindle, - delay: hasDelay - } + spindleDelay: delay }); } }, @@ -851,7 +848,8 @@ class PreferencesPage extends PureComponent { safeRetractHeight, customDecimalPlaces, spindle, - toolChange + toolChange, + spindleDelay } = this.state; store.set('workspace.reverseWidgets', reverseWidgets); @@ -870,7 +868,7 @@ class PreferencesPage extends PureComponent { store.replace('workspace[probeProfile]', probe); store.set('widgets.spindle.spindleMax', spindle.spindleMax); store.set('widgets.spindle.spindleMin', spindle.spindleMin); - store.set('widgets.spindle.delay', spindle.delay); + store.set('widgets.spindle.delay', spindleDelay); this.probeConfig.set('retractionDistance', probeSettings.retractionDistance); this.probeConfig.set('probeFeedrate', probeSettings.normalFeedrate); this.probeConfig.set('probeFastFeedrate', probeSettings.fastFeedrate); diff --git a/src/app/containers/Preferences/SpindleLaser/index.js b/src/app/containers/Preferences/SpindleLaser/index.js index fae2c57c6..d50fc0e8c 100644 --- a/src/app/containers/Preferences/SpindleLaser/index.js +++ b/src/app/containers/Preferences/SpindleLaser/index.js @@ -6,6 +6,7 @@ import controller from 'app/lib/controller'; import SettingWrapper from '../components/SettingWrapper'; import Fieldset from '../components/Fieldset'; +import Input from '../components/Input'; import GeneralArea from '../components/GeneralArea'; import TooltipCustom from '../../../components/TooltipCustom/ToolTip'; import Laser from './Laser'; @@ -14,8 +15,14 @@ import { collectUserUsageData } from '../../../lib/heatmap'; import { USAGE_TOOL_NAME } from '../../../constants'; const SpindleLaser = ({ active, state, actions }) => { + const { spindle } = state; + const spindleActions = actions.spindle; + const [delay, setDelay] = useState(spindle.delay); const [machineProfile, setMachineProfile] = useState(store.get('workspace.machineProfile', {})); - const [delay, setDelay] = useState(store.get('widgets.spindle.delay', false)); + + useEffect(() => { + setDelay(spindle.delay); + }, [spindle]); useEffect(() => { const timeout = setTimeout(() => { @@ -55,13 +62,7 @@ const SpindleLaser = ({ active, state, actions }) => { setMachineProfile(updatedObj); }; - const handleSpindleDelayToggle = () => { - const spindleActions = actions.spindle; - spindleActions.handleDelayToggle(!delay); - setDelay(!delay); - }; - - const { spindle, laserOnOutline } = machineProfile; + const { spindle: isSpindle, laserOnOutline } = machineProfile; return ( @@ -71,7 +72,7 @@ const SpindleLaser = ({ active, state, actions }) => { @@ -79,20 +80,22 @@ const SpindleLaser = ({ active, state, actions }) => { - - + spindleActions.handleDelayChange(e.target.value)} /> +

Please reload your file if you are changing from 0 delay.

diff --git a/src/app/sagas/controllerSagas.js b/src/app/sagas/controllerSagas.js index ae8f56657..ec6f7a340 100644 --- a/src/app/sagas/controllerSagas.js +++ b/src/app/sagas/controllerSagas.js @@ -345,6 +345,7 @@ export function* initialize() { const machineProfile = store.get('workspace.machineProfile'); const showLineWarnings = store.get('widgets.visualizer.showLineWarnings'); + const delay = store.get('widgets.spindle.delay'); // Reset homing run flag to prevent rapid position without running homing reduxStore.dispatch({ type: controllerActions.RESET_HOMING, @@ -357,6 +358,10 @@ export function* initialize() { if (showLineWarnings) { controller.command('settings:updated', { showLineWarnings }); } + + if (delay !== undefined) { + controller.command('settings:updated', { spindleDelay: delay }); + } const hooks = store.get('workspace.toolChangeHooks', {}); const toolChangeOption = store.get('workspace.toolChangeOption', 'Ignore'); const toolChangeContext = { diff --git a/src/app/store/defaultState.js b/src/app/store/defaultState.js index 1c71796aa..4865c09c6 100644 --- a/src/app/store/defaultState.js +++ b/src/app/store/defaultState.js @@ -290,7 +290,7 @@ const defaultState = { speed: 1000, spindleMax: 30000, spindleMin: 10000, - delay: false, + delay: 0, laser: { power: 100, duration: 1, diff --git a/src/server/controllers/Grbl/GrblController.js b/src/server/controllers/Grbl/GrblController.js index 071ced5e5..ae9640e4b 100644 --- a/src/server/controllers/Grbl/GrblController.js +++ b/src/server/controllers/Grbl/GrblController.js @@ -1453,13 +1453,13 @@ class GrblController { // add delay to spindle startup if enabled const preferences = store.get('preferences', {}); - const delay = _.get(preferences, 'spindle.delay', false); + const delay = _.get(preferences, 'spindleDelay', 0); // test if there is a G4 command already const delayRegex = new RegExp('(G4 ?P?[0-9]+)'); // only add one if there isn't if (delay && !delayRegex.test(gcode)) { - gcode = gcode.replace(/\b(?:S\d* ?M[34]|M[34] ?S\d*)\b/g, '$& G4 P1'); + gcode = gcode.replace(/\b(?:S\d* ?M[34]|M[34] ?S\d*)\b/g, `$& G4 P${delay}`); } const gcodeWithoutComments = gcode.replace(bracketCommentLine, ''); diff --git a/src/server/controllers/Grblhal/GrblHalController.js b/src/server/controllers/Grblhal/GrblHalController.js index 7608a2c7a..4bb25c591 100644 --- a/src/server/controllers/Grblhal/GrblHalController.js +++ b/src/server/controllers/Grblhal/GrblHalController.js @@ -1496,10 +1496,10 @@ class GrblHalController { // add delay to spindle startup if enabled const preferences = store.get('preferences', {}); - const delay = _.get(preferences, 'spindle.delay', false); + const delay = _.get(preferences, 'spindleDelay', 0); if (delay) { - gcode = gcode.replace(/\b(?:S\d* ?M[34]|M[34] ?S\d*)\b(?! ?G4 ?P?\b)/g, '$& G4 P1'); + gcode = gcode.replace(/\b(?:S\d* ?M[34]|M[34] ?S\d*)\b(?! ?G4 ?P?\b)/g, `$& G4 P${delay}`); } const ok = this.sender.load(name, gcode + '\n', context); From b7c67a54f213e8011f80d69bc74e766f97ac5655 Mon Sep 17 00:00:00 2001 From: Sophia Beluli Date: Mon, 29 Apr 2024 14:15:01 -0400 Subject: [PATCH 2/4] null check --- src/app/containers/Preferences/SpindleLaser/index.js | 2 +- src/server/controllers/Grbl/GrblController.js | 2 +- src/server/controllers/Grblhal/GrblHalController.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/containers/Preferences/SpindleLaser/index.js b/src/app/containers/Preferences/SpindleLaser/index.js index d50fc0e8c..0502a411d 100644 --- a/src/app/containers/Preferences/SpindleLaser/index.js +++ b/src/app/containers/Preferences/SpindleLaser/index.js @@ -95,7 +95,7 @@ const SpindleLaser = ({ active, state, actions }) => { hasRounding={false} onChange={(e) => spindleActions.handleDelayChange(e.target.value)} /> -

Please reload your file if you are changing from 0 delay.

+

Please reload your file after changing delay.

diff --git a/src/server/controllers/Grbl/GrblController.js b/src/server/controllers/Grbl/GrblController.js index ae9640e4b..3a1cc0699 100644 --- a/src/server/controllers/Grbl/GrblController.js +++ b/src/server/controllers/Grbl/GrblController.js @@ -1458,7 +1458,7 @@ class GrblController { // test if there is a G4 command already const delayRegex = new RegExp('(G4 ?P?[0-9]+)'); // only add one if there isn't - if (delay && !delayRegex.test(gcode)) { + if (Number(delay) && !delayRegex.test(gcode)) { gcode = gcode.replace(/\b(?:S\d* ?M[34]|M[34] ?S\d*)\b/g, `$& G4 P${delay}`); } diff --git a/src/server/controllers/Grblhal/GrblHalController.js b/src/server/controllers/Grblhal/GrblHalController.js index 4bb25c591..920448a08 100644 --- a/src/server/controllers/Grblhal/GrblHalController.js +++ b/src/server/controllers/Grblhal/GrblHalController.js @@ -1498,7 +1498,7 @@ class GrblHalController { const preferences = store.get('preferences', {}); const delay = _.get(preferences, 'spindleDelay', 0); - if (delay) { + if (Number(delay)) { gcode = gcode.replace(/\b(?:S\d* ?M[34]|M[34] ?S\d*)\b(?! ?G4 ?P?\b)/g, `$& G4 P${delay}`); } From a73168eea37103658354ca7edb931ff33479c741 Mon Sep 17 00:00:00 2001 From: Sophia Beluli Date: Fri, 10 May 2024 14:50:57 -0400 Subject: [PATCH 3/4] changed store merge function to always use saved value if both are not objects; added migration for spindle delay --- src/app/store/index.js | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/app/store/index.js b/src/app/store/index.js index 385e45c1e..09372bac1 100644 --- a/src/app/store/index.js +++ b/src/app/store/index.js @@ -6,7 +6,7 @@ import get from 'lodash/get'; import set from 'lodash/set'; // import merge from 'lodash/merge'; import uniq from 'lodash/uniq'; -import { isEmpty, isNumber, isString } from 'lodash'; +import { isEmpty } from 'lodash'; import semver from 'semver'; import settings from '../config/settings'; import ImmutableStore from '../lib/immutable-store'; @@ -160,31 +160,20 @@ const normalizeState = (state) => { }; const merge = (base, saved) => { - const numberRegex = /^-?\d+.?\d*$/; - const baseIsObject = base instanceof Object; const baseIsArray = Array.isArray(base); const savedIsObject = saved instanceof Object; const savedIsArray = Array.isArray(saved); - const fromStringToNumber = isNumber(base) && isString(saved) && numberRegex.test(saved); - const fromNumberToString = isNumber(saved) && isString(base) && numberRegex.test(base); - + // if they are both not objects, use saved. migration will be made later if needed if ( (!(baseIsObject) || baseIsArray) && (!(savedIsObject) || savedIsArray) ) { - // if they are the same type, use saved - // when numbers are rounded, they become strings - // so if it changes between those two types, and the string is a number, keep saved - if ((typeof base === typeof saved) || fromStringToNumber || fromNumberToString) { - return saved; - } - // if they are not, default structure changed, so use base - return base; + return saved; + // if one is an object and the other isn't, then default structure changed, so use base } else if ((!(baseIsObject) || baseIsArray) || (!(savedIsObject) || savedIsArray)) { - // if one is an object and the other isn't, then default structure changed, so use base return base; } @@ -255,6 +244,15 @@ const migrateStore = () => { return; } + if (semver.lt(cnc.version, '1.4.7')) { + const delay = store.get('widgets.spindle.delay'); + if (delay) { + store.set('widgets.spindle.delay', 1); + } else { + store.set('widgets.spindle.delay', 0); + } + } + if (semver.lt(cnc.version, '1.4.4')) { store.replace('widgets.connection.controller.type', 'Grbl'); } From 90b7e7c9753725bc822458a73ab3ad1f03093a8c Mon Sep 17 00:00:00 2001 From: Sophia Beluli Date: Fri, 10 May 2024 14:57:46 -0400 Subject: [PATCH 4/4] change version --- package.json | 2 +- src/app/store/index.js | 2 +- src/package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 81754ecef..54fc7736d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gSender", - "version": "1.4.7", + "version": "1.4.8", "description": "Electron sender for GRBL based CNC machines", "author": { "name": "Sienci Labs ", diff --git a/src/app/store/index.js b/src/app/store/index.js index 09372bac1..200231468 100644 --- a/src/app/store/index.js +++ b/src/app/store/index.js @@ -244,7 +244,7 @@ const migrateStore = () => { return; } - if (semver.lt(cnc.version, '1.4.7')) { + if (semver.lt(cnc.version, '1.4.8')) { const delay = store.get('widgets.spindle.delay'); if (delay) { store.set('widgets.spindle.delay', 1); diff --git a/src/package.json b/src/package.json index 92a63d0aa..dbb4a29ea 100644 --- a/src/package.json +++ b/src/package.json @@ -1,6 +1,6 @@ { "name": "gSender", - "version": "1.4.7", + "version": "1.4.8", "productName": "gSender", "description": "CNC Milling Controller", "author": {