mirror of
https://github.com/arduino/arduino-ide.git
synced 2025-07-08 11:56:36 +00:00
Added Message History to Serial Monitor
This commit is contained in:
parent
b55cfc2052
commit
3476de27f7
@ -6,6 +6,88 @@ import { BoardsServiceProvider } from '../../boards/boards-service-provider';
|
|||||||
import { MonitorModel } from '../../monitor-model';
|
import { MonitorModel } from '../../monitor-model';
|
||||||
import { Unknown } from '../../../common/nls';
|
import { Unknown } from '../../../common/nls';
|
||||||
|
|
||||||
|
class HistoryList {
|
||||||
|
private ring: string[];
|
||||||
|
private size: number;
|
||||||
|
private begin: number;
|
||||||
|
private index: number;
|
||||||
|
private end: number;
|
||||||
|
private traverse: boolean;
|
||||||
|
|
||||||
|
constructor(size: number = 100) {
|
||||||
|
this.init = this.init.bind(this);
|
||||||
|
this.push = this.push.bind(this);
|
||||||
|
this.prev = this.prev.bind(this);
|
||||||
|
this.next = this.next.bind(this);
|
||||||
|
this.init(size);
|
||||||
|
}
|
||||||
|
private init(size: number = 100) {
|
||||||
|
this.ring = [];
|
||||||
|
this.size = (size > 0) ? size : 1;
|
||||||
|
this.begin = 0;
|
||||||
|
this.index = 0;
|
||||||
|
this.end = -1;
|
||||||
|
this.traverse = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
push(val: string): number {
|
||||||
|
this.end++;
|
||||||
|
if (this.ring.length >= this.size) {
|
||||||
|
if (this.end >= this.size)
|
||||||
|
this.end = 0;
|
||||||
|
if (this.end === this.begin) {
|
||||||
|
this.begin++;
|
||||||
|
if (this.begin >= this.size)
|
||||||
|
this.begin = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.ring[this.end] = val;
|
||||||
|
this.index = this.end;
|
||||||
|
this.traverse = false;
|
||||||
|
return this.index;
|
||||||
|
}
|
||||||
|
|
||||||
|
prev(): string {
|
||||||
|
if (this.ring.length < 1) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
if (this.index === this.end) {
|
||||||
|
this.traverse = true;
|
||||||
|
this.index--;
|
||||||
|
return this.ring[this.end];
|
||||||
|
}
|
||||||
|
if (this.index !== this.begin) {
|
||||||
|
if (this.traverse) {
|
||||||
|
this.traverse = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
this.index = (this.index > 0) ? --this.index : this.size - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.ring[this.index];
|
||||||
|
}
|
||||||
|
|
||||||
|
next(): string {
|
||||||
|
if (this.ring.length < 1) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
if (this.index !== this.end) {
|
||||||
|
this.traverse = true;
|
||||||
|
this.index = (++this.index < this.size) ? this.index : 0;
|
||||||
|
return this.ring[this.index];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (!this.traverse) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.traverse = false;
|
||||||
|
return this.ring[this.index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export namespace SerialMonitorSendInput {
|
export namespace SerialMonitorSendInput {
|
||||||
export interface Props {
|
export interface Props {
|
||||||
readonly boardsServiceProvider: BoardsServiceProvider;
|
readonly boardsServiceProvider: BoardsServiceProvider;
|
||||||
@ -16,6 +98,7 @@ export namespace SerialMonitorSendInput {
|
|||||||
export interface State {
|
export interface State {
|
||||||
text: string;
|
text: string;
|
||||||
connected: boolean;
|
connected: boolean;
|
||||||
|
history: HistoryList;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -27,7 +110,7 @@ export class SerialMonitorSendInput extends React.Component<
|
|||||||
|
|
||||||
constructor(props: Readonly<SerialMonitorSendInput.Props>) {
|
constructor(props: Readonly<SerialMonitorSendInput.Props>) {
|
||||||
super(props);
|
super(props);
|
||||||
this.state = { text: '', connected: true };
|
this.state = { text: '', connected: true, history: new HistoryList() };
|
||||||
this.onChange = this.onChange.bind(this);
|
this.onChange = this.onChange.bind(this);
|
||||||
this.onSend = this.onSend.bind(this);
|
this.onSend = this.onSend.bind(this);
|
||||||
this.onKeyDown = this.onKeyDown.bind(this);
|
this.onKeyDown = this.onKeyDown.bind(this);
|
||||||
@ -110,8 +193,23 @@ export class SerialMonitorSendInput extends React.Component<
|
|||||||
if (keyCode) {
|
if (keyCode) {
|
||||||
const { key } = keyCode;
|
const { key } = keyCode;
|
||||||
if (key === Key.ENTER) {
|
if (key === Key.ENTER) {
|
||||||
|
// NOTE: order of operations is critical here. Push the current state.text
|
||||||
|
// onto the history stack before sending. After sending, state.text is empty
|
||||||
|
// and you'd end up pushing '' onto the history stack.
|
||||||
|
if (this.state.text.length > 0) {
|
||||||
|
this.state.history.push(this.state.text);
|
||||||
|
}
|
||||||
this.onSend();
|
this.onSend();
|
||||||
|
}
|
||||||
|
else if (key === Key.ARROW_UP) {
|
||||||
|
this.setState({ text: this.state.history.prev()});
|
||||||
|
}
|
||||||
|
else if (key === Key.ARROW_DOWN) {
|
||||||
|
this.setState({ text: this.state.history.next()});
|
||||||
|
}
|
||||||
|
else if (key === Key.ESCAPE) {
|
||||||
|
this.setState({ text: ''});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user