1
0

knee page discovery

This commit is contained in:
Aiden
2026-05-26 19:08:15 +10:00
parent 57547fb6ed
commit 0d099235c5
8 changed files with 882 additions and 8 deletions

175
docs/pt2-knee-rom-trace.md Normal file
View File

@@ -0,0 +1,175 @@
# PT2 KNEE ROM Trace
Date: 2026-05-26
## Short Version
KNEE is not a simple held selector bit. The ROM has a dedicated local panel-input handler at `loc_1795`, reached when the panel input word at `F104` changes. That handler uses CCU-side selector state as gates, then either shows a short timed KNEE page or reports a KNEE value change on selector `0x00BC`.
This explains the bench pattern where KNEE AUTO can light or flash and then clear even while serial traffic remains healthy: one ROM path is a timed display/page override, not a maintained lamp value.
## Input Path
The local panel path is:
```text
F104 changes -> F692 updated -> F6F0.1 set -> main dispatcher calls loc_1795
```
The important code anchors are:
```text
3B33 MOV:G.W @H'F104, R0
3B37 CMP:G.W @H'F692, R0
3B3D BSET.B #1, @H'F6F0
3B41 MOV:G.W R0, @H'F692
1630 BCLR.B #1, @H'F6F0
1636 JSR @loc_1795
```
So serial writes can prepare the state table, but the main KNEE control branch appears to require the panel-side input lane to change.
## Handler Decision Table
`loc_1795` reads two words from the primary selector table:
| ROM read | Selector meaning |
| --- | --- |
| `@H'E172` | `E000[0x00B9]` |
| `@H'E220` | `E000[0x0110]` |
The branch is:
```text
1795 if F731 > 2: skip
179C if E000[0x00B9].13 == 0: loc_2127()
17A7 else if E000[0x0110].15 == 1: loc_2127()
17B2 else:
delta = F692 - F6B2
report/update selector 0x00BC via loc_19A2
17C0 F6B2 = F692
```
Practical interpretation:
| Condition | ROM effect | Current meaning |
| --- | --- | --- |
| `0x00B9.13 = 0` | timed KNEE page via `loc_2127` | KNEE value reporting not enabled |
| `0x00B9.13 = 1`, `0x0110.15 = 1` | timed KNEE page via `loc_2127` | override/inhibit mode |
| `0x00B9.13 = 1`, `0x0110.15 = 0` | value delta reported as selector `0x00BC` | likely live KNEE control/report lane |
This downgrades the earlier bench label that treated `0x00B9.15` as the main KNEE gate. The ROM gate for the panel-input handler is `0x00B9.13`.
## Timed KNEE Page
`loc_2127` is the timed page path:
```text
2127 set FB03.7
212D save old F732 into F734, if this is a fresh override
2135 F732 = 0x1C03
213B FB02 = 0x14
2140 call loc_48FA
```
The timer path later decrements `FB02`; when it expires, `loc_48EF` restores `F732` from `F734` and redraws. That is the likely cause of "lights, then falls away" observations.
The LCD dispatcher confirms `F732=0x1C03` is a KNEE page:
```text
493E[0x1C] -> 0x92CC
0x92DE[3] -> 0x95CE
0x960B prints "KNEE"
```
On that KNEE page, the second line is selected like this:
```text
if E000[0x0110].15: "DL"
else if E000[0x00B9].15: "PRESET"
else: "AUTO"
```
So `0x00B9.15` still matters, but it appears to choose the KNEE page label (`PRESET` versus `AUTO`) rather than enabling the report path. `0x0110.15` selects the `DL` label and also forces the timed page path from `loc_1795`.
## Bench Implications
Useful frames to test this model:
| Purpose | Frame |
| --- | --- |
| clear `0x00B9` | `00 01 39 00 00 62` |
| set `0x00B9.13` gate | `00 01 39 20 00 42` |
| set `0x00B9.15` label bit | `00 01 39 80 00 E2` |
| set `0x00B9.15` and `.13` | `00 01 39 A0 00 C2` |
| clear `0x0110` | `00 01 90 00 00 CB` |
| set `0x0110.15` override | `00 01 90 80 00 4B` |
| read `0x00BC` | `01 01 3C 00 00 66` |
The most direct live-control test is:
1. Reach `CONNECT: OK`.
2. Send `00 01 39 20 00 42` to set `0x00B9.13`.
3. Send `00 01 90 00 00 CB` to clear `0x0110.15`.
4. Move or exercise the physical KNEE-related control, if available.
5. Watch for TX/report traffic around selector `0x00BC`.
If no physical KNEE input is moved, the ROM may not enter `loc_1795`, because the trigger is the `F104` panel input change path rather than the serial write itself.
## Bench Observation: DTL / KNEE
The first `knee-rom-gate-and-value-probe` bench run produced a new LCD state with `DTL` on the left and `KNEE` on the right. That is an important confirmation: page `0x1C` contains both a KNEE entry and a DETAIL entry.
Relevant ROM text and page entries:
```text
0x92DE[3] -> 0x95CE KNEE page entry
0x92DE[7] -> 0x97C8 DETAIL page entry
0x960B prints "KNEE"
0x9805 prints "DETAIL"
```
The bench display probably shows the page-0x1C menu neighborhood, with DETAIL abbreviated as `DTL` and KNEE as the selected/right-side item. The log does not encode LCD pixels, but the serial timing around the observation is consistent with the KNEE probe:
```text
00 01 39 20 00 42 ; set 0x00B9.13 gate
00 01 39 A0 00 C2 ; set 0x00B9.15 + 0x00B9.13
00 01 90 80 00 4B ; set 0x0110.15 timed KNEE/DL override
```
Next isolation target: determine whether `DTL/KNEE` appears from `0x00B9.13`, `0x00B9.A0`, `0x0110.15`, or only the combined sequence.
## Panel Correlation
The physical panel has both DETAIL and KNEE buttons near the LCD. That matches the ROM page-`0x1C` neighborhood and makes the observed `DTL/KNEE` state likely to be a local menu/button context rather than a generic lamp status.
Practical implication: once the CCU-side selector gates are prepared, pressing the physical DETAIL/KNEE buttons may be the missing `F104` panel-input transition that calls `loc_1795`. If so, the useful evidence should be:
- visible LCD movement between DETAIL and KNEE entries,
- possible KNEE timed page redraws,
- TX/report traffic for selector `0x00BC` when KNEE input movement is accepted,
- or other page-`0x1C` selector reports from neighboring DETAIL/KNEE controls.
## Follow-Up: Lamp Without LCD Movement
The follow-up run after discovering the DETAIL/KNEE buttons did not reproduce an LCD page change. The observed result was:
- only the later KNEE cases/windows illuminated the KNEE AUTO lamp,
- none of those cases changed the LCD.
Current interpretation:
- `0x0110.15` is still the strongest KNEE AUTO lamp/status source.
- Serial table writes can light KNEE AUTO without necessarily entering the LCD DETAIL/KNEE page.
- The LCD path probably needs an additional local-display/menu condition, not just the CCU-side selector bits.
- The physical DETAIL/KNEE buttons may be scanned by the local panel path, but in this test they did not create a visible LCD transition or new serial report evidence.
This separates two related but distinct paths:
```text
KNEE AUTO lamp/status: mostly selector/table driven, strongest source 0x0110.15
DETAIL/KNEE LCD page: local page/menu context, likely page 0x1C plus panel/menu state
```
Next ROM target: trace the DETAIL and KNEE button scan bits through the page-`0x1C` menu dispatcher, not just the `loc_1795` KNEE value handler.

