@@ -26,7 +26,7 @@ export default class ProjectTaskManager {
2626
2727 this . _sid = Math . random ( ) ;
2828 this . _refreshTimeout = undefined ;
29- this . _ranTask = undefined ;
29+ this . _startedTask = undefined ;
3030 this . _tasksToRestore = [ ] ;
3131 this . _sbPortSwitcher = undefined ;
3232 this . _customPort = getProjectItemState ( projectDir , 'customPort' ) ;
@@ -92,6 +92,7 @@ export default class ProjectTaskManager {
9292 } ,
9393 } ) ,
9494
95+ vscode . tasks . onDidStartTask ( ( event ) => this . onDidStartTask ( event ) ) ,
9596 vscode . tasks . onDidEndTaskProcess ( ( event ) => this . onDidEndTaskProcess ( event ) )
9697 ) ;
9798
@@ -150,71 +151,84 @@ export default class ProjectTaskManager {
150151 }
151152
152153 runTask ( task ) {
153- this . _ranTask = task ;
154- this . _tasksToRestore = [ ] ;
155- this . _autoCloseSerialMonitor ( ) ;
156154 // use string-based task defination for Win 7 // issue #3481
157155 vscode . commands . executeCommand (
158156 'workbench.action.tasks.runTask' ,
159157 `${ ProjectTaskManager . PROVIDER_TYPE } : ${ task . id } `
160158 ) ;
161159 }
162160
163- _autoCloseSerialMonitor ( ) {
161+ onDidStartTask ( event ) {
162+ this . _autoCloseSerialMonitor ( event . execution . task ) ;
163+ }
164+
165+ _autoCloseSerialMonitor ( startedTask ) {
166+ if ( startedTask . definition . type !== ProjectTaskManager . PROVIDER_TYPE ) {
167+ return ;
168+ }
169+
170+ this . _startedTask = startedTask ;
171+ this . _tasksToRestore = [ ] ;
164172 const closeMonitorConds = [
165173 extension . getConfiguration ( 'autoCloseSerialMonitor' ) ,
166- [ 'upload' , 'test' ] . some ( ( arg ) => this . _ranTask . args . includes ( arg ) ) ,
174+ [ 'upload' , 'test' ] . some ( ( arg ) =>
175+ this . getTaskArgs ( this . _startedTask ) . includes ( arg )
176+ ) ,
167177 ] ;
168178 if ( ! closeMonitorConds . every ( ( value ) => value ) ) {
169179 return ;
170180 }
181+
171182 vscode . tasks . taskExecutions . forEach ( ( event ) => {
172- const isCurrentEvent = this . areTasksEqual ( this . _ranTask , event . task ) ;
183+ const isCurrentEvent = this . areTasksEqual ( this . _startedTask , event . task ) ;
173184 const skipConds = [
185+ isCurrentEvent ,
174186 // skip non-PlatformIO task
175187 event . task . definition . type !== ProjectTaskManager . PROVIDER_TYPE ,
176- ! event . task . execution . args . includes ( 'monitor' ) ,
177- this . isMonitorAndUploadTask ( event . task ) && ! isCurrentEvent ,
188+ ! this . getTaskArgs ( event . task ) . includes ( 'monitor' ) ,
189+ this . isMonitorAndUploadTask ( event . task ) ,
178190 ] ;
179191 if ( skipConds . some ( ( value ) => value ) ) {
180192 return ;
181193 }
182- if ( ! isCurrentEvent ) {
183- this . _tasksToRestore . push ( event . task ) ;
184- }
194+ this . _tasksToRestore . push ( event . task ) ;
185195 event . terminate ( ) ;
186196 } ) ;
187197 }
188198
189199 onDidEndTaskProcess ( event ) {
190200 const skipConds = [
191- ! this . _ranTask ,
192- ! this . areTasksEqual ( this . _ranTask , event . execution . task ) ,
201+ ! this . _startedTask ,
202+ ! this . areTasksEqual ( this . _startedTask , event . execution . task ) ,
193203 event . exitCode !== 0 ,
194204 ! this . _tasksToRestore . length ,
195205 ] ;
196206 if ( skipConds . some ( ( value ) => value ) ) {
197207 return ;
198208 }
199- this . _ranTask = undefined ;
209+ this . _startedTask = undefined ;
200210 setTimeout ( ( ) => {
201211 while ( this . _tasksToRestore . length ) {
202212 vscode . tasks . executeTask ( this . _tasksToRestore . pop ( ) ) ;
203213 }
204214 } , parseInt ( extension . getConfiguration ( 'reopenSerialMonitorDelay' ) ) ) ;
205215 }
206216
217+ getTaskArgs ( task ) {
218+ return task . args || task . execution . args ;
219+ }
220+
207221 isMonitorAndUploadTask ( task ) {
208- const args = task . args || task . execution . args ;
222+ const args = this . getTaskArgs ( task ) ;
209223 return [ '--target' , 'upload' , 'monitor' ] . every ( ( arg ) => args . includes ( arg ) ) ;
210224 }
211225
212226 areTasksEqual ( task1 , task2 ) {
213227 if ( ! task1 || ! task2 ) {
214228 return task1 === task2 ;
215229 }
216- const args1 = task1 . args || task1 . execution . args || [ ] ;
217- const args2 = task2 . args || task2 . execution . args || [ ] ;
230+ const args1 = this . getTaskArgs ( task1 ) ;
231+ const args2 = this . getTaskArgs ( task2 ) ;
218232 return (
219233 args1 . length === args2 . length &&
220234 args1 . every ( ( value , index ) => value === args2 [ index ] )
0 commit comments