/ =========================================================================
/ HAUKI SHELL (HSH) - REAKTIIVINEN YDIN
/ =========================================================================
class Stream {
constructor(name) {
this.name = name;
this.filters = []; // Muokkaavat dataa (esim. typo-korjaukset)
this.listeners = []; // Kuluttavat dataa (esim. VGA-tulostus)
}
// LisC$C$ muuntajan vC$liin
addFilter(fn) { this.filters.push(fn); }
// T-haara / kuuntelija
addListener(fn) { this.listeners.push(fn); }
// Datan tyC6ntC$minen jonoon
push(data) {
let processedData = data;
// 1. Vie data kaikkien filttereiden lC$pi (ketjutus)
for (let filter of this.filters) {
processedData = filter(processedData);
if (processedData === null || processedData === undefined) return;
// Filtteri pysC$ytti datan
}
// 2. Jaa prosessoitu data kaikille kuuntelijoille
for (let listener of this.listeners) {
listener(processedData);
}
}
}
/ Shellin pC$C$instanssi
const hsh = {
// Standardijonot
stdin: new Stream("stdin"),
stdout: new Stream("stdout"),
stderr: new Stream("stderr"),
// YksilC6idyt ohjausjonot
vga_out: new Stream("vga_out"),
serial_out: new Stream("serial_out"),
// RekisterC6idyt komennot ja aliakset
commands: {},
// Suorittaa "rivin"
execute: function(line) {
let args = line.trim().split(" ");
let cmd = args.shift();
if (this.commands[cmd]) {
// Komento palauttaa datan suoraan stdoutiin
let result = this.commands[cmd](args);
if (result !== undefined) this.stdout.push(result);
} else if (cmd !== "") {
this.stderr.push(`Command not found: ${cmd}`);
}
},
// Aliasten luonti on yhtC$ helppoa kuin Bashissa, mutta tehokkaampaa JS:n
ansiosta
alias: function(name, jsFunction) {
this.commands[name] = jsFunction;
}
};
/ =========================================================================
/ OLETUSKYTKENNCT (Wiring)
/ =========================================================================
/ 1. Ohjataan shellin 'stdout' menemC$C$n sekC$ VGA:lle ettC$ Serialille
(T-haara)
hsh.stdout.addListener(data => hsh.vga_out.push(data));
hsh.stdout.addListener(data => hsh.serial_out.push(data));
/ 2. Ohjataan shellin 'stdin' suoraan execute-moottorille
hsh.stdin.addListener(line => hsh.execute(line));