View File

@@ -101,11 +101,12 @@ Follow-up `lamp-isolate-knee-tail-single-boot` result:
Interpretation: Interpretation:
- `0x00B9` and `0x0110` are now the strongest KNEE AUTO candidates. - `0x00B9` and `0x0110` are real KNEE-related selectors, but a ROM trace now shows they are not a simple OR-held lamp pair.
- Because two selectors can light the same lamp, the KNEE status may be split between camera status and panel/display state, or one selector may select the subsystem while the other sets the visible mode. - `loc_1795` is the local KNEE/panel-input handler. It is reached from `F104 -> F692 -> F6F0.1`, then reads `E000[0x00B9]` and `E000[0x0110]`.
- `lamp-isolate-knee-bit-scan` lit KNEE AUTO in both candidate passes. The current working map is `0x00B9.15` and `0x0110.15`. - The ROM gate for the live KNEE value/report branch is `0x00B9.13`, not `0x00B9.15`.
- No lower-bit KNEE behavior has been reported from that scan yet. - `0x0110.15` forces a timed KNEE page/display override. That fits the observed "lights, then clears" behavior.
- The next useful step is an OR/precedence test: set both candidate bits, then clear one while the other remains set. If KNEE AUTO stays on, the lamp is probably an OR of two status sources. If it turns off, the latest selector write or a hidden mode gate is more important than the raw bit state. - `0x00B9.15` still matters on the timed KNEE LCD page: it selects the `PRESET` label when `0x0110.15` is clear. With both clear, the same page labels KNEE as `AUTO`.
- When `0x00B9.13` is set and `0x0110.15` is clear, the ROM computes `F692 - F6B2` and reports/updates selector `0x00BC`. That is now the strongest candidate for the KNEE control value lane.
Follow-up `lamp-knee-or-precedence` result: Follow-up `lamp-knee-or-precedence` result:
@@ -113,6 +114,30 @@ Follow-up `lamp-knee-or-precedence` result:
- Case 2 (`0x0110.15` set, then `0x00B9.15` set, then `0x0110` cleared) turned KNEE AUTO off well before the end, even though `0x00B9` had been set. - Case 2 (`0x0110.15` set, then `0x00B9.15` set, then `0x0110` cleared) turned KNEE AUTO off well before the end, even though `0x00B9` had been set.
- This argues against a simple OR model. Current best interpretation: `0x0110.15` is the stronger live display/control source for KNEE AUTO; `0x00B9.15` is related, but may be a transient, secondary status source, or only meaningful with another gate active. - This argues against a simple OR model. Current best interpretation: `0x0110.15` is the stronger live display/control source for KNEE AUTO; `0x00B9.15` is related, but may be a transient, secondary status source, or only meaningful with another gate active.
Follow-up `lamp-knee-sustain-compare` result:
- Repeated `0x00B9.15` refresh never lit KNEE AUTO.
- Repeated `0x0110.15` refresh lit KNEE AUTO, but it turned off again around the middle of the repeated-refresh window.
- This makes `0x00B9.15` look like a context-sensitive or stale interpretation rather than a maintained lamp source.
- `0x0110.15` remains the best KNEE AUTO source, but it is not sufficient by itself to hold the lamp. It likely needs a surrounding CCU status refresh, or another selector periodically clears/rebuilds the visible lamp bank.
Follow-up `lamp-knee-context-hold` result:
- Pairing `0x00B9.15` with the known `0x0093=0x9020` active refresh did not light KNEE AUTO.
- Pairing `0x0110.15` with `0x0093=0x9020` did light KNEE AUTO, but it still turned off around the middle of the run.
- The serial log stayed clean: repeated table readbacks and `02 00 02 00 00 5A` active responses continued, with no resync or NOT ACT-style serial collapse.
- Current best hypothesis: `0x0110.15` behaves more like an edge/pulse or consumed display request than a pure level-held lamp bit. Repeating the same high value may not retrigger it after the display task has consumed the state.
ROM follow-up:
- Detailed notes: `docs/pt2-knee-rom-trace.md`.
- The timed path sets `F732=0x1C03`, `FB02=0x14`, calls `loc_48FA`, and later restores the previous page through `loc_48EF`.
- `F732=0x1C03` dispatches to a KNEE LCD page. Its second line is `DL` when `0x0110.15` is set, `PRESET` when `0x0110.15` is clear and `0x00B9.15` is set, otherwise `AUTO`.
- `knee-rom-gate-and-value-probe` produced a new bench LCD state with `DTL` on the left and `KNEE` on the right. This matches the ROM page-0x1C neighborhood: KNEE entry at `0x95CE`, DETAIL entry at `0x97C8`.
- The panel physically has DETAIL and KNEE buttons near the LCD, so this is likely a local menu/button context. Pressing those buttons during the prepared gate window may supply the `F104` transition that the ROM needs before it calls `loc_1795`.
- Follow-up isolation lit KNEE AUTO in the later KNEE cases/windows but did not change the LCD. Treat the KNEE AUTO lamp and the DETAIL/KNEE LCD page as related but separate paths: `0x0110.15` remains the strongest lamp/status source, while LCD movement likely needs an additional local menu/display gate.
- Next bench retest should include `0x00B9.13` (`00 01 39 20 00 42`) and the `0x00BC` report/read lane, not only the older `0x00B9.15` / `0x0110.15` pair.
## Follow-Up Isolation Scenarios ## Follow-Up Isolation Scenarios
Run these with the console visible and record the exact label shown when each lamp changes: Run these with the console visible and record the exact label shown when each lamp changes:
@@ -126,6 +151,11 @@ Run these with the console visible and record the exact label shown when each la
.\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\lamp-isolate-knee-bit-scan.json --parity E --log captures\lamp-isolate-knee-bit-scan.txt --result-json captures\lamp-isolate-knee-bit-scan-result.json .\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\lamp-isolate-knee-bit-scan.json --parity E --log captures\lamp-isolate-knee-bit-scan.txt --result-json captures\lamp-isolate-knee-bit-scan-result.json
.\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\lamp-knee-or-precedence.json --parity E --log captures\lamp-knee-or-precedence.txt --result-json captures\lamp-knee-or-precedence-result.json .\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\lamp-knee-or-precedence.json --parity E --log captures\lamp-knee-or-precedence.txt --result-json captures\lamp-knee-or-precedence-result.json
.\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\lamp-knee-sustain-compare.json --parity E --log captures\lamp-knee-sustain-compare.txt --result-json captures\lamp-knee-sustain-compare-result.json .\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\lamp-knee-sustain-compare.json --parity E --log captures\lamp-knee-sustain-compare.txt --result-json captures\lamp-knee-sustain-compare-result.json
.\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\lamp-knee-context-hold.json --parity E --log captures\lamp-knee-context-hold.txt --result-json captures\lamp-knee-context-hold-result.json
.\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\lamp-knee-edge-refresh.json --parity E --log captures\lamp-knee-edge-refresh.txt --result-json captures\lamp-knee-edge-refresh-result.json
.\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\knee-rom-gate-and-value-probe.json --parity E --log captures\knee-rom-gate-and-value-probe.txt --result-json captures\knee-rom-gate-and-value-probe-result.json
.\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\knee-rom-dtl-knee-isolation.json --parity E --log captures\knee-rom-dtl-knee-isolation.txt --result-json captures\knee-rom-dtl-knee-isolation-result.json
.\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\knee-detail-physical-button-watch.json --parity E --log captures\knee-detail-physical-button-watch.txt --result-json captures\knee-detail-physical-button-watch-result.json
``` ```
Method notes: Method notes:

