here you go:
Space Shuttle Vessel. Contribute to maximqaxd/SSV development by creating an account on GitHub.
github.com
The irony that i named the branch because first I attempted to separete model to 5 GPCs, you will see by commit history

Commits are pretty messy, because coauthored by AI, and i actually needed to create a new branch for every new subsystem i was working on, but i didn't expected a good results in short-time term, you can see by commit history that TAL was done in one day, and it is really flyable from ABORT pb to the ground.
Summary from Opus, what's been done to FCS->MDM->FC wiring:
Here's the full FCS↔MDM↔FC-bus wiring in SSV, verified against the code.
## FC bus strings (4)
Each string = one
FF (Flight-critical Forward) + one
FA (Flight-critical Aft) MDM, commanded by its GPC:
| String | FF (addr) | FA (addr) | Commander |
|--------|-----------|-----------|-----------|
| 1 | FF1 (25) | FA1 (19) | GPC 1 |
| 2 | FF2 (26) | FA2 (20) | GPC 2 |
| 3 | FF3 (27) | FA3 (21) | GPC 3 |
| 4 | FF4 (28) | FA4 (22) | GPC 4 |
FCS
effector commands/feedback go through the
FA MDMs; FCS
sensors (RGA rates, accelerometers, ADTA) come in through the
FF MDMs. Each RS GPC commands only its own string's FA MDM (RSM
fcStringMask); the 4 redundant commands OR at the hardware — so
GPC1→FA1→ASA channel 1, GPC2→FA2→ch 2, … (matches the MDM Equipment-Lost chart, FA*n*→FCS CH
n).
## Aerosurface command (GPC → FA MDM AOD → ASA → actuator)
1.
Aero_Act_SOP computes each surface command, encodes deg→volts (
AOD_KV: elevon/rudder 0.1 V/deg, speedbrake 0.05) into COMPOOL
SCP_FAn_IOM4_CHm_DATA — one channel per surface, per string.
2.
SimpleFCOS_IO_GNC::output() sends them to each string's FA MDM
IOM4 (AOD), CH0–5, gated by
CommandsString.
3.
SimpleMDM_FAn drives
dopIOM4_HI[0..5] → bundle
AEROSURFACE_FAn (CH0=LOB, LIB, RIB, ROB elevons, CH4=rudder, CH5=speedbrake).
4.
AeroSurfaces reads
dipCh[surf][string] from the four
AEROSURFACE_FA1..4 bundles, decodes volts→deg = each
ASA channel command, and
force-sums the 4 channels at the ram. (Body flap is still the legacy single-channel path.)
## Aerosurface feedback (RVDT → FA MDM AIS → GPC)
AeroSurfaces drives
dopFB[surf] →
AEROSURFACE_FB (ram-position RVDT) → each
SimpleMDM_FAn reads it via
IOM6 (AIS) CH0–5 →
SCP_FAn_IOM6_CHm_DATA →
SimpleFCOS_IO_GNC::input() → the
PFB SOPs (Elevon/Rudder/Speedbrake) do a 4-channel
mid-value-select RM → selected position.
## SSME / SRB TVC (ATVC)
MPS_ATVC_CMD_SOP /
SRB_ATVC_CMD_SOP encode gimbal commands into FA
IOM4 AOD —
SSME CH9–14, SRB CH15–18 →
SimpleMDM_FAn → bundle
ATVC_FAn →
gnc::ATVC decodes +
force-sums the 4 strings → drives the SSME/SRB hydraulic actuators (
MPS_TVC::UpdateActuator).
## OMS TVC
OMS_TVC_Command_SOP → FA
IOM4 CH7/8 (L/R pitch/yaw) →
OMS_TVC; feedback via FA
IOM14 (AIS) CH14/15.
## Failure propagation
- FA MDM power —
MDM_Power bundle (FA1–4 = ch 4–7) → AeroSurfaces drops an unpowered string's ASA channel from the force-sum (single-MDM loss tolerated; surface held by remaining strings).
- Commfault —
SCP_COMMFAULT_WORD_1 bits 12–15 = FA1–4 (0–3 = FF1–4) gate each MDM's I/O and trip the FCS-channel down-arrows / annunciation.
So end to end:
GPC (Aero_Act/ATVC SOP) → COMPOOL FAn_IOM4 → FCOS per-string send → FA*n* MDM AOD → AEROSURFACE_FAn/ATVC_FAn bundle → ASA/ATVC channel → 4-channel force-sum → actuator, with RVDT feedback returning through FA*n* IOM6 AIS to the PFB-SOP MVS. The FF MDMs feed the sensor side of the loop.