Skip to content

Commit 173d3ee

Browse files
committed
Improve handling of "extension.getConfiguration('autoCloseSerialMonitor')"
1 parent be2a6d1 commit 173d3ee

File tree

2 files changed

+60
-26
lines changed

2 files changed

+60
-26
lines changed

package.json

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -830,23 +830,43 @@
830830
},
831831
{
832832
"text": "$(check)",
833-
"tooltip": "PlatformIO: Build",
834-
"commands": "platformio-ide.build"
833+
"tooltip": "PlatformIO: Build Active Environment",
834+
"commands": [
835+
{
836+
"id": "workbench.action.tasks.runTask",
837+
"args": "PlatformIO: Build (${command:platformio-ide.activeEnvironment})"
838+
}
839+
]
835840
},
836841
{
837842
"text": "$(arrow-right)",
838-
"tooltip": "PlatformIO: Upload",
839-
"commands": "platformio-ide.upload"
843+
"tooltip": "PlatformIO: Upload Active Environment",
844+
"commands": [
845+
{
846+
"id": "workbench.action.tasks.runTask",
847+
"args": "PlatformIO: Upload (${command:platformio-ide.activeEnvironment})"
848+
}
849+
]
840850
},
841851
{
842852
"text": "$(trashcan)",
843-
"tooltip": "PlatformIO: Clean",
844-
"commands": "platformio-ide.clean"
853+
"tooltip": "PlatformIO: Clean Active Environment",
854+
"commands": [
855+
{
856+
"id": "workbench.action.tasks.runTask",
857+
"args": "PlatformIO: Clean (${command:platformio-ide.activeEnvironment})"
858+
}
859+
]
845860
},
846861
{
847862
"text": "$(beaker)",
848-
"tooltip": "PlatformIO: Test",
849-
"commands": "platformio-ide.test"
863+
"tooltip": "PlatformIO: Test Active Environment",
864+
"commands": [
865+
{
866+
"id": "workbench.action.tasks.runTask",
867+
"args": "PlatformIO: Test (${command:platformio-ide.activeEnvironment})"
868+
}
869+
]
850870
},
851871
{
852872
"text": "$(plug)",

src/project/tasks.js

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)