View File

@@ -683,9 +683,14 @@ Newest confirmed behavior:
- `0x0007 = 0x8000/0x0000` blinked CAM POWER in isolation. - `0x0007 = 0x8000/0x0000` blinked CAM POWER in isolation.
- `0x0015 = 0x8000/0x0000` blinked CALL and red tally in isolation. - `0x0015 = 0x8000/0x0000` blinked CALL and red tally in isolation.
- Fresh-boot isolation maps `0x0013` to SLAVE, `0x0016` to green tally, and `0x0017` to BARS for the `0x8000/0x0000` value pair. - Fresh-boot isolation maps `0x0013` to SLAVE, `0x0016` to green tally, and `0x0017` to BARS for the `0x8000/0x0000` value pair.
- Fresh-boot isolation maps `0x0092` to iris AUTO/OFF behavior, and maps both `0x00B9` and `0x0110` to KNEE AUTO behavior. - Fresh-boot isolation maps `0x0092` to iris AUTO/OFF behavior, and maps both `0x00B9` and `0x0110` to KNEE-related behavior.
- A KNEE bit scan keeps the working bit assignment at `0x00B9.15` and `0x0110.15`; no lower-bit KNEE behavior has been reported yet. - A ROM trace now explains why the KNEE tests looked non-level-held. `loc_1795` is reached from the panel input lane (`F104 -> F692 -> F6F0.1`) and reads `E000[0x00B9]` plus `E000[0x0110]`.
- A KNEE precedence test argues against a simple OR: clearing `0x0110` turned KNEE AUTO off even after `0x00B9` had been set. Current best interpretation is that `0x0110.15` is the stronger live KNEE AUTO source, while `0x00B9.15` is related or transient. - The live KNEE value/report gate is `0x00B9.13`, not the earlier bench-only `0x00B9.15` guess.
- `0x0110.15` forces a timed KNEE page/display override (`F732=0x1C03`, `FB02=0x14`), which matches the observed "lights, then clears" behavior.
- On that KNEE LCD page, `0x0110.15` selects `DL`, `0x00B9.15` selects `PRESET`, and both clear selects `AUTO`.
- When `0x00B9.13` is set and `0x0110.15` is clear, the ROM reports/updates selector `0x00BC` from the `F692 - F6B2` panel-input delta. See `docs/pt2-knee-rom-trace.md`.
- The first KNEE ROM probe produced a new bench LCD state with `DTL` on the left and `KNEE` on the right, matching the ROM page-0x1C DETAIL/KNEE neighborhood.
- A follow-up isolation lit the KNEE AUTO lamp in later KNEE windows but did not change the LCD. Current model: KNEE AUTO lamp/status is mostly selector driven, while the DETAIL/KNEE LCD page needs an additional local menu/display condition.
## What Is Still Unknown ## What Is Still Unknown

