Skip to content

Commit 98fe069

Browse files
committed
Merge branch 'master' of github.com:1RandomDev/xTool-Connect
2 parents 20a82a7 + b0a0300 commit 98fe069

8 files changed

Lines changed: 133 additions & 7 deletions

File tree

main/app.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ app.whenReady().then(() => {
7272
appSettings = {...appSettings, ...settings};
7373
saveSettings();
7474
});
75+
ipcMain.handle('settings:updateFirmware', (event, updatePath) => {
76+
return deviceController.updateFirmware(updatePath);
77+
});
7578

7679
ipcMain.handle('wifiSetup:connect', (event, credentials) => {
7780
return deviceController.setupWifi(credentials);

main/device-controller.js

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ module.exports.getInfo = async () => {
131131
return {};
132132
}
133133

134-
const settings = {};
134+
const settings = { ipAddress: deviceAddress };
135135

136136
try {
137137
let res = await axios.get(`http://${deviceAddress}:8080/getmachinetype`);
@@ -377,15 +377,34 @@ module.exports.getProgress = async () => {
377377

378378
module.exports.control = async (action) => {
379379
if(!connected) {
380-
console.error('Sending control message faild: Not connected');
380+
console.error('Sending control message failed: Not connected');
381381
return;
382382
}
383383

384384
try {
385385
await axios.get(`http://${deviceAddress}:8080/cnc/data?action=${action}`);
386386
if(action == 'stop') await this.executeGcode('M108\nM112 N0\nM9 S0 N0\n');
387387
} catch(err) {
388-
console.error('Sending control message faild:', err);
388+
console.error('Sending control message failed:', err);
389389
}
390390
return;
391391
};
392+
393+
module.exports.updateFirmware = async (updatePath) => {
394+
if(!connected) {
395+
console.error('Firmware update failed: Not connected');
396+
return false;
397+
}
398+
399+
try {
400+
const form = new FormData();
401+
form.append('file', fs.createReadStream(updatePath), 'update.bin');
402+
403+
const res = await axios.post(`http://${deviceAddress}:8080/upgrade`, form);
404+
console.log(res.data);
405+
return res.data == 'OK';
406+
} catch(err) {
407+
console.error('Firmware update failed:', err);
408+
return false;
409+
}
410+
}

main/preload.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ contextBridge.exposeInMainWorld('electronAPI', {
1111
scanDevices: () => ipcRenderer.invoke('deviceMenu:discover'),
1212
getSettings: () => ipcRenderer.invoke('settings:get'),
1313
saveSettings: (settings) => ipcRenderer.invoke('settings:save', settings),
14+
updateFirmware: (updatePath) => ipcRenderer.invoke('settings:updateFirmware', updatePath),
1415
uploadGcode: (path, type) => ipcRenderer.invoke('control:uploadGcode', path, type),
1516
moveLaser: (direction) => ipcRenderer.invoke('control:moveLaser', direction),
1617
setLaserDot: (active) => ipcRenderer.invoke('control:setLaserDot', active),

renderer/assets/css/index.css

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,46 @@ body {
3232
width: 35px;
3333
background-image: url("../img/plus-circle.svg");
3434
}
35+
36+
#deviceDiscovery {
37+
position: absolute;
38+
bottom: 20px;
39+
right: 20px;
40+
left: 20px;
41+
max-height: 150px;
42+
overflow-y: auto;
43+
background-color: #252627;
44+
border: 1px solid #a0a0a0;
45+
border-radius: 4px;
46+
}
47+
#deviceDiscovery .scanning {
48+
display: none;
49+
text-align: center;
50+
color: #d1d1d1;
51+
margin: 10px;
52+
}
53+
#deviceDiscovery .rescan {
54+
text-align: center;
55+
margin: 4px;
56+
}
57+
#deviceDiscovery .rescan .rescanBtn {
58+
color: #a3a3a3;
59+
text-decoration: none;
60+
}
61+
#deviceDiscovery .rescan .rescanBtn:hover {
62+
text-decoration: underline;
63+
}
64+
#deviceDiscovery .device {
65+
padding: 10px 15px;
66+
border-top: 1px solid #575757;
67+
box-sizing: content-box;
68+
cursor: pointer;
69+
}
70+
#deviceDiscovery .device:hover {
71+
background-color: #343536;
72+
transition: 0.2s;
73+
}
74+
#deviceDiscovery .device .ip {
75+
float: right;
76+
color: #999999;
77+
}

renderer/assets/js/index.js

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
const ipAddressField = document.getElementById('ipAddressField');
22
const connectBtn = document.getElementById('connectBtn');
33
const autoConnectOpt = document.getElementById('autoConnectOpt');
4+
const deviceDiscovery = document.getElementById('deviceDiscovery');
45

