mirror of
https://github.com/arduino/arduino-ide.git
synced 2025-04-28 01:07:18 +00:00

* backend structure WIP * Scaffold interfaces and classes for pluggable monitors * Implement MonitorService to handle pluggable monitor lifetime * Rename WebSocketService to WebSocketProvider and uninjected it * Moved some interfaces * Changed upload settings * Enhance MonitorManager APIs * Fixed WebSocketChange event signature * Add monitor proxy functions for the frontend * Moved settings to MonitorService * Remove several unnecessary serial monitor classes * Changed how connection is handled on upload * Proxied more monitor methods to frontend * WebSocketProvider is not injectable anymore * Add generic monitor settings storaging * More serial classes removal * Remove unused file * Changed plotter contribution to use new manager proxy * Changed MonitorWidget and children to use new monitor proxy * Updated MonitorWidget to use new monitor proxy * Fix backend logger bindings * Delete unnecessary Symbol * coreClientProvider is now set when constructing MonitorService * Add missing binding * Fix `MonitorManagerProxy` DI issue * fix monitor connection * delete duplex when connection is closed * update arduino-cli to 0.22.0 * fix upload when monitor is open * add MonitorSettingsProvider interface * monitor settings provider stub * updated pseudo code * refactor monitor settings interfaces * monitor service provider singleton * add unit tests * change MonitorService providers to injectable deps * fix monitor settings client communication * refactor monitor commands protocol * use monitor settings provider properly * add settings to monitor model * add settings to monitor model * reset serial monitor when port changes * fix serial plotter opening * refine monitor connection settings * fix hanging web socket connections * add serial plotter reset command * send port to web socket clients * monitor service wait for success serial port open * fix reset loop * update serial plotter version * update arduino-cli version to 0.23.0-rc1 and regenerate grpc protocol * remove useless plotter protocol file * localize web socket errors * clean-up code * update translation file * Fix duplicated editor tabs (#1012) * Save dialog for closing temporary sketch and unsaved files (#893) * Use normal `OnWillStop` event * Align `CLOSE` command to rest of app * Fixed FS path vs encoded URL comparision when handling stop request. Ref: https://github.com/eclipse-theia/theia/issues/11226 Signed-off-by: Akos Kitta <a.kitta@arduino.cc> * Fixed the translations. Signed-off-by: Akos Kitta <a.kitta@arduino.cc> * Fixed the translations again. Removed `electron` from the `nls-extract`. It does not contain app code. Signed-off-by: Akos Kitta <a.kitta@arduino.cc> * Aligned the stop handler code to Theia. Signed-off-by: Akos Kitta <a.kitta@arduino.cc> Co-authored-by: Akos Kitta <a.kitta@arduino.cc> * fix serial monitor send line ending * refactor monitor-service poll for test/readability * localize web socket errors * update translation file * Fix duplicated editor tabs (#1012) * i18n:check rerun * Speed up IDE startup time. Signed-off-by: Akos Kitta <a.kitta@arduino.cc> * override coreClientProvider in monitor-service * cleanup merged code Co-authored-by: Francesco Stasi <f.stasi@me.com> Co-authored-by: Silvano Cerza <silvanocerza@gmail.com> Co-authored-by: Mark Sujew <mark.sujew@typefox.io> Co-authored-by: David Simpson <45690499+davegarthsimpson@users.noreply.github.com> Co-authored-by: Akos Kitta <a.kitta@arduino.cc>
119 lines
3.4 KiB
TypeScript
119 lines
3.4 KiB
TypeScript
import { ThemeService } from '@theia/core/lib/browser/theming';
|
|
import { injectable, inject } from '@theia/core/shared/inversify';
|
|
import {
|
|
Command,
|
|
CommandRegistry,
|
|
MaybePromise,
|
|
MenuModelRegistry,
|
|
} from '@theia/core';
|
|
import { ArduinoMenus } from '../../menu/arduino-menus';
|
|
import { Contribution } from '../../contributions/contribution';
|
|
import { Endpoint, FrontendApplication } from '@theia/core/lib/browser';
|
|
import { ipcRenderer } from '@theia/electron/shared/electron';
|
|
import { MonitorManagerProxyClient } from '../../../common/protocol';
|
|
import { BoardsServiceProvider } from '../../boards/boards-service-provider';
|
|
import { MonitorModel } from '../../monitor-model';
|
|
|
|
const queryString = require('query-string');
|
|
|
|
export namespace SerialPlotterContribution {
|
|
export namespace Commands {
|
|
export const OPEN: Command = {
|
|
id: 'serial-plotter-open',
|
|
label: 'Serial Plotter',
|
|
category: 'Arduino',
|
|
};
|
|
export const RESET: Command = {
|
|
id: 'serial-plotter-reset',
|
|
label: 'Reset Serial Plotter',
|
|
category: 'Arduino',
|
|
};
|
|
}
|
|
}
|
|
|
|
@injectable()
|
|
export class PlotterFrontendContribution extends Contribution {
|
|
protected window: Window | null;
|
|
protected url: string;
|
|
protected wsPort: number;
|
|
|
|
@inject(MonitorModel)
|
|
protected readonly model: MonitorModel;
|
|
|
|
@inject(ThemeService)
|
|
protected readonly themeService: ThemeService;
|
|
|
|
@inject(MonitorManagerProxyClient)
|
|
protected readonly monitorManagerProxy: MonitorManagerProxyClient;
|
|
|
|
@inject(BoardsServiceProvider)
|
|
protected readonly boardsServiceProvider: BoardsServiceProvider;
|
|
|
|
override onStart(app: FrontendApplication): MaybePromise<void> {
|
|
this.url = new Endpoint({ path: '/plotter' }).getRestUrl().toString();
|
|
|
|
ipcRenderer.on('CLOSE_CHILD_WINDOW', async () => {
|
|
if (!!this.window) {
|
|
this.window = null;
|
|
}
|
|
});
|
|
this.monitorManagerProxy.onMonitorShouldReset(() => this.reset());
|
|
|
|
return super.onStart(app);
|
|
}
|
|
|
|
override registerCommands(registry: CommandRegistry): void {
|
|
registry.registerCommand(SerialPlotterContribution.Commands.OPEN, {
|
|
execute: this.startPlotter.bind(this),
|
|
});
|
|
registry.registerCommand(SerialPlotterContribution.Commands.RESET, {
|
|
execute: () => this.reset(),
|
|
});
|
|
}
|
|
|
|
override registerMenus(menus: MenuModelRegistry): void {
|
|
menus.registerMenuAction(ArduinoMenus.TOOLS__MAIN_GROUP, {
|
|
commandId: SerialPlotterContribution.Commands.OPEN.id,
|
|
label: SerialPlotterContribution.Commands.OPEN.label,
|
|
order: '7',
|
|
});
|
|
}
|
|
|
|
async startPlotter(): Promise<void> {
|
|
await this.monitorManagerProxy.startMonitor();
|
|
if (!!this.window) {
|
|
this.window.focus();
|
|
return;
|
|
}
|
|
const wsPort = this.monitorManagerProxy.getWebSocketPort();
|
|
if (wsPort) {
|
|
this.open(wsPort);
|
|
} else {
|
|
this.messageService.error(`Couldn't open serial plotter`);
|
|
}
|
|
}
|
|
|
|
protected async open(wsPort: number): Promise<void> {
|
|
const initConfig = {
|
|
darkTheme: this.themeService.getCurrentTheme().type === 'dark',
|
|
wsPort,
|
|
serialPort: this.model.serialPort,
|
|
};
|
|
const urlWithParams = queryString.stringifyUrl(
|
|
{
|
|
url: this.url,
|
|
query: initConfig,
|
|
},
|
|
{ arrayFormat: 'comma' }
|
|
);
|
|
this.window = window.open(urlWithParams, 'serialPlotter');
|
|
}
|
|
|
|
protected async reset(): Promise<void> {
|
|
if (!!this.window) {
|
|
this.window.close();
|
|
await this.startPlotter();
|
|
}
|
|
}
|
|
}
|