View File

@@ -0,0 +1,100 @@
{
"name": "knee-detail-physical-button-watch",
"notes": [
"Create clean watch windows for the physical DETAIL and KNEE buttons near the LCD.",
"The ROM trace suggests these buttons may be the missing F104 panel-input transition into loc_1795.",
"Watch the console labels and LCD. During the labeled windows, press DETAIL, KNEE, then DETAIL/KNEE alternately."
],
"steps": [
{
"action": "power_cycle",
"off_seconds": 1.5
},
{
"action": "wait_ready",
"heartbeats": 2,
"timeout": 10.0,
"require": true
},
{
"action": "drain",
"seconds": 0.25
},
{
"action": "send",
"label": "ok_seed_1",
"frame": "00 00 00 80 00 DA",
"listen": 0.60
},
{
"action": "send",
"label": "ok_seed_2",
"frame": "00 00 00 80 00 DA",
"listen": 0.60
},
{
"action": "send",
"label": "prepare_clear_0110",
"frame": "00 01 90 00 00 CB",
"listen": 0.30
},
{
"action": "send",
"label": "prepare_00b9_bit13_gate",
"frame": "00 01 39 20 00 42",
"listen": 0.80
},
{
"action": "listen",
"seconds": 5.0
},
{
"action": "send",
"label": "read_00bc_after_detail_press_window",
"frame": "01 01 3C 00 00 66",
"listen": 0.80
},
{
"action": "send",
"label": "refresh_00b9_bit13_gate_for_knee_press",
"frame": "00 01 39 20 00 42",
"listen": 0.50
},
{
"action": "listen",
"seconds": 5.0
},
{
"action": "send",
"label": "read_00bc_after_knee_press_window",
"frame": "01 01 3C 00 00 66",
"listen": 0.80
},
{
"action": "send",
"label": "prepare_00b9_a0_for_page_label_watch",
"frame": "00 01 39 A0 00 C2",
"listen": 0.80
},
{
"action": "listen",
"seconds": 6.0
},
{
"action": "send",
"label": "prepare_0110_dl_override_then_press_buttons",
"frame": "00 01 90 80 00 4B",
"listen": 0.80
},
{
"action": "listen",
"seconds": 6.0
},
{
"action": "send",
"label": "final_read_00bc",
"frame": "01 01 3C 00 00 66",
"listen": 0.80
}
]
}

