Olet tC$ysin asian ytimessC$! TyC6pC6ydC$n irrottaminen pelkC$ksi "tyhmC$ksi"
esityskerrokseksi (View) ja logiikan siirtC$minen dynaamisiin moduuleihin
(Controller/Model) on tismalleen se arkkitehtuuri, jolla modernit hajautetut
jC$rjestelmC$t (kuten X11, Wayland tai selaimen DOM) on rakennettu.
Jos teemme ikkunoiden sisC$llC6stC$ standardoitua JSON-rakennetta (kutsutaan
sitC$ vaikka nimellC$ **Hauki DOM** eli **HDOM**), saavutamme juuri tuon
kuvailemasi nirvanan: ei ole mitC$C$n vC$liC$, pyC6riikC6 moduulin logiikka
lokaalisti Hauki OS:n sisC$llC$ vai lC$hettC$C$kC6 jokin The Mesh -verkon
tekoC$lyagentti HDOM-paketteja UDP:n yli suoraan nC$ytC6llesi.
Ennen kuin koodaamme tC$mC$n, meidC$n on kuitenkin ratkaistava yksi
verkkotekninen reaaliteetti.
### Verkkoprotokollien kuilu: UDP vs. TCP
Rakensit juuri upean raakatason UDP-lC$hettimen (`UDP_TX.JS`), jolla Hauki OS
pystyy ampumaan viestejC$ verkkoon. Kuitenkin kehittC$mC$si MeshBASIC API
(`main.py`) on FastAPI:n pC$C$lle rakennettu HTTP-palvelin, joka kuuntelee
liikennettC$ Uvicornilla portissa 9977.
HTTP kC$yttC$C$ alla TCP-protokollaa, joka vaatii monimutkaisen
kolmisuuntaisen kC$ttelyn (SYN, SYN-ACK, ACK), jota Hauki OS:n bare metal
-puolella ei vielC$ ole. Emme siis voi suoraan lC$hettC$C$ `udp_send`:llC$
GET- tai POST-pyyntC6jC$ FastAPI:lle.
MeillC$ on kaksi vaihtoehtoa ohittaa tC$mC$:
1. **UDP-Gateway (Suositeltu):** LisC$C$mme `main.py` -tiedostoon
HTTP-palvelimen rinnalle yksinkertaisen UDP-kuuntelijan (`asyncio.DatagramProto
col`), joka ottaa vastaan The Mesh -verkon JSON-paketteja (esim. `{"action":
"run", "script": "test.bas"}`) ja suorittaa niitC$ sisC$isesti samalla
logiikalla kuin HTTP-reitit.
2. **TCP-pino JS:llC$:** Kirjoitamme Hauki OS:C$C$n raa'an TCP-kC$ttelyn
JavaScriptillC$. TC$mC$ on erittC$in opettavaista, mutta tekee koodista
nopeasti raskasta yllC$pitC$C$.
---
### Visio: Hauki DOM (HDOM) Arkkitehtuuri
Jos lC$hdemme rakentamaan tyC6pC6ytC$C$ ohjauskeskuksena, se kannattaa jakaa
nC$in:
**1. `DESK.JS` (Vain renderC6inti ja ohjaus):**
TyC6pC6ytC$ ei tiedC$ sovelluksista mitC$C$n. Se vain yllC$pitC$C$ ikkunoita
ja piirtC$C$ niihin komponentteja, joita se saa JSON-muodossa.
```javascript
/ TyC6pC6ytC$ saa moduulilta tC$llaisen rakenteen ja vain piirtC$C$ sen:
{
id: "mesh_basic_1",
mode: "VIEW",
ui: [
{ type: "label", x: 2, y: 15, text: "Script: test.bas", color: 15 },
{ type: "button", id: "btn_run", x: 2, y: 30, w: 40, h: 10, text: "RUN",
bg: 2 }
]
}
```
**2. Moduuli-API (`MOD_MBASIC.JS`):**
TC$mC$ on se lokaali (tai etC$) skripti, joka latautuu, kun haluat avata
MeshBASIC-tyC6kalun. Se sisC$ltC$C$ logiikan:
```javascript
var ModMeshBasic = {
scriptName: "test.bas",
// Generoi HDOM-rakenteen riippuen siitC$, mikC$ MODE on aktiivinen
render: function(mode) {
var ui = [];
if (mode === "VIEW") {
ui.push({ type: "label", x: 2, y: 15, text: "VIEW: " +
this.scriptName, color: 15 });
ui.push({ type: "button", id: "btn_edit", x: 2, y: 30, text: "[
EDIT ]" });
} else if (mode === "RUN") {
ui.push({ type: "button", id: "btn_exec", x: 2, y: 15, text:
"EXECUTE NOW", bg: 2 });
ui.push({ type: "label", x: 2, y: 40, text: "Status: Ready..." });
}
return ui;
},
// DESK.JS kutsuu tC$tC$, kun ihminen painaa ENTER tai AI lC$hettC$C$
CLICK-komennon
onEvent: function(eventId) {
if (eventId === "btn_edit") DESK.setMode(this.windowId, "EDIT");
if (eventId === "btn_exec") {
// TCSSC kohtaa lC$hetC$mme UDP-paketin MeshBASIC API:lle!
udp_send("10.0.2.2", 9977, JSON.stringify({action: "run", target:
this.scriptName}));
}
}
};
```
TC$llC$ rakenteella saamme juuri sen, mitC$ haet: ikkunat ovat dynaamisia
tila-automaatteja, ja tekoC$ly voi nC$hdC$ koko kC$yttC6liittymC$n pelkkC$nC$
kevyenC$ JSON-puuna, johon sen on helppo injektoida omia klikkauksiaan.
Haluatko, ettC$ pC$ivitC$mme ensin `main.py`:n ymmC$rtC$mC$C$n UDP-paketteja
The Mesh -verkon kautta, vai aloitammeko pC$ivittC$mC$llC$ `DESK.JS`:n
ymmC$rtC$mC$C$n tC$tC$ uutta HDOM-rakennetta ja piirtC$mC$C$n nappeja?