@@ -6,19 +6,6 @@ import {
6
6
first
7
7
} from 'rxjs/operators' ;
8
8
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
-
22
9
/* The status of the Firmware Updater Tool */
23
10
const FWUToolStatusEnum = Object . freeze ( {
24
11
NOPE : 'NOPE' ,
@@ -69,7 +56,9 @@ export default class FirmwareUpdater {
69
56
. pipe ( takeUntil ( this . updatingError ) ) ;
70
57
}
71
58
72
- getFirmwareInfo ( boardId , port , wifiModule ) {
59
+ getFirmwareInfo ( boardId , port , firmwareVersion ) {
60
+ this . firmwareVersionData = null ;
61
+ this . loaderPath = null ;
73
62
this . updating . next ( { status : this . updateStatusEnum . GETTING_INFO } ) ;
74
63
let versionsList = [ ] ;
75
64
let firmwareInfoMessagesSubscription ;
@@ -85,22 +74,25 @@ export default class FirmwareUpdater {
85
74
const versions = JSON . parse ( message . Msg ) ;
86
75
Object . keys ( versions ) . forEach ( v => {
87
76
if ( versions [ v ] [ 0 ] . IsLoader ) {
88
- versionsMap [ wifiModule ] . loaderPath = versions [ v ] [ 0 ] . Path ;
77
+ this . loaderPath = versions [ v ] [ 0 ] . Path ;
89
78
}
90
79
else {
91
80
versionsList = [ ...versionsList , ...versions [ v ] ] ;
92
81
}
93
82
} ) ;
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
+ }
96
88
break ;
97
89
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 } ` } ) ;
99
91
firmwareInfoMessagesSubscription . unsubscribe ( ) ;
100
92
break ;
101
93
case 'Done' :
102
94
firmwareInfoMessagesSubscription . unsubscribe ( ) ;
103
- this . updating . next ( { status : this . updateStatusEnum . GOT_INFO , versionsList } )
95
+ this . updating . next ( { status : this . updateStatusEnum . GOT_INFO } ) ;
104
96
break ;
105
97
default :
106
98
break ;
@@ -147,102 +139,96 @@ export default class FirmwareUpdater {
147
139
} ) ;
148
140
}
149
141
150
- /*
151
- wifiModule can be either 'wifiNina' or 'wifi101'
152
- */
153
- updateFirmware ( boardId , port , wifiModule ) {
142
+ updateFirmware ( boardId , port , firmwareVersion ) {
154
143
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.` } ) ;
167
148
return ;
168
149
}
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 ;
184
154
}
185
- }
186
155
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
+ }
190
171
}
191
- } ) ;
192
172
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
+ } ) ;
204
178
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
+ } ) ;
207
190
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' ;
213
193
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'` } ) ;
239
196
return ;
240
197
}
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
+ } ) ;
244
230
} ) ;
231
+ this . getFirmwareInfo ( boardId , port , firmwareVersion ) ;
245
232
} ) ;
246
- this . getFirmwareInfo ( boardId , port , wifiModule ) ;
247
233
}
248
234
}
0 commit comments