View File

@@ -0,0 +1,206 @@
{
"name": "knee-rom-dtl-knee-isolation",
"notes": [
"Isolate which ROM-derived KNEE selector sequence creates the bench DTL/KNEE LCD state.",
"Record the exact case label visible in the console when DTL/KNEE appears or disappears.",
"Cases separate 0x00B9.13 gate, 0x00B9.15 label bit, and 0x0110.15 timed override."
],
"steps": [
{
"action": "power_cycle",
"off_seconds": 1.5
},
{
"action": "wait_ready",
"heartbeats": 2,
"timeout": 10.0,
"require": true
},
{
"action": "drain",
"seconds": 0.25
},
{
"action": "send",
"label": "case_a_ok_seed_1",
"frame": "00 00 00 80 00 DA",
"listen": 0.60
},
{
"action": "send",
"label": "case_a_ok_seed_2",
"frame": "00 00 00 80 00 DA",
"listen": 0.60
},
{
"action": "send",
"label": "case_a_clear_00b9",
"frame": "00 01 39 00 00 62",
"listen": 0.30
},
{
"action": "send",
"label": "case_a_clear_0110",
"frame": "00 01 90 00 00 CB",
"listen": 0.30
},
{
"action": "send",
"label": "case_a_set_00b9_bit13_only_watch_dtl_knee",
"frame": "00 01 39 20 00 42",
"listen": 3.00
},
{
"action": "power_cycle",
"off_seconds": 1.5
},
{
"action": "wait_ready",
"heartbeats": 2,
"timeout": 10.0,
"require": true
},
{
"action": "drain",
"seconds": 0.25
},
{
"action": "send",
"label": "case_b_ok_seed_1",
"frame": "00 00 00 80 00 DA",
"listen": 0.60
},
{
"action": "send",
"label": "case_b_ok_seed_2",
"frame": "00 00 00 80 00 DA",
"listen": 0.60
},
{
"action": "send",
"label": "case_b_clear_0110",
"frame": "00 01 90 00 00 CB",
"listen": 0.30
},
{
"action": "send",
"label": "case_b_set_00b9_bits15_and_13_watch_dtl_knee",
"frame": "00 01 39 A0 00 C2",
"listen": 3.00
},
{
"action": "power_cycle",
"off_seconds": 1.5
},
{
"action": "wait_ready",
"heartbeats": 2,
"timeout": 10.0,
"require": true
},
{
"action": "drain",
"seconds": 0.25
},
{
"action": "send",
"label": "case_c_ok_seed_1",
"frame": "00 00 00 80 00 DA",
"listen": 0.60
},
{
"action": "send",
"label": "case_c_ok_seed_2",
"frame": "00 00 00 80 00 DA",
"listen": 0.60
},
{
"action": "send",
"label": "case_c_clear_00b9",
"frame": "00 01 39 00 00 62",
"listen": 0.30
},
{
"action": "send",
"label": "case_c_set_0110_bit15_only_watch_dtl_knee",
"frame": "00 01 90 80 00 4B",
"listen": 3.00
},
{
"action": "power_cycle",
"off_seconds": 1.5
},
{
"action": "wait_ready",
"heartbeats": 2,
"timeout": 10.0,
"require": true
},
{
"action": "drain",
"seconds": 0.25
},
{
"action": "send",
"label": "case_d_ok_seed_1",
"frame": "00 00 00 80 00 DA",
"listen": 0.60
},
{
"action": "send",
"label": "case_d_ok_seed_2",
"frame": "00 00 00 80 00 DA",
"listen": 0.60
},
{
"action": "send",
"label": "case_d_set_00b9_bit13_then_0110_override_part1",
"frame": "00 01 39 20 00 42",
"listen": 0.80
},
{
"action": "send",
"label": "case_d_set_0110_bit15_after_00b9_bit13_watch_dtl_knee",
"frame": "00 01 90 80 00 4B",
"listen": 3.00
},
{
"action": "power_cycle",
"off_seconds": 1.5
},
{
"action": "wait_ready",
"heartbeats": 2,
"timeout": 10.0,
"require": true
},
{
"action": "drain",
"seconds": 0.25
},
{
"action": "send",
"label": "case_e_ok_seed_1",
"frame": "00 00 00 80 00 DA",
"listen": 0.60
},
{
"action": "send",
"label": "case_e_ok_seed_2",
"frame": "00 00 00 80 00 DA",
"listen": 0.60
},
{
"action": "send",
"label": "case_e_set_00b9_a0_then_0110_override_part1",
"frame": "00 01 39 A0 00 C2",
"listen": 0.80
},
{
"action": "send",
"label": "case_e_set_0110_bit15_after_00b9_a0_watch_dtl_knee",
"frame": "00 01 90 80 00 4B",
"listen": 3.00
}
]
}

