mirror of
https://github.com/arduino/arduino-ide.git
synced 2025-11-16 05:39:28 +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.8 KiB
TypeScript
119 lines
3.8 KiB
TypeScript
import * as React from '@theia/core/shared/react';
|
|
import { Key, KeyCode } from '@theia/core/lib/browser/keys';
|
|
import { Board } from '../../../common/protocol/boards-service';
|
|
import { isOSX } from '@theia/core/lib/common/os';
|
|
import { DisposableCollection, nls } from '@theia/core/lib/common';
|
|
import { BoardsServiceProvider } from '../../boards/boards-service-provider';
|
|
import { MonitorModel } from '../../monitor-model';
|
|
|
|
export namespace SerialMonitorSendInput {
|
|
export interface Props {
|
|
readonly boardsServiceProvider: BoardsServiceProvider;
|
|
readonly monitorModel: MonitorModel;
|
|
readonly onSend: (text: string) => void;
|
|
readonly resolveFocus: (element: HTMLElement | undefined) => void;
|
|
}
|
|
export interface State {
|
|
text: string;
|
|
connected: boolean;
|
|
}
|
|
}
|
|
|
|
export class SerialMonitorSendInput extends React.Component<
|
|
SerialMonitorSendInput.Props,
|
|
SerialMonitorSendInput.State
|
|
> {
|
|
protected toDisposeBeforeUnmount = new DisposableCollection();
|
|
|
|
constructor(props: Readonly<SerialMonitorSendInput.Props>) {
|
|
super(props);
|
|
this.state = { text: '', connected: true };
|
|
this.onChange = this.onChange.bind(this);
|
|
this.onSend = this.onSend.bind(this);
|
|
this.onKeyDown = this.onKeyDown.bind(this);
|
|
}
|
|
|
|
override componentDidMount(): void {
|
|
this.setState({ connected: this.props.monitorModel.connected });
|
|
this.toDisposeBeforeUnmount.push(
|
|
this.props.monitorModel.onChange(({ property }) => {
|
|
if (property === 'connected')
|
|
this.setState({ connected: this.props.monitorModel.connected });
|
|
})
|
|
);
|
|
}
|
|
|
|
override componentWillUnmount(): void {
|
|
// TODO: "Your preferred browser's local storage is almost full." Discard `content` before saving layout?
|
|
this.toDisposeBeforeUnmount.dispose();
|
|
}
|
|
|
|
override render(): React.ReactNode {
|
|
return (
|
|
<input
|
|
ref={this.setRef}
|
|
type="text"
|
|
className={`theia-input ${this.shouldShowWarning() ? 'warning' : ''}`}
|
|
placeholder={this.placeholder}
|
|
value={this.state.text}
|
|
onChange={this.onChange}
|
|
onKeyDown={this.onKeyDown}
|
|
/>
|
|
);
|
|
}
|
|
|
|
protected shouldShowWarning(): boolean {
|
|
const board = this.props.boardsServiceProvider.boardsConfig.selectedBoard;
|
|
const port = this.props.boardsServiceProvider.boardsConfig.selectedPort;
|
|
return !this.state.connected || !board || !port;
|
|
}
|
|
|
|
protected get placeholder(): string {
|
|
if (this.shouldShowWarning()) {
|
|
return nls.localize(
|
|
'arduino/serial/notConnected',
|
|
'Not connected. Select a board and a port to connect automatically.'
|
|
);
|
|
}
|
|
|
|
const board = this.props.boardsServiceProvider.boardsConfig.selectedBoard;
|
|
const port = this.props.boardsServiceProvider.boardsConfig.selectedPort;
|
|
return nls.localize(
|
|
'arduino/serial/message',
|
|
"Message ({0} + Enter to send message to '{1}' on '{2}')",
|
|
isOSX ? '⌘' : nls.localize('vscode/keybindingLabels/ctrlKey', 'Ctrl'),
|
|
board
|
|
? Board.toString(board, {
|
|
useFqbn: false,
|
|
})
|
|
: 'unknown',
|
|
port ? port.address : 'unknown'
|
|
);
|
|
}
|
|
|
|
protected setRef = (element: HTMLElement | null) => {
|
|
if (this.props.resolveFocus) {
|
|
this.props.resolveFocus(element || undefined);
|
|
}
|
|
};
|
|
|
|
protected onChange(event: React.ChangeEvent<HTMLInputElement>): void {
|
|
this.setState({ text: event.target.value });
|
|
}
|
|
|
|
protected onSend(): void {
|
|
this.props.onSend(this.state.text + this.props.monitorModel.lineEnding);
|
|
this.setState({ text: '' });
|
|
}
|
|
|
|
protected onKeyDown(event: React.KeyboardEvent<HTMLInputElement>): void {
|
|
const keyCode = KeyCode.createKeyCode(event.nativeEvent);
|
|
if (keyCode) {
|
|
const { key, meta, ctrl } = keyCode;
|
|
if (key === Key.ENTER && ((isOSX && meta) || (!isOSX && ctrl))) {
|
|
this.onSend();
|
|
}
|
|
}
|
|
}
|
|
}
|