diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 95b4ab34..43f01518 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,8 +1,13 @@ +v1.0.381: +- Added additional board support to Flashing tools +- Fixed linebreak on realtime feedrate indicator +- Updated esptool for Windows +- Improved USB ID Descriptions handling +- Added more grblHAL settings descriptions v1.0.380: -- Fix for grblHAL startup alarm lock +- Test Fix for grblHAL startup alarm lock v1.0.379: -- Major improvements to USB connection steps, -- set up parser before checking for firmware +- Major improvements to USB connection steps: set up parser before checking for firmware - Added more grblHAL errors/settings descriptions v1.0.378: - Test fix for 4X hanging on DTR connect diff --git a/app/css/main.css b/app/css/main.css index 13b003a3..efbcbaca 100644 --- a/app/css/main.css +++ b/app/css/main.css @@ -19,7 +19,7 @@ body { /* Implemented as default https://thayneco.com/expand-usb-port-selector-in-openbuilds-control/ */ #section-jog div:nth-child(2) label { - width: 350px; + width: 450px; } /* Fix dialog-actions alignment */ diff --git a/app/index.html b/app/index.html index 736f3147..2a8c8094 100644 --- a/app/index.html +++ b/app/index.html @@ -538,7 +538,6 @@

Dark
Mode
- New! Theme diff --git a/app/js/grbl-settings-templates.js b/app/js/grbl-settings-templates.js index 40014356..e96c47f3 100644 --- a/app/js/grbl-settings-templates.js +++ b/app/js/grbl-settings-templates.js @@ -896,9 +896,44 @@ var grblSettingsTemplate2 = { 372: { key: `$372`, title: `Invert I/O Port outputs as bitfield`, - description: ` Invert I/O Port outputs as bitfield`, + description: `Invert I/O Port outputs as bitfield`, template: ``, utils: `` + }, + 140: { + key: `$140`, + title: `X-axis motor current in A, range: 0 - 3.0`, + description: `X-axis motor current in A, range: 0 - 3.0`, + template: ``, + utils: `` + }, + 141: { + key: `$141`, + title: `Y-axis motor current in A, range: 0 - 3.0`, + description: `X-axis motor current in A, range: 0 - 3.0`, + template: ``, + utils: `` + }, + 142: { + key: `$142`, + title: `Z-axis motor current in A, range: 0 - 3.0`, + description: `X-axis motor current in A, range: 0 - 3.0`, + template: ``, + utils: `` + }, + 143: { + key: `$143`, + title: `X-axis motor current in A, range: 0 - 3.0`, + description: `A-axis motor current in A, range: 0 - 3.0`, + template: ``, + utils: `` + }, + 536: { + key: `$536`, + title: `Neopixel strip 1 length, max: 255`, + description: `WS2812B LED strip length, max: 255`, + template: ``, + utils: `` } } \ No newline at end of file diff --git a/app/js/grbl-settings.js b/app/js/grbl-settings.js index 2224d8ab..0865d803 100644 --- a/app/js/grbl-settings.js +++ b/app/js/grbl-settings.js @@ -143,7 +143,6 @@ function grblPopulate() {
Select Machine
@@ -209,7 +209,7 @@ function grblPopulate() {
2. Customize Profile (Optional)
Customise your Grbl settings below. For custom machines, modifications and also for fine tuning your machine profile. Remember to make a BACKUP so you don't lose your customized settings
- +
diff --git a/app/js/websocket.js b/app/js/websocket.js index 02691d3c..6a6b10d7 100644 --- a/app/js/websocket.js +++ b/app/js/websocket.js @@ -705,10 +705,10 @@ function initSocket() { } if (unit == "mm") { - $("#realFeed").html(status.machine.overrides.realFeed + " mm/min"); + $("#realFeed").html(status.machine.overrides.realFeed + "mm/min"); //$("#realSpeed").html("S=" + status.machine.overrides.realSpindle); } else if (unit == "in") { - $("#realFeed").html((status.machine.overrides.realFeed / 25.4).toFixed(0) + " in/min"); + $("#realFeed").html((status.machine.overrides.realFeed / 25.4).toFixed(0) + "in/min"); //$("#realSpeed").html(("S=" + status.machine.overrides.realSpindle / 25.4).toFixed(0) + "in/min"); } @@ -959,17 +959,6 @@ function initSocket() { socket.on("interfaceOutdated", function(status) { console.log("interfaceOutdated", status) - openFlashingTool(); - var select = $("#flashController").data("select").val("interface") - //status.interface.firmware.installedVersion - //status.interface.firmware.availVersion - var template = `We've detected that you are connected to an OpenBuilds Interface on port ` + status.comms.interfaces.activePort + `.

- It's firmware is currently out of date. You are running v` + status.interface.firmware.installedVersion + ` and you can now update to v` + status.interface.firmware.availVersion + `. - Use the wizard below to update the firmware: -


- ` - - $("#FlashDialogMsg").html(template); }) $('#sendCommand').on('click', function() { @@ -1149,12 +1138,11 @@ function populatePortsMenu() { } else { response += `` for (i = 0; i < laststatus.comms.interfaces.ports.length; i++) { - var port = friendlyPort(i) var lastUsedPort = localStorage.getItem('lastUsedPort'); if (laststatus.comms.interfaces.ports[i].path == lastUsedPort) { - response += ``; + response += ``; } else { - response += ``; + response += ``; } @@ -1212,80 +1200,6 @@ function spindleOverride(step) { } } -function friendlyPort(i) { - // var likely = false; - var img = 'usb.png'; - var note = ''; - var manufacturer = laststatus.comms.interfaces.ports[i].manufacturer - if (manufacturer == `(Standard port types)`) { - img = 'serial.png' - note = 'Motherboard Serial Port'; - } else if (laststatus.comms.interfaces.ports[i].productId && laststatus.comms.interfaces.ports[i].vendorId) { - if (laststatus.comms.interfaces.ports[i].productId == '6015' && laststatus.comms.interfaces.ports[i].vendorId == '1D50') { - // found Smoothieboard - img = 'smoothieboard.png'; - note = 'Smoothieware USB Port (Not Supported)'; - } - if (laststatus.comms.interfaces.ports[i].productId == '6001' && laststatus.comms.interfaces.ports[i].vendorId == '0403') { - // found FTDI FT232 - img = 'usb.png'; - note = 'FTDI USB to Serial'; - } - if (laststatus.comms.interfaces.ports[i].productId == '6015' && laststatus.comms.interfaces.ports[i].vendorId == '0403') { - // found FTDI FT230x - img = 'usb.png'; - note = 'FTDI USD to Serial'; - } - if (laststatus.comms.interfaces.ports[i].productId == '606D' && laststatus.comms.interfaces.ports[i].vendorId == '1D50') { - // found TinyG G2 - img = 'usb.png'; - note = 'Tiny G2'; - } - if (laststatus.comms.interfaces.ports[i].productId == '003D' && laststatus.comms.interfaces.ports[i].vendorId == '2341') { - // found Arduino Due Prog Port - img = 'due.png'; - note = 'Arduino Due Prog'; - } - if (laststatus.comms.interfaces.ports[i].productId == '0043' && laststatus.comms.interfaces.ports[i].vendorId == '2341' || laststatus.comms.interfaces.ports[i].productId == '0001' && laststatus.comms.interfaces.ports[i].vendorId == '2341' || laststatus.comms.interfaces.ports[i].productId == '0043' && laststatus.comms.interfaces.ports[i].vendorId == '2A03') { - // found Arduino Uno - img = 'uno.png'; - note = 'Arduino Uno'; - } - if (laststatus.comms.interfaces.ports[i].productId == '2341' && laststatus.comms.interfaces.ports[i].vendorId == '0042') { - // found Arduino Mega - img = 'mega.png'; - note = 'Arduino Mega'; - } - if (laststatus.comms.interfaces.ports[i].productId == '7523' && laststatus.comms.interfaces.ports[i].vendorId == '1A86') { - // found CH340 - img = 'uno.png'; - note = 'WCH.cn CH340 USB to UART'; - } - if (laststatus.comms.interfaces.ports[i].productId == 'EA60' && laststatus.comms.interfaces.ports[i].vendorId == '10C4') { - // found CP2102 - img = 'silabs.png'; - note = 'Silicon Labs USB to UART'; - } - if (laststatus.comms.interfaces.ports[i].productId == '000A' && laststatus.comms.interfaces.ports[i].vendorId == '2E8A') { - // found CP2102 - img = 'pipico.png'; - note = 'Raspberry Pi Pico CDC UART (Not Supported)'; - } - if (laststatus.comms.interfaces.ports[i].productId == '2303' && laststatus.comms.interfaces.ports[i].vendorId == '067B') { - // found CP2102 - // img = 'nodemcu.png'; - note = 'Prolific USB to Serial'; - } - } else { - img = "usb.png"; - } - - return { - img: img, - note: note - }; -} - function escapeHTML(html) { return document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML; } diff --git a/app/wizards/flashingtool2/flashingtool.js b/app/wizards/flashingtool2/flashingtool.js index 6894b007..69c05da5 100644 --- a/app/wizards/flashingtool2/flashingtool.js +++ b/app/wizards/flashingtool2/flashingtool.js @@ -10,6 +10,8 @@ function flashToolBoard(device) { $("#flash-tool-interface-fw-row").hide(); $("#flash-tool-custom-row").hide(); $("#flash-tool-backup-row").show(); + $("#flash-tool-blox-bootloader-row").hide(); + $("#flash-tool-blox-row").hide(); $("#customFirmwareSet").html("Please select the Grbl Firmware hex file you want to flash"); } else if (device == "blackboxx32") { $("#grblHalAxesCount").data("select").val("3axes-grblhal") @@ -19,6 +21,8 @@ function flashToolBoard(device) { $("#flash-tool-interface-fw-row").hide(); $("#flash-tool-custom-row").hide(); $("#flash-tool-backup-row").show(); + $("#flash-tool-blox-bootloader-row").hide(); + $("#flash-tool-blox-row").hide(); $("#customFirmwareSet").html("Please select the GrblHAL Firmware binary file you want to flash"); } else if (device == "interfacev1") { $("#interfaceFirmwareVer").data("select").val("online") @@ -27,22 +31,46 @@ function flashToolBoard(device) { $("#flash-tool-erase-row").hide(); $("#flash-tool-interface-fw-row").show(); $("#flash-tool-backup-row").hide(); + $("#flash-tool-blox-bootloader-row").hide(); + $("#flash-tool-blox-row").hide(); $("#customFirmwareSet").html("Please select the Interface Firmware binary file you want to flash"); + } else if (device == "bloxv1") { + $("#flash-tool-grbl-row").hide(); + $("#flash-tool-grblhal-row").hide(); + $("#flash-tool-erase-row").show(); + $("#flash-tool-interface-fw-row").hide(); + $("#flash-tool-backup-row").show(); + $("#flash-tool-blox-bootloader-row").show(); + $("#flash-tool-blox-row").show(); + $("#customFirmwareSet").html("Please select the BLOX Firmware binary file you want to flash"); } } function openFlashingTool() { var template = ` -
- -

You can use this wizard to flash Firmware onto compatible controllers. Only use with care, or when instructed by Support

+ +
Port
@@ -52,6 +80,17 @@ function openFlashingTool() {
+ + + -
-
Warning
-
+
+

Before upgrading a controller that has already been configured, make sure you have a Grbl Settings Backup before proceeding! If you don't have a backup you may stand to lose your configuration and have to redo it manually

- ` Metro.dialog.create({ @@ -166,6 +203,14 @@ function openFlashingTool() { } }); + $("#bloxFirmwareType").on("change", function() { + if (this.value == "custom") { + $("#flash-tool-custom-row").show(); + } else { + $("#flash-tool-custom-row").hide(); + } + }); + setTimeout(function() { var opts = ` @@ -210,7 +255,6 @@ function flashFirmwarefromWizard() { var data = { port: $("#portUSB2").val(), file: filename, - board: $("#flashController").val(), customImg: false } @@ -301,7 +345,6 @@ function flashFirmwarefromWizard() { var data = { port: $("#portUSB2").val(), file: "firmware.bin", // version that ships with Interface - board: $("#flashController").val() } if ($("#interfaceFirmwareVer").val() == "custom") { @@ -332,6 +375,50 @@ function flashFirmwarefromWizard() { } + } else if (selectedControllerType == "bloxv1") { + var data = { + port: $("#portUSB2").val(), + customImg: false + } + + if ($("#flashErase").val() == "flasherase") { + data.erase = true; + } + + if ($("#bloxFirmwareType").val() == "blox-grblhal-corexy") { + data.file = "blox-grblhal-corexy.bin" // version that ships with Interface + } + + if ($("#bloxFirmwareType").val() == "custom") { + // custom image + if ($("#firmwareBin").val().length > 0) { + var form = document.getElementById('customFirmwareForm'); + var formData = new FormData(form); + var xhr = new XMLHttpRequest(); + xhr.onload = function() { + if (xhr.status == 200) { + console.log(xhr.response) + $("#customFirmwareSet").html(xhr.response); + data.file = xhr.response; + data.customImg = true; + socket.emit('flashBLOX', data); + } + }; + // Add any event handlers here... + xhr.open('POST', '/uploadCustomFirmware', true); + xhr.send(formData); + } else { + $('#controlTab').click(); + $('#consoletab').click(); + printLog("[ Firmware Upgrade ] You selected the option to use a custom firmware file, but failed to select a file to use for the operation. Please try again") + } + + } else { + // latest included firmware + socket.emit('flashBLOX', data) + } + + } else { console.log("no controller selected") } diff --git a/app/wizards/flashingtool2/img/blox-icon.png b/app/wizards/flashingtool2/img/blox-icon.png new file mode 100644 index 00000000..304648d6 Binary files /dev/null and b/app/wizards/flashingtool2/img/blox-icon.png differ diff --git a/blox-bootloader.bin b/blox-bootloader.bin new file mode 100644 index 00000000..5865b8a2 Binary files /dev/null and b/blox-bootloader.bin differ diff --git a/blox-grblhal-corexy.bin b/blox-grblhal-corexy.bin new file mode 100644 index 00000000..6bb7a307 Binary files /dev/null and b/blox-grblhal-corexy.bin differ diff --git a/blox-partition-table.bin b/blox-partition-table.bin new file mode 100644 index 00000000..9e367ff1 Binary files /dev/null and b/blox-partition-table.bin differ diff --git a/esptool.exe b/esptool.exe index cb63f8b1..31bb3539 100644 Binary files a/esptool.exe and b/esptool.exe differ diff --git a/grblStrings.js b/grblStrings.js index 4f7882c9..c110379c 100644 --- a/grblStrings.js +++ b/grblStrings.js @@ -190,7 +190,12 @@ var grblSettingCodes = { 650: "File systems options as bitfield", // Auto mount SD? 673: "Coolant on delay in s after Feedhold resume", 328: "FTP port, range: 1 - 65535, reboot required", - 372: "Invert I/O Port outputs as bitfield:" + 372: "Invert I/O Port outputs as bitfield:", + 140: "X-axis motor current in A, range: 0 - 3.0", + 141: "Y-axis motor current in A, range: 0 - 3.0", + 142: "Z-axis motor current in A, range: 0 - 3.0", + 143: "A-axis motor current in A, range: 0 - 3.0", + 536: "WS2812B LED strip length, max: 255" }; exports.errors = function(id) { diff --git a/index.js b/index.js index 00a7901e..1aefb7fd 100644 --- a/index.js +++ b/index.js @@ -516,8 +516,12 @@ var status = { async function findPorts() { const ports = await SerialPort.list() // console.log(ports) - oldportslist = ports; status.comms.interfaces.ports = ports; + for (i = 0; i < status.comms.interfaces.ports.length; i++) { + var data = friendlyPort(status.comms.interfaces.ports[i]) + status.comms.interfaces.ports[i].img = data.img; + status.comms.interfaces.ports[i].note = data.note; + } } findPorts() @@ -919,7 +923,6 @@ io.on("connection", function(socket) { var port = data.port; var firmwareImagePath = data.file; - var board = data.board var customImg = data.customImg console.log(__dirname, file, data.file) if (customImg) { @@ -998,6 +1001,16 @@ io.on("connection", function(socket) { flashInterface(data) }) + socket.on("flashBLOX", function(data) { + if (status.comms.connectionStatus > 0) { + debug_log('WARN: Closing Port ' + port); + stopPort(); + } else { + debug_log('ERROR: Machine connection not open!'); + } + flashBLOX(data) + }) + socket.on("writeInterfaceUsbDrive", function(data) { debug_log(data) @@ -1591,6 +1604,7 @@ io.on("connection", function(socket) { 'response': "PORT INFO: Port is now open: " + port.path + " - Attempting to detect Controller...", 'type': 'info' } + console.log(port, friendlyPort(port)); io.sockets.emit('data', output); // do attempt 1 addQRealtime("\n"); // this causes smoothie and grblHAL to send the welcome string @@ -1654,7 +1668,7 @@ io.on("connection", function(socket) { setTimeout(function() { setTimeout(function() { - addQRealtime(String.fromCharCode(0x18)); // ctrl-x (needed for rx/tx connection) + addQRealtime(String.fromCharCode(0x18)); // ctrl-x (needed for rx/tx connection) }, 100); addQRealtime(String.fromCharCode(0x18)); // ctrl-x (needed for rx/tx connection) @@ -3472,14 +3486,119 @@ const storage = multer.diskStorage({ } }); -function flashInterface(data) { +function flashBLOX(data) { status.comms.connectionStatus = 6; var port = data.port; var file = data.file; - var board = data.board + var customImg = data.customImg + var erase = data.erase + + console.log(__dirname, file, data.file) + + if (customImg == true) { + var firmwarePath = firmwareImagePath + } else { + var firmwarePath = path.join(__dirname, file) + } + + + + console.log("Flashing BLOX on " + port + " with file: " + file) + + var data = { + 'port': port, + 'string': "[Starting...]" + } + io.sockets.emit("progStatus", data); + + //esptool.exe --chip esp32s3 --port "COM9" --baud 921600 --before default_reset --after hard_reset write_flash + //-e -z --flash_mode dio --flash_freq 80m --flash_size 4MB + //0x0 "C:\Users\user\AppData\Local\Temp\arduino\sketches\1D51207397083FCB1C259015BEFF27B0/external_leds.ino.bootloader.bin" + //0x8000 "C:\Users\user\AppData\Local\Temp\arduino\sketches\1D51207397083FCB1C259015BEFF27B0/external_leds.ino.partitions.bin" + //0xe000 "C:\Users\user\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.5/tools/partitions/boot_app0.bin" + //0x10000 "C:\Users\user\AppData\Local\Temp\arduino\sketches\1D51207397083FCB1C259015BEFF27B0/external_leds.ino.bin" + + var esptool_opts = [ + '--chip', 'esp32s3', + '--port', port, + '--baud', '921600', + '--before', 'default_reset', + '--after', 'hard_reset', + 'write_flash', + '-z', + '--flash_mode', 'dio', + '--flash_freq', 'keep', + '--flash_size', 'keep', + '0x0', path.join(__dirname, "./blox-bootloader.bin").replace('app.asar', 'app.asar.unpacked'), + '0x8000', path.join(__dirname, "./blox-partition-table.bin").replace('app.asar', 'app.asar.unpacked'), + '0x10000', path.resolve(firmwarePath).replace('app.asar', 'app.asar.unpacked') + ]; + + if (erase == true) { + esptool_opts.push('--erase-all'); + } + + console.log(esptool_opts); + + if (process.platform == 'linux') { + //path.join(__dirname, "..", "lib", "resources", "vad.onnx"), + fs.chmodSync(path.join(__dirname, "./esptool.py").replace('app.asar', 'app.asar.unpacked'), 0o755); + var child = spawn(path.join(__dirname, "./esptool.py").replace('app.asar', 'app.asar.unpacked'), esptool_opts); + } else if (process.platform == 'win32') { + var child = spawn(path.join(__dirname, "./esptool.exe").replace('app.asar', 'app.asar.unpacked'), esptool_opts); + } else if (process.platform == 'darwin') { + fs.chmodSync(path.join(__dirname, "./esptool.py").replace('app.asar', 'app.asar.unpacked'), 0o755); + var child = spawn(path.join(__dirname, "./esptool.py").replace('app.asar', 'app.asar.unpacked'), esptool_opts); + } + + + child.stdout.on('data', function(data) { + var debugString = data.toString(); + console.log(debugString) + var data = { + 'port': port, + 'string': debugString + } + io.sockets.emit("progStatus", data); + status.comms.connectionStatus = 6; + + }); + + child.stderr.on('data', function(data) { + var debugString = data.toString(); + console.log(debugString) + var data = { + 'port': port, + 'string': debugString + } + io.sockets.emit("progStatus", data); + status.comms.connectionStatus = 6; + + }); + + child.on('close', (code) => { + var data = { + 'port': port, + 'string': `[exit:` + code + `]`, + 'code': code + } + io.sockets.emit("progStatus", data); + status.comms.connectionStatus = 0; + + }); +} +// end BLOX Programming + +function flashInterface(data) { + status.comms.connectionStatus = 6; + + var port = data.port; + var file = data.file; + var erase = data.erase + console.log("Flashing Interface on " + port + " with file: " + file) // var data = { // 'port': port, @@ -3513,6 +3632,10 @@ function flashInterface(data) { '0x8000', path.join(__dirname, "./firmware.partitions.bin").replace('app.asar', 'app.asar.unpacked') ]; + if (erase == true) { + esptool_opts.push('--erase-all'); + } + if (process.platform == 'linux') { //path.join(__dirname, "..", "lib", "resources", "vad.onnx"), fs.chmodSync(path.join(__dirname, "./esptool.py").replace('app.asar', 'app.asar.unpacked'), 0o755); @@ -3754,5 +3877,93 @@ function scanForTelnetDevices(range) { } // end LAN Scanner +// USB port details + +function friendlyPort(port) { + // var likely = false; + var img = 'usb.png'; + var note = ''; + var manufacturer = port.manufacturer + if (manufacturer == `(Standard port types)`) { + img = 'serial.png' + note = 'Motherboard Serial Port'; + } else if (port.productId && port.vendorId) { + if (port.productId == '6015' && port.vendorId == '1D50') { + // found Smoothieboard + img = 'smoothieboard.png'; + note = 'Smoothieware USB Port (Not Supported)'; + } + if (port.productId == '6001' && port.vendorId == '0403') { + // found FTDI FT232 + img = 'usb.png'; + note = 'FTDI USB to Serial'; + } + if (port.productId == '6015' && port.vendorId == '0403') { + // found FTDI FT230x + img = 'usb.png'; + note = 'FTDI USD to Serial'; + } + if (port.productId == '606D' && port.vendorId == '1D50') { + // found TinyG G2 + img = 'usb.png'; + note = 'Tiny G2'; + } + if (port.productId == '003D' && port.vendorId == '2341') { + // found Arduino Due Prog Port + img = 'due.png'; + note = 'Arduino Due Prog'; + } + if (port.productId == '0043' && port.vendorId == '2341' || port.productId == '0001' && port.vendorId == '2341' || port.productId == '0043' && port.vendorId == '2A03') { + // found Arduino Uno + img = 'uno.png'; + note = 'Arduino Uno'; + } + if (port.productId == '2341' && port.vendorId == '0042') { + // found Arduino Mega + img = 'mega.png'; + note = 'Arduino Mega'; + } + if (port.productId == '7523' && port.vendorId == '1A86') { + // found CH340 + img = 'uno.png'; + note = 'WCH.cn CH340 USB to UART'; + } + if (port.productId == 'EA60' && port.vendorId == '10C4') { + // found CP2102 + img = 'silabs.png'; + note = 'Silicon Labs USB to UART'; + } + if (port.productId == '000A' && port.vendorId == '2E8A') { + // found CP2102 + img = 'pipico.png'; + note = 'Raspberry Pi Pico CDC UART'; + } + if (port.productId == '4001' && port.vendorId == '303A') { + // found CP2102 + img = 'blox.png'; + note = 'OpenBuilds BLOX (with grblHAL)'; + } + if (port.productId == '1001' && port.vendorId == '303A') { + // found CP2102 + img = 'blox.png'; + note = 'OpenBuilds BLOX (Alternate Firmware)'; + } + if (port.productId == '2303' && port.vendorId == '067B') { + // found CP2102 + // img = 'nodemcu.png'; + note = 'Prolific USB to Serial'; + } + } else { + img = "usb.png"; + } + + return { + img: img, + note: note + }; +} + +// End USB Port details + process.on('exit', () => debug_log('exit')) \ No newline at end of file diff --git a/package.json b/package.json index 905cf09f..47c36c10 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "OpenBuildsCONTROL", - "version": "1.0.380", + "version": "1.0.381", "license": "AGPL-3.0", "description": "OpenBuildsCONTROL CNC Machine Host Software", "author": "github.com/openbuilds ",