View File

@@ -0,0 +1,132 @@
{
"name": "knee-rom-gate-and-value-probe",
"notes": [
"Probe the ROM-derived KNEE model from docs/pt2-knee-rom-trace.md.",
"The key correction is that 0x00B9.13 gates the live KNEE value/report branch, while 0x0110.15 forces the timed KNEE page.",
"Serial writes may only prepare the state. If the panel has a KNEE-related control, move it during the long gate windows and watch for selector 0x00BC reports or visible KNEE changes."
],
"steps": [
{
"action": "power_cycle",
"off_seconds": 1.5
},
{
"action": "wait_ready",
"heartbeats": 2,
"timeout": 10.0,
"require": true
},
{
"action": "drain",
"seconds": 0.25
},
{
"action": "send",
"label": "ok_seed_1",
"frame": "00 00 00 80 00 DA",
"listen": 0.60
},
{
"action": "send",
"label": "ok_seed_2",
"frame": "00 00 00 80 00 DA",
"listen": 0.60
},
{
"action": "send",
"label": "clear_00b9",
"frame": "00 01 39 00 00 62",
"listen": 0.30
},
{
"action": "send",
"label": "clear_0110",
"frame": "00 01 90 00 00 CB",
"listen": 0.80
},
{
"action": "send",
"label": "read_00bc_baseline",
"frame": "01 01 3C 00 00 66",
"listen": 0.60
},
{
"action": "send",
"label": "set_00b9_bit13_gate_move_knee_control_if_possible",
"frame": "00 01 39 20 00 42",
"listen": 4.00
},
{
"action": "send",
"label": "read_00bc_after_gate_window",
"frame": "01 01 3C 00 00 66",
"listen": 0.80
},
{
"action": "send",
"label": "set_00b9_bits15_and_13_preset_label_plus_gate",
"frame": "00 01 39 A0 00 C2",
"listen": 1.50
},
{
"action": "send",
"label": "set_0110_bit15_dl_timed_page_override",
"frame": "00 01 90 80 00 4B",
"listen": 2.50
},
{
"action": "send",
"label": "clear_0110_return_to_value_path",
"frame": "00 01 90 00 00 CB",
"listen": 1.00
},
{
"action": "send",
"label": "read_00bc_after_override_clear",
"frame": "01 01 3C 00 00 66",
"listen": 0.80
},
{
"action": "repeat",
"count": 2,
"steps": [
{
"action": "send",
"label": "00bc_direct_low_probe",
"frame": "00 01 3C 00 00 67",
"listen": 0.35
},
{
"action": "send",
"label": "00bc_direct_mid_probe",
"frame": "00 01 3C 40 00 27",
"listen": 0.35
},
{
"action": "send",
"label": "00bc_direct_high_probe",
"frame": "00 01 3C 80 00 E7",
"listen": 0.35
},
{
"action": "send",
"label": "read_00bc_direct_probe",
"frame": "01 01 3C 00 00 66",
"listen": 0.50
}
]
},
{
"action": "send",
"label": "final_clear_00b9",
"frame": "00 01 39 00 00 62",
"listen": 0.50
},
{
"action": "send",
"label": "final_clear_0110",
"frame": "00 01 90 00 00 CB",
"listen": 1.50
}
]
}