56
ipAddressField.addEventListener('keyup', () => {
67
connectBtn.disabled = ipAddressField.value == '';
@@ -11,6 +12,7 @@ ipAddressField.addEventListener('keypress', event => {
1112
}
1213
});
1314
connectBtn.addEventListener('click', () => {
15+
if(connectBtn.classList.contains('running')) return;
1416
connectBtn.classList.add('running');
1517
window.electronAPI.saveSettings({deviceAddress: ipAddressField.value});
1618

@@ -27,6 +29,10 @@ connectBtn.addEventListener('click', () => {
2729
autoConnectOpt.addEventListener('change', () => {
2830
window.electronAPI.saveSettings({autoConnect: autoConnectOpt.checked});
2931
});
32+
deviceDiscovery.querySelector('.rescanBtn').addEventListener('click', event => {
33+
event.preventDefault();
34+
scanDevices();
35+
});
3036

3137
(async () => {
3238
const settings = await window.electronAPI.getSettings();
@@ -37,9 +43,39 @@ autoConnectOpt.addEventListener('change', () => {
3743
if(settings.autoConnect && await window.electronAPI.firstConnect()) {
3844
connectBtn.click();
3945
}
46+
47+
const params = new URLSearchParams(window.location.search);
48+
if(params.get('message') == 'timeout') {
49+
toastr.error('Connection to device lost. Please check your internet connection and reconnect.', 'Connection lost');
50+
if(settings.autoConnect) {
51+
setTimeout(() => {
52+
connectBtn.click();
53+
}, 5000);
54+
}
55+
}
56+
57+
scanDevices();
4058
})();
4159

42-
const params = new URLSearchParams(window.location.search);
43-
if(params.get('message') == 'timeout') {
44-
toastr.error('Connection to device lost. Please check your internet connection and reconnect.', 'Connection lost');
60+
async function scanDevices() {
61+
const rescan = deviceDiscovery.querySelector('.rescan');
62+
const scanning = deviceDiscovery.querySelector('.scanning');
63+
rescan.style.display = 'none';
64+
scanning.style.display = 'block';
65+
66+
const devices = await window.electronAPI.scanDevices();
67+
for(let dev of deviceDiscovery.querySelectorAll('.device')) dev.remove();
68+
devices.forEach(dev => {
69+
const element = document.createElement('div');
70+
element.classList.add('device');
71+
element.innerHTML = `<span class="name">${dev.name}</span><span class="ip">${dev.ip}</span>`;
72+
element.onclick = () => {
73+
ipAddressField.value = dev.ip;
74+
connectBtn.click();
75+
};
76+
deviceDiscovery.appendChild(element);
77+
});
78+
79+
rescan.style.display = null;
80+
scanning.style.display = null;
4581
}

renderer/assets/js/settings.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,18 @@ settingsContainer.addEventListener('change', event => {
1414
settingsContainer.querySelector('[name="crossOffsetY"]').disabled = value == '1';
1515
}
1616
});
17+
document.getElementById('updateButton').addEventListener('click', async event => {
18+
let input = document.createElement('input');
19+
input.type = 'file';
20+
input.accept = '.bin';
21+
input.onchange = () => {
22+
toastr.success('The device will restart after the update has been completed.', 'Started firmware update');
23+
event.target.innerText = 'Uploading...';
24+
event.target.disabled = true;
25+
window.electronAPI.updateFirmware(input.files[0].path);
26+
};
27+
input.click();
28+
});
1729

1830
(async () => {
1931
const deviceInfo = await window.electronAPI.getDeviceInfo();

renderer/index.html

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,15 @@ <h2>Connect your device</h2>
2323
<label for="autoConnectOpt">Auto connect</label>
2424
</div>
2525
</div>
26+
<div id="deviceDiscovery">
27+
<div class="scanning">
28+
<div class="ld ld-spin ld-ring"></div>&nbsp;
29+
Scanning for devices
30+
</div>
31+
<div class="rescan">
32+
<a href="" class="rescanBtn">Scan again</a>
33+
</div>
34+
</div>
2635
<script src="assets/js/jquery.min.js"></script>
2736
<script src="assets/js/toastr.min.js"></script>
2837
<script src="assets/js/index.js"></script>

renderer/settings.html

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,16 @@ <h3>Device info</h3>
7373
<label for="firmwareVersion">Firmware version</label>
7474
<span class="info" name="firmwareVersion"></span>
7575
</div>
76-
<button id="updateButton" class="defaultButton">Check for updates</button>
76+
<button id="updateButton" class="defaultButton">Manual Update</button>
7777

7878
<label for="serialNumber">Serial number</label>
7979
<span class="info" name="serialNumber"></span>
8080

8181
<label for="macAddress">MAC address</label>
8282
<span class="info" name="macAddress"></span>
83+
84+
<label for="ipAddress">IP address</label>
85+
<span class="info" name="ipAddress"></span>
8386
</div>
8487

8588
<script src="assets/js/jquery.min.js"></script>

0 commit comments

Comments
 (0)