From ba63d05196d86795c000985f94b64f6d733158dc Mon Sep 17 00:00:00 2001 From: alexkar598 <25136265+alexkar598@users.noreply.github.com> Date: Sun, 23 Jun 2024 00:55:44 -0400 Subject: [PATCH] Uses virtio-console instead of serial for better performance (and auto resize in the future) --- src/vm/commandQueue.service.ts | 19 +++++++++------- src/vm/emulator.worker.ts | 41 +++++++++++++++++++--------------- 2 files changed, 34 insertions(+), 26 deletions(-) diff --git a/src/vm/commandQueue.service.ts b/src/vm/commandQueue.service.ts index 335a4e7..7ea4ac8 100644 --- a/src/vm/commandQueue.service.ts +++ b/src/vm/commandQueue.service.ts @@ -73,14 +73,17 @@ export class CommandQueueService { public constructor(public emulator: EmulatorService) { //It's called from window.setTimeout so this is window otherwise this.tickQueue = this.tickQueue.bind(this); - emulator.receivedOutputController.subscribe((chr) => { - try { - this.receiveChr(chr); - } catch (error) { - const errorMsg = `The command queue has encountered an error. Please report the following message and reload the page: ${error}`; - console.log(errorMsg, error); - alert(errorMsg); - this.suspendQueue(); + emulator.receivedOutputController.subscribe((data) => { + for (const chr of data) { + //TODO: Rewrite the receive function to receive chunks instead of character by character + try { + this.receiveChr(chr); + } catch (error) { + const errorMsg = `The command queue has encountered an error. Please report the following message and reload the page: ${error}`; + console.log(errorMsg, error); + alert(errorMsg); + this.suspendQueue(); + } } }); } diff --git a/src/vm/emulator.worker.ts b/src/vm/emulator.worker.ts index 06d0ccf..a8b8cd8 100644 --- a/src/vm/emulator.worker.ts +++ b/src/vm/emulator.worker.ts @@ -71,6 +71,7 @@ export type WorkerEventResponseMsg = data: void; }; +const decoder = new TextDecoder(); const parameters = new URLSearchParams(location.search); const emulator = new V86({ //Emulator binaries @@ -148,24 +149,31 @@ const emulator = new V86({ //Loads bzimage and initrd from 9p filesystem bzimage_initrd_from_filesystem: false, autostart: true, + virtio_console: true, }); +//@ts-ignore +self.emulator = emulator; + let resetting = false; function sendTerminal(message: string) { - for (let i = 0; i < message.length; i++) { - emulator.bus.send('serial0-input', message.charCodeAt(i)); - } + emulator.bus.send( + 'virtio-console0-input-bytes', + [...message].map((x) => x.charCodeAt(0)), + ); } function sendScreen(message: string) { - for (let i = 0; i < message.length; i++) { - emulator.bus.send('serial1-input', message.charCodeAt(i)); - } + emulator.bus.send( + 'virtio-console1-input-bytes', + [...message].map((x) => x.charCodeAt(0)), + ); } function sendController(message: string) { - for (let i = 0; i < message.length; i++) { - emulator.bus.send('serial2-input', message.charCodeAt(i)); - } + emulator.bus.send( + 'virtio-console2-input-bytes', + [...message].map((x) => x.charCodeAt(0)), + ); } onmessage = ({ data: e }: MessageEvent) => { switch (e.command) { @@ -230,24 +238,21 @@ onmessage = ({ data: e }: MessageEvent) => { } }; -emulator.add_listener('serial0-output-byte', (byte: number) => { - if (byte == 255) return; +emulator.add_listener('virtio-console0-output-bytes', (bytes: Uint8Array) => { postMessage({ event: 'receivedOutputConsole', - data: [String.fromCharCode(byte)], + data: [decoder.decode(bytes)], }); }); -emulator.add_listener('serial1-output-byte', (byte: number) => { - if (byte == 255) return; +emulator.add_listener('virtio-console1-output-bytes', (bytes: Uint8Array) => { postMessage({ event: 'receivedOutputScreen', - data: [String.fromCharCode(byte)], + data: [decoder.decode(bytes)], }); }); -emulator.add_listener('serial2-output-byte', (byte: number) => { - if (byte == 255) return; +emulator.add_listener('virtio-console2-output-bytes', (bytes: Uint8Array) => { postMessage({ event: 'receivedOutputController', - data: [String.fromCharCode(byte)], + data: [decoder.decode(bytes)], }); });