View File

@@ -0,0 +1,110 @@
{
"name": "lamp-knee-context-hold",
"notes": [
"Test whether the known quiet active refresh context lets KNEE AUTO stay on.",
"The prior sustain test showed repeated 0x00B9.15 never lit KNEE AUTO, while repeated 0x0110.15 lit it then cleared around mid-window.",
"This pairs each KNEE candidate with the proven 0x0093=0x9020 active refresh stream."
],
"steps": [
{
"action": "power_cycle",
"off_seconds": 1.5
},
{
"action": "wait_ready",
"heartbeats": 2,
"timeout": 10.0,
"require": true
},
{
"action": "drain",
"seconds": 0.25
},
{
"action": "send",
"label": "case_00b9_context_ok_seed_1",
"frame": "00 00 00 80 00 DA",
"listen": 0.60
},
{
"action": "send",
"label": "case_00b9_context_ok_seed_2",
"frame": "00 00 00 80 00 DA",
"listen": 0.60
},
{
"action": "repeat",
"count": 10,
"steps": [
{
"action": "send",
"label": "context_0093_9020_refresh_for_00b9",
"frame": "00 01 13 90 20 F8",
"listen": 0.25
},
{
"action": "send",
"label": "context_00b9_bit15_knee_test",
"frame": "00 01 39 80 00 E2",
"listen": 0.35
}
]
},
{
"action": "send",
"label": "clear_00b9_with_context_watch",
"frame": "00 01 39 00 00 62",
"listen": 1.00
},
{
"action": "power_cycle",
"off_seconds": 1.5
},
{
"action": "wait_ready",
"heartbeats": 2,
"timeout": 10.0,
"require": true
},
{
"action": "drain",
"seconds": 0.25
},
{
"action": "send",
"label": "case_0110_context_ok_seed_1",
"frame": "00 00 00 80 00 DA",
"listen": 0.60
},
{
"action": "send",
"label": "case_0110_context_ok_seed_2",
"frame": "00 00 00 80 00 DA",
"listen": 0.60
},
{
"action": "repeat",
"count": 10,
"steps": [
{
"action": "send",
"label": "context_0093_9020_refresh_for_0110",
"frame": "00 01 13 90 20 F8",
"listen": 0.25
},
{
"action": "send",
"label": "context_0110_bit15_knee_test",
"frame": "00 01 90 80 00 4B",
"listen": 0.35
}
]
},
{
"action": "send",
"label": "clear_0110_with_context_watch",
"frame": "00 01 90 00 00 CB",
"listen": 1.00
}
]
}

