Skip to content

Commit 3a40ecd

Browse files
author
Alberto Iannaccone
committed
get firmware version as parameter + close serial befor uploading
1 parent b8b7326 commit 3a40ecd

File tree

2 files changed

+94
-108
lines changed

2 files changed

+94
-108
lines changed

demo/app.jsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,12 @@ const handleBootloaderMode = (e, port) => {
5252
daemon.setBootloaderMode(port);
5353
};
5454

55-
const handleUpdateFirmware = (e, boardId, port, wifiModule) => {
55+
const handleUpdateFirmware = (e, boardId, port, firmwareVersion) => {
5656
e.preventDefault();
5757
if (![firmwareUpdater.updateStatusEnum.NOPE, firmwareUpdater.updateStatusEnum.DONE, firmwareUpdater.updateStatusEnum.ERROR].includes(firmwareUpdater.updating.getValue().status)) {
5858
return;
5959
}
60-
firmwareUpdater.updateFirmware(boardId, port, wifiModule);
60+
firmwareUpdater.updateFirmware(boardId, port, firmwareVersion);
6161
firmwareUpdater.updatingDone.subscribe(() => {
6262
console.log('Firmware updated successfully!');
6363
});
@@ -197,10 +197,10 @@ class App extends React.Component {
197197
close
198198
</a> - <a href="#" onClick={(e) => handleBootloaderMode(e, device.Name)}>
199199
bootloader mode
200-
</a> - <a href="#" onClick={(e) => handleUpdateFirmware(e, 'mkrwifi1010', device.Name, 'wifiNina')}>
201-
Wifi NINA update firmware
202-
</a> - <a href="#" onClick={(e) => handleUpdateFirmware(e, 'mkr1000', device.Name, 'wifi101')}>
203-
Wifi 101 update firmware
200+
</a> - <a href="#" onClick={(e) => handleUpdateFirmware(e, 'mkrwifi1010', device.Name, '1.0.0')}>
201+
MKR WiFi 1010 update firmware
202+
</a> - <a href="#" onClick={(e) => handleUpdateFirmware(e, 'mkr1000', device.Name, '19.4.4')}>
203+
MKR1000 update firmware
204204
</a>
205205
</li>);
206206

src/firmware-updater.js

Lines changed: 88 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,6 @@ import {
66
first
77
} from 'rxjs/operators';
88

9-
const versionsMap = {
10-
wifi101: {
11-
latestVersion: 'WINC1500 19.5.4',
12-
loaderPath: null,
13-
latestVersionPath: null
14-
},
15-
wifiNina: {
16-
latestVersion: 'NINA 1.2.2',
17-
loaderPath: null,
18-
latestVersionPath: null
19-
}
20-
};
21-
229
/* The status of the Firmware Updater Tool */
2310
const FWUToolStatusEnum = Object.freeze({
2411
NOPE: 'NOPE',
@@ -69,7 +56,9 @@ export default class FirmwareUpdater {
6956
.pipe(takeUntil(this.updatingError));
7057
}
7158

72-
getFirmwareInfo(boardId, port, wifiModule) {
59+
getFirmwareInfo(boardId, port, firmwareVersion) {
60+
this.firmwareVersionData = null;
61+
this.loaderPath = null;
7362
this.updating.next({ status: this.updateStatusEnum.GETTING_INFO });
7463
let versionsList = [];
7564
let firmwareInfoMessagesSubscription;
@@ -85,22 +74,25 @@ export default class FirmwareUpdater {
8574
const versions = JSON.parse(message.Msg);
8675
Object.keys(versions).forEach(v => {
8776
if (versions[v][0].IsLoader) {
88-
versionsMap[wifiModule].loaderPath = versions[v][0].Path;
77+
this.loaderPath = versions[v][0].Path;
8978
}
9079
else {
9180
versionsList = [...versionsList, ...versions[v]];
9281
}
9382
});
94-
const latestVersion = versionsList.find(version => version.Name === versionsMap[wifiModule].latestVersion)
95-
versionsMap[wifiModule].latestVersionPath = latestVersion.Path;
83+
this.firmwareVersionData = versionsList.find(version => version.Name.split(' ').splice(-1)[0].trim() === firmwareVersion);
84+
if (!this.firmwareVersionData) {
85+
this.updating.next({ status: this.updateStatusEnum.ERROR, err: `Can't get firmware info: couldn't find version '${firmwareVersion}' for board '${boardId}'` });
86+
return;
87+
}
9688
break;
9789
case 'Error':
98-
this.updating.next({ status: this.updateStatusEnum.ERROR, err: `Couldn't get firmware info: ${message}` })
90+
this.updating.next({ status: this.updateStatusEnum.ERROR, err: `Couldn't get firmware info: ${message.Msg}` });
9991
firmwareInfoMessagesSubscription.unsubscribe();
10092
break;
10193
case 'Done':
10294
firmwareInfoMessagesSubscription.unsubscribe();
103-
this.updating.next({ status: this.updateStatusEnum.GOT_INFO, versionsList })
95+
this.updating.next({ status: this.updateStatusEnum.GOT_INFO });
10496
break;
10597
default:
10698
break;
@@ -147,102 +139,96 @@ export default class FirmwareUpdater {
147139
});
148140
}
149141

150-
/*
151-
wifiModule can be either 'wifiNina' or 'wifi101'
152-
*/
153-
updateFirmware(boardId, port, wifiModule) {
142+
updateFirmware(boardId, port, firmwareVersion) {
154143
this.updating.next({ status: this.updateStatusEnum.STARTED });
155-
if (!port) {
156-
this.updating.next({ status: this.updateStatusEnum.ERROR, err: `Can't update Firmware: no port selected.` });
157-
return;
158-
}
159-
this.gotFWInfo.subscribe(state => {
160-
if (!versionsMap[wifiModule] && !versionsMap[wifiModule].latestVersion) {
161-
this.updating.next({ status: this.updateStatusEnum.ERROR, err: `Can't update Firmware: couldn't find module '${wifiModule}'` });
162-
return;
163-
}
164-
const latestVersion = state.versionsList.find(version => version.Name === versionsMap[wifiModule].latestVersion);
165-
if (!latestVersion) {
166-
this.updating.next({ status: this.updateStatusEnum.ERROR, err: `Can't update Firmware: couldn't find version '${versionsMap[wifiModule].latestVersion}' for module '${versionsMap[wifiModule]}'` });
144+
this.Daemon.closeSerialMonitor(port);
145+
this.Daemon.serialMonitorOpened.pipe(filter(open => !open)).pipe(first()).subscribe(() => {
146+
if (!port) {
147+
this.updating.next({ status: this.updateStatusEnum.ERROR, err: `Can't update Firmware: no port selected.` });
167148
return;
168149
}
169-
170-
let updateFirmwareMessagesSubscription;
171-
172-
const handleFirmwareUpdateMessage = message => {
173-
switch (message.ProgrammerStatus) {
174-
case 'Error':
175-
this.updating.next({ status: this.updateStatusEnum.ERROR, err: `Can't update Firmware: ${message.Msg}`});
176-
updateFirmwareMessagesSubscription.unsubscribe();
177-
break;
178-
case 'Done':
179-
this.updating.next({ status: this.updateStatusEnum.DONE});
180-
updateFirmwareMessagesSubscription.unsubscribe();
181-
break;
182-
default:
183-
break;
150+
this.gotFWInfo.subscribe(state => {
151+
if (!this.firmwareVersionData) {
152+
this.updating.next({ status: this.updateStatusEnum.ERROR, err: `Can't update Firmware: couldn't find version '${firmwareVersion}' for board '${boardId}'` });
153+
return;
184154
}
185-
}
186155

187-
updateFirmwareMessagesSubscription = this.Daemon.appMessages.subscribe(message => {
188-
if (message.ProgrammerStatus) {
189-
handleFirmwareUpdateMessage(message);
156+
let updateFirmwareMessagesSubscription;
157+
158+
const handleFirmwareUpdateMessage = message => {
159+
switch (message.ProgrammerStatus) {
160+
case 'Error':
161+
this.updating.next({ status: this.updateStatusEnum.ERROR, err: `Can't update Firmware: ${message.Msg}`});
162+
updateFirmwareMessagesSubscription.unsubscribe();
163+
break;
164+
case 'Done':
165+
this.updating.next({ status: this.updateStatusEnum.DONE});
166+
updateFirmwareMessagesSubscription.unsubscribe();
167+
break;
168+
default:
169+
break;
170+
}
190171
}
191-
});
192172

193-
let addresses = '';
194-
const rootCertificates = [{
195-
domain: 'arduino.cc',
196-
port: 443
197-
}];
198-
199-
rootCertificates.forEach(address => {
200-
if (address.domain && address.port) {
201-
addresses += `-address ${address.domain}:${address.port} `;
202-
}
203-
});
173+
updateFirmwareMessagesSubscription = this.Daemon.appMessages.subscribe(message => {
174+
if (message.ProgrammerStatus) {
175+
handleFirmwareUpdateMessage(message);
176+
}
177+
});
204178

205-
const isUsingAvrdude = boardId === 'uno2018';
206-
const programmer = isUsingAvrdude ? '{runtime.tools.avrdude}/bin/avrdude' : '{runtime.tools.bossac}/bossac';
179+
let addresses = '';
180+
const rootCertificates = [{
181+
domain: 'arduino.cc',
182+
port: 443
183+
}];
184+
185+
rootCertificates.forEach(address => {
186+
if (address.domain && address.port) {
187+
addresses += `-address ${address.domain}:${address.port} `;
188+
}
189+
});
207190

208-
const loaderPath = versionsMap[wifiModule].loaderPath;
209-
if (!loaderPath) {
210-
this.updating.next({ status: this.updateStatusEnum.ERROR, err: `Can't update Firmware: invalid loaderPath` });
211-
return;
212-
}
191+
const isUsingAvrdude = boardId === 'uno2018';
192+
const programmer = isUsingAvrdude ? '{runtime.tools.avrdude}/bin/avrdude' : '{runtime.tools.bossac}/bossac';
213193

214-
const data = {
215-
board: boardId,
216-
port,
217-
commandline: `"{runtime.tools.fwupdater.path}/updater" -flasher {network.password} -firmware {upload.verbose} -port {serial.port} -restore_binary "{build.path}/{build.project_name}.bin" -programmer ${programmer}`,
218-
hex: '',
219-
extra: {
220-
auth: {
221-
password: loaderPath
222-
},
223-
verbose: true,
224-
params_verbose: `${versionsMap[wifiModule].latestVersionPath} ${addresses}` // eslint-disable-line camelcase
225-
},
226-
signature: isUsingAvrdude ? signaturesEnum.UPLOAD_FIRMWARE_AVRDUDE : signaturesEnum.UPLOAD_FIRMWARE_BOSSAC,
227-
filename: 'CheckFirmwareVersion.bin'
228-
};
229-
230-
fetch(`${this.Daemon.pluginURL}/upload`, {
231-
method: 'POST',
232-
headers: {
233-
'Content-Type': 'text/plain; charset=utf-8'
234-
},
235-
body: JSON.stringify(data)
236-
}).then(response => {
237-
if (!response.ok) {
238-
this.updating.next({ status: this.updateStatusEnum.ERROR, err: `Can't update Firmware: error fetching ${this.Daemon.pluginURL}/upload` });
194+
if (!this.loaderPath) {
195+
this.updating.next({ status: this.updateStatusEnum.ERROR, err: `Can't update Firmware: 'loaderPath' is empty or 'null'` });
239196
return;
240197
}
241-
}).catch(reason => {
242-
this.updating.next({ status: this.updateStatusEnum.ERROR, err: `Can't update Firmware: ${reason}` });
243-
return;
198+
199+
const data = {
200+
board: boardId,
201+
port,
202+
commandline: `"{runtime.tools.fwupdater.path}/updater" -flasher {network.password} -firmware {upload.verbose} -port {serial.port} -restore_binary "{build.path}/{build.project_name}.bin" -programmer ${programmer}`,
203+
hex: '',
204+
extra: {
205+
auth: {
206+
password: this.loaderPath
207+
},
208+
verbose: true,
209+
params_verbose: `${this.firmwareVersionData.Path} ${addresses}` // eslint-disable-line camelcase
210+
},
211+
signature: isUsingAvrdude ? signaturesEnum.UPLOAD_FIRMWARE_AVRDUDE : signaturesEnum.UPLOAD_FIRMWARE_BOSSAC,
212+
filename: 'CheckFirmwareVersion.bin'
213+
};
214+
215+
fetch(`${this.Daemon.pluginURL}/upload`, {
216+
method: 'POST',
217+
headers: {
218+
'Content-Type': 'text/plain; charset=utf-8'
219+
},
220+
body: JSON.stringify(data)
221+
}).then(response => {
222+
if (!response.ok) {
223+
this.updating.next({ status: this.updateStatusEnum.ERROR, err: `Can't update Firmware: error fetching ${this.Daemon.pluginURL}/upload` });
224+
return;
225+
}
226+
}).catch(reason => {
227+
this.updating.next({ status: this.updateStatusEnum.ERROR, err: `Can't update Firmware: ${reason}` });
228+
return;
229+
});
244230
});
231+
this.getFirmwareInfo(boardId, port, firmwareVersion);
245232
});
246-
this.getFirmwareInfo(boardId, port, wifiModule);
247233
}
248234
}

0 commit comments

Comments
 (0)