KB: decode the pod's RGB SPLIT -- one VGA port drives THREE mono MFDs
Answering 'how do the panels split RGB into 3 monitors' from primary sources rather than inference: - content/GAUGE/L4GAUGE.CFG (the authentic 1996 pod config) configures each gauge port with a bit-plane mask AND A COLOUR CHANNEL: Comm=red, Mfd2=green, Heat=blue on clut2 (the upper row); Mfd1=red, Mfd3=green on clut1 (the lower row, blue spare); sec/radar = full rgb, rotation 270 (the portrait CRT). Eng1/2/3 are the engineering-page twins on the same monitors, swapped in/out via reconfigure() with 'blank'. - L4GraphicsPort::BuildSecondaryColor (L4VB16.cpp) proves the mechanism at T0: it walks the palette entries owned by the port's bit group and writes exactly ONE component (RedChannel->Red, GreenChannel->Green, BlueChannel->Blue, AllChannels->whole triplet); BlankColor blanks the group. So one palettized framebuffer emits three independent pictures on the R/G/B analog lines, and the splitter feeds each line to its own mono monitor -- which is also what the '1280x480 horizontally spanned' MFD surface actually is: two VGA outputs x three channels. Port consequence recorded: the per-panel window path (BT_POD_SURFACES) is right for per-panel outputs but WRONG for splitter-wired glass, which needs a channel-composite mode (three planes -> one RGB image, pure primary tints). ExpandPlaneToBGRA already does the per-plane half. Open: how Nick's cart is actually wired. Also lands the pod bring-up scratch (ssh helper, layout cfg, launcher, firestorm repo browser). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
99956d54e3
commit
e0e9dcc292
@@ -0,0 +1,47 @@
|
||||
"""Browse the VWE/firestorm gitea repo (read-only) without cloning 10GB."""
|
||||
import base64, json, subprocess, sys, urllib.request
|
||||
sys.stdout.reconfigure(encoding='utf-8', errors='replace')
|
||||
_out = subprocess.run(["git","credential","fill"],
|
||||
input="protocol=https\nhost=mysticmachines.com\n\n",
|
||||
capture_output=True, text=True, cwd=r"C:\git\bt411")
|
||||
_c = dict(l.split("=",1) for l in _out.stdout.strip().splitlines() if "=" in l)
|
||||
AUTH = "Basic " + base64.b64encode((_c["username"]+":"+_c["password"]).encode()).decode()
|
||||
B = "https://mysticmachines.com/api/v1/repos/VWE/firestorm"
|
||||
|
||||
def api(p, t=120):
|
||||
r = urllib.request.Request(B+p, headers={"Authorization": AUTH})
|
||||
return json.load(urllib.request.urlopen(r, timeout=t))
|
||||
|
||||
def ls(path=""):
|
||||
try:
|
||||
return api("/contents/" + urllib.request.quote(path))
|
||||
except Exception as e:
|
||||
return []
|
||||
|
||||
def raw(path, t=120):
|
||||
r = urllib.request.Request(B+"/raw/"+urllib.request.quote(path), headers={"Authorization": AUTH})
|
||||
return urllib.request.urlopen(r, timeout=t).read().decode("utf-8","replace")
|
||||
|
||||
if __name__ == "__main__":
|
||||
cmd = sys.argv[1]
|
||||
if cmd == "ls":
|
||||
for e in sorted(ls(sys.argv[2] if len(sys.argv)>2 else ""), key=lambda x: x["type"]+x["name"]):
|
||||
print(f' {e["type"]:4} {e.get("size",0):>9} {e["path"]}')
|
||||
elif cmd == "cat":
|
||||
print(raw(sys.argv[2])[:int(sys.argv[3]) if len(sys.argv)>3 else 4000])
|
||||
|
||||
def subtree(path, recursive=True):
|
||||
"""Full file list under a directory, via its tree sha (avoids the 1000-entry
|
||||
truncation of a whole-repo recursive tree)."""
|
||||
e = api("/contents/" + urllib.request.quote(path))
|
||||
# the dir's own sha comes from its parent listing
|
||||
parent = "/".join(path.split("/")[:-1])
|
||||
name = path.split("/")[-1]
|
||||
for it in ls(parent):
|
||||
if it["name"] == name and it["type"] == "dir":
|
||||
sha = it["sha"]
|
||||
break
|
||||
else:
|
||||
return []
|
||||
t = api(f"/git/trees/{sha}?recursive={1 if recursive else 0}&per_page=99999", t=180)
|
||||
return [(x["path"], x.get("size", 0)) for x in t.get("tree", []) if x["type"] == "blob"], t.get("truncated")
|
||||
@@ -0,0 +1,5 @@
|
||||
#!/usr/bin/env bash
|
||||
# Run a command on the pod (bt411-pod, user 'user') over the tailnet.
|
||||
exec ssh -i ~/.ssh/bt411_pod -o BatchMode=yes -o StrictHostKeyChecking=no \
|
||||
-o UserKnownHostsFile=/dev/null -o LogLevel=ERROR -o ConnectTimeout=10 \
|
||||
user@100.107.167.96 "$@"
|
||||
@@ -0,0 +1,18 @@
|
||||
@echo off
|
||||
REM BT411 pod launch -- runs from the game's content dir in the CONSOLE session.
|
||||
REM Started via schtasks /IT so the windows land on the REAL panels (an SSH
|
||||
REM session is session 0 with a dummy display and would render nowhere).
|
||||
cd /d C:\bt411\BT411_4.11.801\content
|
||||
|
||||
REM glass cockpit, per-display windows, POD surface mode (bare 640x480 pictures,
|
||||
REM no on-screen button banks -- the cab's buttons are physical), sticky layout
|
||||
REM loaded from glass_layout.cfg beside this file.
|
||||
set BT_GLASS=1
|
||||
set BT_GLASS_PANELS=1
|
||||
set BT_POD_SURFACES=1
|
||||
set BT_GLASS_LAYOUT=load
|
||||
set BT_GLASS_LOG=1
|
||||
set BT_START_INSIDE=1
|
||||
set BT_LOG=podrun.log
|
||||
|
||||
start "" ..\build\Release\btl4.exe -egg MP.EGG
|
||||
Reference in New Issue
Block a user