View File

@@ -0,0 +1,116 @@
{
"name": "lamp-knee-edge-refresh",
"notes": [
"Test whether KNEE AUTO needs a low-to-high edge on 0x0110.15 rather than repeated high writes.",
"The context-hold test kept active serial responses alive, but KNEE AUTO still turned off mid-run.",
"This alternates clear/set for 0x0110.15, first by itself and then with 0x0093=0x9020 context refresh."
],
"steps": [
{
"action": "power_cycle",
"off_seconds": 1.5
},
{
"action": "wait_ready",
"heartbeats": 2,
"timeout": 10.0,
"require": true
},
{
"action": "drain",
"seconds": 0.25
},
{
"action": "send",
"label": "edge_only_ok_seed_1",
"frame": "00 00 00 80 00 DA",
"listen": 0.60
},
{
"action": "send",
"label": "edge_only_ok_seed_2",
"frame": "00 00 00 80 00 DA",
"listen": 0.60
},
{
"action": "repeat",
"count": 10,
"steps": [
{
"action": "send",
"label": "edge_only_clear_0110",
"frame": "00 01 90 00 00 CB",
"listen": 0.18
},
{
"action": "send",
"label": "edge_only_set_0110_bit15_watch",
"frame": "00 01 90 80 00 4B",
"listen": 0.42
}
]
},
{
"action": "send",
"label": "edge_only_final_clear_0110",
"frame": "00 01 90 00 00 CB",
"listen": 1.00
},
{
"action": "power_cycle",
"off_seconds": 1.5
},
{
"action": "wait_ready",
"heartbeats": 2,
"timeout": 10.0,
"require": true
},
{
"action": "drain",
"seconds": 0.25
},
{
"action": "send",
"label": "edge_context_ok_seed_1",
"frame": "00 00 00 80 00 DA",
"listen": 0.60
},
{
"action": "send",
"label": "edge_context_ok_seed_2",
"frame": "00 00 00 80 00 DA",
"listen": 0.60
},
{
"action": "repeat",
"count": 10,
"steps": [
{
"action": "send",
"label": "edge_context_0093_9020_refresh",
"frame": "00 01 13 90 20 F8",
"listen": 0.20
},
{
"action": "send",
"label": "edge_context_clear_0110",
"frame": "00 01 90 00 00 CB",
"listen": 0.16
},
{
"action": "send",
"label": "edge_context_set_0110_bit15_watch",
"frame": "00 01 90 80 00 4B",
"listen": 0.34
}
]
},
{
"action": "send",
"label": "edge_context_final_clear_0110",
"frame": "00 01 90 00 00 CB",
"listen": 1.00
}
]
}