From f54a170361e6d98b2af5ba90757fcfdff7508784 Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Thu, 2 Apr 2026 10:36:01 +1100 Subject: [PATCH] docs(script): fix up generator PWM outputs --- docs/scripts/fc_doc_generator/CLAUDE.md | 9 +- .../fc_doc_generator/fc_doc_generator.py | 34 ++- .../metadata/accton-godwit_ga1_data.json | 14 + .../metadata/ark_fmu-v6x_data.json | 14 + .../metadata/auterion_fmu-v6s_data.json | 14 + .../metadata/auterion_fmu-v6x_data.json | 14 + .../metadata/cuav_7-nano_data.json | 48 ++++ .../metadata/cuav_fmu-v6x_data.json | 14 + .../metadata/cuav_x25-evo_data.json | 52 ++++ .../metadata/cuav_x25-super_data.json | 52 ++++ .../metadata/holybro_durandal-v1_data.json | 34 +++ .../metadata/holybro_pix32v5_data.json | 18 ++ .../metadata/px4_fmu-v5_data.json | 18 ++ .../metadata/px4_fmu-v5x_data.json | 14 + .../metadata/px4_fmu-v6u_data.json | 14 + .../metadata/px4_fmu-v6x_data.json | 14 + .../metadata/svehicle_e2_data.json | 14 + .../metadata/zeroone_x6_data.json | 14 + .../fc_doc_generator/tests/conftest.py | 6 + .../stm32h7_capture_channels/default.px4board | 1 + .../nuttx-config/nsh/defconfig | 3 + .../src/board_config.h | 2 + .../src/timer_config.cpp | 36 +++ .../tests/snapshots/fc_sections.md | 264 +++++++++++------- .../snapshots/pwm_stm32h7_capture_channels.md | 20 ++ .../fc_doc_generator/tests/test_compute.py | 42 +++ .../fc_doc_generator/tests/test_generators.py | 27 ++ .../fc_doc_generator/tests/test_parsers.py | 18 ++ 28 files changed, 716 insertions(+), 108 deletions(-) create mode 100644 docs/scripts/fc_doc_generator/tests/fixtures/stm32h7_capture_channels/default.px4board create mode 100644 docs/scripts/fc_doc_generator/tests/fixtures/stm32h7_capture_channels/nuttx-config/nsh/defconfig create mode 100644 docs/scripts/fc_doc_generator/tests/fixtures/stm32h7_capture_channels/src/board_config.h create mode 100644 docs/scripts/fc_doc_generator/tests/fixtures/stm32h7_capture_channels/src/timer_config.cpp create mode 100644 docs/scripts/fc_doc_generator/tests/snapshots/pwm_stm32h7_capture_channels.md diff --git a/docs/scripts/fc_doc_generator/CLAUDE.md b/docs/scripts/fc_doc_generator/CLAUDE.md index 8a741ec9f3..f522f43af1 100644 --- a/docs/scripts/fc_doc_generator/CLAUDE.md +++ b/docs/scripts/fc_doc_generator/CLAUDE.md @@ -28,10 +28,11 @@ fc_doc_generator/ │ └── __wizard.json # User-supplied wizard overrides └── tests/ ├── conftest.py # snapshot fixture + board_* path fixtures - ├── fixtures/ # Minimal fake board trees (5 boards) + ├── fixtures/ # Minimal fake board trees │ ├── stm32h7_all_dshot/ │ ├── stm32h7_mixed_io/ │ ├── stm32h7_ppm_shared/ + │ ├── stm32h7_capture_channels/ # 8 regular + 8 initIOTimerChannelCapture outputs │ ├── stm32f4_no_dshot/ │ └── imxrt_all_dshot/ ├── snapshots/ # Expected markdown output (.md files) @@ -56,6 +57,12 @@ python docs/scripts/fc_doc_generator/fc_doc_generator.py --apply # Apply a single section only: python docs/scripts/fc_doc_generator/fc_doc_generator.py --apply --section pwm_outputs +# Apply all sections to a single doc only (stem or filename, implies --apply): +python docs/scripts/fc_doc_generator/fc_doc_generator.py --doc cuav_x25-evo.md + +# Apply a single section to a single doc: +python docs/scripts/fc_doc_generator/fc_doc_generator.py --doc cuav_x25-evo.md --section pwm_outputs + # Create a new stub FC doc (interactive wizard): python docs/scripts/fc_doc_generator/fc_doc_generator.py --new-doc diff --git a/docs/scripts/fc_doc_generator/fc_doc_generator.py b/docs/scripts/fc_doc_generator/fc_doc_generator.py index 9a7cd8f29a..e579951615 100644 --- a/docs/scripts/fc_doc_generator/fc_doc_generator.py +++ b/docs/scripts/fc_doc_generator/fc_doc_generator.py @@ -279,6 +279,7 @@ def parse_timer_config(board_path: Path) -> dict: initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel1}, …) initIOTimerChannelOutputClear(…) — same semantics, clears on disable initIOTimerChannelDshot(…) — iMXRT only: marks channel as DShot + initIOTimerChannelCapture(…) — dual-purpose capture/output channel The channel index (Channel1 = index 0, Channel2 = index 1, …) is extracted and stored for use by compute_bdshot() when determining per-channel BDShot @@ -331,6 +332,7 @@ def parse_timer_config(board_path: Path) -> dict: # Parse timer_io_channels[] array entries # Handle: initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel1}, ...) # Handle: initIOTimerChannelOutputClear(...), initIOTimerChannelDshot(...) + # Handle: initIOTimerChannelCapture(...) -- dual-purpose capture/output channels channels = [] io_channels_match = re.search( r'constexpr\s+timer_io_channels_t\s+timer_io_channels\[.*?\]\s*=\s*\{(.*?)\};', @@ -341,7 +343,7 @@ def parse_timer_config(board_path: Path) -> dict: block = re.sub(r'//[^\n]*', '', io_channels_match.group(1)) output_idx = 1 for entry in re.finditer( - r'(initIOTimerChannel(?:OutputClear|Dshot)?)\s*\(\s*io_timers\s*,\s*\{(?:Timer|PWM)::(\w+)\s*,\s*(?:Timer::|PWM::)?(\w+)\}', + r'(initIOTimerChannel(?:OutputClear|Dshot|Capture)?)\s*\(\s*io_timers\s*,\s*\{(?:Timer|PWM)::(\w+)\s*,\s*(?:Timer::|PWM::)?(\w+)\}', block ): func_name = entry.group(1) @@ -2485,8 +2487,8 @@ def generate_specifications_section(board_key: str, entry: dict) -> str: lines.append('### Interfaces') lines.append('') # Use group-derived count — DIRECT_PWM_OUTPUT_CHANNELS in board_config.h - # counts all FMU timer channels including capture inputs; groups only count - # initIOTimerChannel entries (actual servo outputs, not capture channels). + # counts all FMU timer channels, which matches groups since + # initIOTimerChannelCapture entries are also counted as outputs. groups = entry.get('groups') or [] fmu_out = sum(len(g.get('outputs', [])) for g in groups) io_out = entry.get('io_outputs', 0) or 0 @@ -2839,16 +2841,28 @@ def _has_no_rc_data(entry: dict) -> bool: ) -def apply_sections_to_docs(data: dict, sections: list = None) -> tuple: - """Apply generated sections to FC doc files. Returns (updated, skipped) lists.""" +def apply_sections_to_docs(data: dict, sections: list = None, doc_filter: str = None) -> tuple: + """Apply generated sections to FC doc files. Returns (updated, skipped) lists. + + doc_filter: if given, only process the board whose doc_file matches this + filename (e.g. 'cuav_x25-evo.md'). Stem-only ('cuav_x25-evo') also accepted. + """ sections_to_apply = sections or APPLY_SECTIONS updated, skipped = [], [] + # Normalise filter to bare filename with extension + if doc_filter: + p = Path(doc_filter) + doc_filter_name = p.name if p.suffix else p.name + ".md" + for key, entry in data.items(): doc_filename = entry.get('doc_file') if not doc_filename: skipped.append((key, 'no doc mapping')) continue + if doc_filter and doc_filename != doc_filter_name: + skipped.append((key, f'filtered (not {doc_filter_name})')) + continue doc_path = FC_DOCS / doc_filename if not doc_path.exists(): skipped.append((key, f'doc not found: {doc_filename}')) @@ -4355,6 +4369,12 @@ if __name__ == "__main__": "--section", choices=list(SECTION_GENERATORS.keys()), default=None, help="Apply only this section key (implies --apply).", ) + parser.add_argument( + "--doc", default=None, + metavar="FILENAME", + help="Apply only to this doc file, e.g. cuav_x25-evo.md (implies --apply). " + "Stem without extension is also accepted.", + ) parser.add_argument( "--output-dir", type=Path, default=None, metavar="DIR", @@ -4454,8 +4474,8 @@ if __name__ == "__main__": print(f"Boards with existing PWM section: {documented}") print(f"Boards with any DShot: {dshot_boards}") - if args.apply or args.section: + if args.apply or args.section or args.doc: sections = [args.section] if args.section else None print() - updated, skipped = apply_sections_to_docs(data, sections) + updated, skipped = apply_sections_to_docs(data, sections, doc_filter=args.doc) print(f"\nApply done. Updated: {len(updated)}, Skipped: {len(skipped)}") diff --git a/docs/scripts/fc_doc_generator/metadata/accton-godwit_ga1_data.json b/docs/scripts/fc_doc_generator/metadata/accton-godwit_ga1_data.json index 43f91d61b4..5221c7d401 100644 --- a/docs/scripts/fc_doc_generator/metadata/accton-godwit_ga1_data.json +++ b/docs/scripts/fc_doc_generator/metadata/accton-godwit_ga1_data.json @@ -65,6 +65,20 @@ ], "bdshot_outputs": [], "bdshot_output_only": [] + }, + { + "group": 4, + "timer": "Timer1", + "outputs": [ + 9 + ], + "dshot": false, + "dshot_outputs": [], + "non_dshot_outputs": [ + 9 + ], + "bdshot_outputs": [], + "bdshot_output_only": [] } ], "serial_ports": [ diff --git a/docs/scripts/fc_doc_generator/metadata/ark_fmu-v6x_data.json b/docs/scripts/fc_doc_generator/metadata/ark_fmu-v6x_data.json index d70774fe9e..c6db086aab 100644 --- a/docs/scripts/fc_doc_generator/metadata/ark_fmu-v6x_data.json +++ b/docs/scripts/fc_doc_generator/metadata/ark_fmu-v6x_data.json @@ -65,6 +65,20 @@ ], "bdshot_outputs": [], "bdshot_output_only": [] + }, + { + "group": 4, + "timer": "Timer1", + "outputs": [ + 9 + ], + "dshot": false, + "dshot_outputs": [], + "non_dshot_outputs": [ + 9 + ], + "bdshot_outputs": [], + "bdshot_output_only": [] } ], "serial_ports": [ diff --git a/docs/scripts/fc_doc_generator/metadata/auterion_fmu-v6s_data.json b/docs/scripts/fc_doc_generator/metadata/auterion_fmu-v6s_data.json index 98ba68e677..45fa761255 100644 --- a/docs/scripts/fc_doc_generator/metadata/auterion_fmu-v6s_data.json +++ b/docs/scripts/fc_doc_generator/metadata/auterion_fmu-v6s_data.json @@ -69,6 +69,20 @@ ], "bdshot_outputs": [], "bdshot_output_only": [] + }, + { + "group": 4, + "timer": "Timer8", + "outputs": [ + 10 + ], + "dshot": false, + "dshot_outputs": [], + "non_dshot_outputs": [ + 10 + ], + "bdshot_outputs": [], + "bdshot_output_only": [] } ], "serial_ports": [ diff --git a/docs/scripts/fc_doc_generator/metadata/auterion_fmu-v6x_data.json b/docs/scripts/fc_doc_generator/metadata/auterion_fmu-v6x_data.json index 80131321a4..a84102b9e5 100644 --- a/docs/scripts/fc_doc_generator/metadata/auterion_fmu-v6x_data.json +++ b/docs/scripts/fc_doc_generator/metadata/auterion_fmu-v6x_data.json @@ -65,6 +65,20 @@ ], "bdshot_outputs": [], "bdshot_output_only": [] + }, + { + "group": 4, + "timer": "Timer1", + "outputs": [ + 9 + ], + "dshot": false, + "dshot_outputs": [], + "non_dshot_outputs": [ + 9 + ], + "bdshot_outputs": [], + "bdshot_output_only": [] } ], "serial_ports": [ diff --git a/docs/scripts/fc_doc_generator/metadata/cuav_7-nano_data.json b/docs/scripts/fc_doc_generator/metadata/cuav_7-nano_data.json index 4b5d862d90..1a166a6673 100644 --- a/docs/scripts/fc_doc_generator/metadata/cuav_7-nano_data.json +++ b/docs/scripts/fc_doc_generator/metadata/cuav_7-nano_data.json @@ -65,6 +65,54 @@ ], "bdshot_outputs": [], "bdshot_output_only": [] + }, + { + "group": 4, + "timer": "Timer8", + "outputs": [ + 9, + 10, + 11 + ], + "dshot": false, + "dshot_outputs": [], + "non_dshot_outputs": [ + 9, + 10, + 11 + ], + "bdshot_outputs": [], + "bdshot_output_only": [] + }, + { + "group": 5, + "timer": "Timer15", + "outputs": [ + 12 + ], + "dshot": false, + "dshot_outputs": [], + "non_dshot_outputs": [ + 12 + ], + "bdshot_outputs": [], + "bdshot_output_only": [] + }, + { + "group": 6, + "timer": "Timer12", + "outputs": [ + 13, + 14 + ], + "dshot": false, + "dshot_outputs": [], + "non_dshot_outputs": [ + 13, + 14 + ], + "bdshot_outputs": [], + "bdshot_output_only": [] } ], "serial_ports": [ diff --git a/docs/scripts/fc_doc_generator/metadata/cuav_fmu-v6x_data.json b/docs/scripts/fc_doc_generator/metadata/cuav_fmu-v6x_data.json index e84e83048d..1f79a8f8ef 100644 --- a/docs/scripts/fc_doc_generator/metadata/cuav_fmu-v6x_data.json +++ b/docs/scripts/fc_doc_generator/metadata/cuav_fmu-v6x_data.json @@ -65,6 +65,20 @@ ], "bdshot_outputs": [], "bdshot_output_only": [] + }, + { + "group": 4, + "timer": "Timer1", + "outputs": [ + 9 + ], + "dshot": false, + "dshot_outputs": [], + "non_dshot_outputs": [ + 9 + ], + "bdshot_outputs": [], + "bdshot_output_only": [] } ], "serial_ports": [ diff --git a/docs/scripts/fc_doc_generator/metadata/cuav_x25-evo_data.json b/docs/scripts/fc_doc_generator/metadata/cuav_x25-evo_data.json index fce8434bc4..1e7390d49b 100644 --- a/docs/scripts/fc_doc_generator/metadata/cuav_x25-evo_data.json +++ b/docs/scripts/fc_doc_generator/metadata/cuav_x25-evo_data.json @@ -56,6 +56,58 @@ "bdshot_output_only": [ 8 ] + }, + { + "group": 3, + "timer": "Timer1", + "outputs": [ + 9, + 10, + 11 + ], + "dshot": false, + "dshot_outputs": [], + "non_dshot_outputs": [ + 9, + 10, + 11 + ], + "bdshot_outputs": [], + "bdshot_output_only": [] + }, + { + "group": 4, + "timer": "Timer8", + "outputs": [ + 12, + 13, + 14 + ], + "dshot": false, + "dshot_outputs": [], + "non_dshot_outputs": [ + 12, + 13, + 14 + ], + "bdshot_outputs": [], + "bdshot_output_only": [] + }, + { + "group": 5, + "timer": "Timer12", + "outputs": [ + 15, + 16 + ], + "dshot": false, + "dshot_outputs": [], + "non_dshot_outputs": [ + 15, + 16 + ], + "bdshot_outputs": [], + "bdshot_output_only": [] } ], "serial_ports": [ diff --git a/docs/scripts/fc_doc_generator/metadata/cuav_x25-super_data.json b/docs/scripts/fc_doc_generator/metadata/cuav_x25-super_data.json index ff75f4bda2..119eb4cd79 100644 --- a/docs/scripts/fc_doc_generator/metadata/cuav_x25-super_data.json +++ b/docs/scripts/fc_doc_generator/metadata/cuav_x25-super_data.json @@ -56,6 +56,58 @@ "bdshot_output_only": [ 8 ] + }, + { + "group": 3, + "timer": "Timer1", + "outputs": [ + 9, + 10, + 11 + ], + "dshot": false, + "dshot_outputs": [], + "non_dshot_outputs": [ + 9, + 10, + 11 + ], + "bdshot_outputs": [], + "bdshot_output_only": [] + }, + { + "group": 4, + "timer": "Timer8", + "outputs": [ + 12, + 13, + 14 + ], + "dshot": false, + "dshot_outputs": [], + "non_dshot_outputs": [ + 12, + 13, + 14 + ], + "bdshot_outputs": [], + "bdshot_output_only": [] + }, + { + "group": 5, + "timer": "Timer12", + "outputs": [ + 15, + 16 + ], + "dshot": false, + "dshot_outputs": [], + "non_dshot_outputs": [ + 15, + 16 + ], + "bdshot_outputs": [], + "bdshot_output_only": [] } ], "serial_ports": [ diff --git a/docs/scripts/fc_doc_generator/metadata/holybro_durandal-v1_data.json b/docs/scripts/fc_doc_generator/metadata/holybro_durandal-v1_data.json index 9f6c0e1f29..de5b1d5353 100644 --- a/docs/scripts/fc_doc_generator/metadata/holybro_durandal-v1_data.json +++ b/docs/scripts/fc_doc_generator/metadata/holybro_durandal-v1_data.json @@ -46,6 +46,40 @@ 5 ], "bdshot_output_only": [] + }, + { + "group": 3, + "timer": "Timer2", + "outputs": [ + 6, + 7, + 8 + ], + "dshot": false, + "dshot_outputs": [], + "non_dshot_outputs": [ + 6, + 7, + 8 + ], + "bdshot_outputs": [], + "bdshot_output_only": [] + }, + { + "group": 4, + "timer": "Timer12", + "outputs": [ + 9, + 10 + ], + "dshot": false, + "dshot_outputs": [], + "non_dshot_outputs": [ + 9, + 10 + ], + "bdshot_outputs": [], + "bdshot_output_only": [] } ], "serial_ports": [ diff --git a/docs/scripts/fc_doc_generator/metadata/holybro_pix32v5_data.json b/docs/scripts/fc_doc_generator/metadata/holybro_pix32v5_data.json index f68f936d87..45c6442a67 100644 --- a/docs/scripts/fc_doc_generator/metadata/holybro_pix32v5_data.json +++ b/docs/scripts/fc_doc_generator/metadata/holybro_pix32v5_data.json @@ -62,6 +62,24 @@ ], "bdshot_outputs": [], "bdshot_output_only": [] + }, + { + "group": 4, + "timer": "Timer2", + "outputs": [ + 9, + 10, + 11 + ], + "dshot": false, + "dshot_outputs": [], + "non_dshot_outputs": [ + 9, + 10, + 11 + ], + "bdshot_outputs": [], + "bdshot_output_only": [] } ], "serial_ports": [ diff --git a/docs/scripts/fc_doc_generator/metadata/px4_fmu-v5_data.json b/docs/scripts/fc_doc_generator/metadata/px4_fmu-v5_data.json index 74b953ccf7..ebf8adc864 100644 --- a/docs/scripts/fc_doc_generator/metadata/px4_fmu-v5_data.json +++ b/docs/scripts/fc_doc_generator/metadata/px4_fmu-v5_data.json @@ -62,6 +62,24 @@ ], "bdshot_outputs": [], "bdshot_output_only": [] + }, + { + "group": 4, + "timer": "Timer2", + "outputs": [ + 9, + 10, + 11 + ], + "dshot": false, + "dshot_outputs": [], + "non_dshot_outputs": [ + 9, + 10, + 11 + ], + "bdshot_outputs": [], + "bdshot_output_only": [] } ], "serial_ports": [ diff --git a/docs/scripts/fc_doc_generator/metadata/px4_fmu-v5x_data.json b/docs/scripts/fc_doc_generator/metadata/px4_fmu-v5x_data.json index f821d6cb8f..9f65ebb07e 100644 --- a/docs/scripts/fc_doc_generator/metadata/px4_fmu-v5x_data.json +++ b/docs/scripts/fc_doc_generator/metadata/px4_fmu-v5x_data.json @@ -65,6 +65,20 @@ ], "bdshot_outputs": [], "bdshot_output_only": [] + }, + { + "group": 4, + "timer": "Timer5", + "outputs": [ + 9 + ], + "dshot": false, + "dshot_outputs": [], + "non_dshot_outputs": [ + 9 + ], + "bdshot_outputs": [], + "bdshot_output_only": [] } ], "serial_ports": [ diff --git a/docs/scripts/fc_doc_generator/metadata/px4_fmu-v6u_data.json b/docs/scripts/fc_doc_generator/metadata/px4_fmu-v6u_data.json index 59d4a5edf8..2cb466796f 100644 --- a/docs/scripts/fc_doc_generator/metadata/px4_fmu-v6u_data.json +++ b/docs/scripts/fc_doc_generator/metadata/px4_fmu-v6u_data.json @@ -65,6 +65,20 @@ ], "bdshot_outputs": [], "bdshot_output_only": [] + }, + { + "group": 4, + "timer": "Timer1", + "outputs": [ + 9 + ], + "dshot": false, + "dshot_outputs": [], + "non_dshot_outputs": [ + 9 + ], + "bdshot_outputs": [], + "bdshot_output_only": [] } ], "serial_ports": [ diff --git a/docs/scripts/fc_doc_generator/metadata/px4_fmu-v6x_data.json b/docs/scripts/fc_doc_generator/metadata/px4_fmu-v6x_data.json index c04bb6cbaf..ed3bfb5652 100644 --- a/docs/scripts/fc_doc_generator/metadata/px4_fmu-v6x_data.json +++ b/docs/scripts/fc_doc_generator/metadata/px4_fmu-v6x_data.json @@ -65,6 +65,20 @@ ], "bdshot_outputs": [], "bdshot_output_only": [] + }, + { + "group": 4, + "timer": "Timer1", + "outputs": [ + 9 + ], + "dshot": false, + "dshot_outputs": [], + "non_dshot_outputs": [ + 9 + ], + "bdshot_outputs": [], + "bdshot_output_only": [] } ], "serial_ports": [ diff --git a/docs/scripts/fc_doc_generator/metadata/svehicle_e2_data.json b/docs/scripts/fc_doc_generator/metadata/svehicle_e2_data.json index c26b779b1b..5ffca3cc19 100644 --- a/docs/scripts/fc_doc_generator/metadata/svehicle_e2_data.json +++ b/docs/scripts/fc_doc_generator/metadata/svehicle_e2_data.json @@ -65,6 +65,20 @@ ], "bdshot_outputs": [], "bdshot_output_only": [] + }, + { + "group": 4, + "timer": "Timer1", + "outputs": [ + 9 + ], + "dshot": false, + "dshot_outputs": [], + "non_dshot_outputs": [ + 9 + ], + "bdshot_outputs": [], + "bdshot_output_only": [] } ], "serial_ports": [ diff --git a/docs/scripts/fc_doc_generator/metadata/zeroone_x6_data.json b/docs/scripts/fc_doc_generator/metadata/zeroone_x6_data.json index b4d6fce0dd..e45c02959a 100644 --- a/docs/scripts/fc_doc_generator/metadata/zeroone_x6_data.json +++ b/docs/scripts/fc_doc_generator/metadata/zeroone_x6_data.json @@ -65,6 +65,20 @@ ], "bdshot_outputs": [], "bdshot_output_only": [] + }, + { + "group": 4, + "timer": "Timer1", + "outputs": [ + 9 + ], + "dshot": false, + "dshot_outputs": [], + "non_dshot_outputs": [ + 9 + ], + "bdshot_outputs": [], + "bdshot_output_only": [] } ], "serial_ports": [ diff --git a/docs/scripts/fc_doc_generator/tests/conftest.py b/docs/scripts/fc_doc_generator/tests/conftest.py index 6c281746ba..ec1e3a3a27 100644 --- a/docs/scripts/fc_doc_generator/tests/conftest.py +++ b/docs/scripts/fc_doc_generator/tests/conftest.py @@ -120,3 +120,9 @@ def board_stm32h7_variant(): def board_stm32h7_graceful_fail(): """STM32H7, graceful-fail pattern: BMI088 starts unconditionally AND in VD000000 block.""" return FIXTURES_DIR / "stm32h7_graceful_fail" + + +@pytest.fixture(scope="session") +def board_stm32h7_capture_channels(): + """STM32H7, 16 outputs: 8 regular (DShot) + 8 initIOTimerChannelCapture (no DShot).""" + return FIXTURES_DIR / "stm32h7_capture_channels" diff --git a/docs/scripts/fc_doc_generator/tests/fixtures/stm32h7_capture_channels/default.px4board b/docs/scripts/fc_doc_generator/tests/fixtures/stm32h7_capture_channels/default.px4board new file mode 100644 index 0000000000..0559c5dedd --- /dev/null +++ b/docs/scripts/fc_doc_generator/tests/fixtures/stm32h7_capture_channels/default.px4board @@ -0,0 +1 @@ +# minimal fixture for capture-channel parser test diff --git a/docs/scripts/fc_doc_generator/tests/fixtures/stm32h7_capture_channels/nuttx-config/nsh/defconfig b/docs/scripts/fc_doc_generator/tests/fixtures/stm32h7_capture_channels/nuttx-config/nsh/defconfig new file mode 100644 index 0000000000..1fdef3bc8c --- /dev/null +++ b/docs/scripts/fc_doc_generator/tests/fixtures/stm32h7_capture_channels/nuttx-config/nsh/defconfig @@ -0,0 +1,3 @@ +CONFIG_ARCH_CHIP_STM32H7=y +CONFIG_MMCSD=y +CONFIG_MMCSD_SDIO=y diff --git a/docs/scripts/fc_doc_generator/tests/fixtures/stm32h7_capture_channels/src/board_config.h b/docs/scripts/fc_doc_generator/tests/fixtures/stm32h7_capture_channels/src/board_config.h new file mode 100644 index 0000000000..15b4741a66 --- /dev/null +++ b/docs/scripts/fc_doc_generator/tests/fixtures/stm32h7_capture_channels/src/board_config.h @@ -0,0 +1,2 @@ +#define DIRECT_PWM_OUTPUT_CHANNELS 16 +#define BOARD_NUM_IO_TIMERS 5 diff --git a/docs/scripts/fc_doc_generator/tests/fixtures/stm32h7_capture_channels/src/timer_config.cpp b/docs/scripts/fc_doc_generator/tests/fixtures/stm32h7_capture_channels/src/timer_config.cpp new file mode 100644 index 0000000000..d1b5910d37 --- /dev/null +++ b/docs/scripts/fc_doc_generator/tests/fixtures/stm32h7_capture_channels/src/timer_config.cpp @@ -0,0 +1,36 @@ +#include + +/* Fixture modelling boards like cuav/x25-evo that use initIOTimerChannelCapture + * for their higher-numbered outputs. Timer5 and Timer4 have DMA (DShot); the + * remaining three timers do not. + */ + +constexpr io_timers_t io_timers[MAX_IO_TIMERS] = { + initIOTimer(Timer::Timer5, DMA{DMA::Index1}), + initIOTimer(Timer::Timer4, DMA{DMA::Index1}), + initIOTimer(Timer::Timer1), + initIOTimer(Timer::Timer8), + initIOTimer(Timer::Timer12), +}; + +constexpr timer_io_channels_t timer_io_channels[MAX_TIMER_IO_CHANNELS] = { + initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel4}, {}), + initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel3}, {}), + initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel2}, {}), + initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel1}, {}), + initIOTimerChannel(io_timers, {Timer::Timer4, Timer::Channel2}, {}), + initIOTimerChannel(io_timers, {Timer::Timer4, Timer::Channel3}, {}), + initIOTimerChannel(io_timers, {Timer::Timer4, Timer::Channel1}, {}), + initIOTimerChannel(io_timers, {Timer::Timer4, Timer::Channel4}, {}), + initIOTimerChannelCapture(io_timers, {Timer::Timer1, Timer::Channel2}, {}), + initIOTimerChannelCapture(io_timers, {Timer::Timer1, Timer::Channel1}, {}), + initIOTimerChannelCapture(io_timers, {Timer::Timer1, Timer::Channel3}, {}), + initIOTimerChannelCapture(io_timers, {Timer::Timer8, Timer::Channel2}, {}), + initIOTimerChannelCapture(io_timers, {Timer::Timer8, Timer::Channel3}, {}), + initIOTimerChannelCapture(io_timers, {Timer::Timer8, Timer::Channel1}, {}), + initIOTimerChannelCapture(io_timers, {Timer::Timer12, Timer::Channel1}, {}), + initIOTimerChannelCapture(io_timers, {Timer::Timer12, Timer::Channel2}, {}), +}; + +constexpr io_timers_channel_mapping_t io_timers_channel_mapping = + initIOTimerChannelMapping(io_timers, timer_io_channels); diff --git a/docs/scripts/fc_doc_generator/tests/snapshots/fc_sections.md b/docs/scripts/fc_doc_generator/tests/snapshots/fc_sections.md index 95f7ae2417..4ad9412e05 100644 --- a/docs/scripts/fc_doc_generator/tests/snapshots/fc_sections.md +++ b/docs/scripts/fc_doc_generator/tests/snapshots/fc_sections.md @@ -337,7 +337,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti ### Interfaces -- **PWM outputs**: 16 (8 FMU + 8 IO) +- **PWM outputs**: 17 (9 FMU + 8 IO) - **Serial ports**: 8 - **I2C ports**: 4 - ICP-20100 (barometer, internal) @@ -350,7 +350,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti - ICM-42688P (IMU) - **CAN buses**: 2 - **USB**: Yes -- **RC input**: PPM +- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST, PPM (via IO) - **Analog battery inputs**: 2 - **Additional analog inputs**: TODO: number of additional analog inputs - **Ethernet**: Yes @@ -375,7 +375,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti "chip_model": "STM32H753", "has_io_board": true, "total_outputs": 9, - "fmu_servo_outputs": 8, + "fmu_servo_outputs": 9, "io_outputs": 8, "has_sd_card": true, "has_ethernet": true, @@ -465,14 +465,15 @@ This flight controller supports up to 9 FMU PWM outputs (AUX) and 8 IO PWM outpu FMU Outputs: - Outputs 1-6 support [DShot](../peripherals/dshot.md). -- Outputs 7-8 do not support DShot. +- Outputs 7-9 do not support DShot. - Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). -The 9 outputs are in 3 groups: +The 9 outputs are in 4 groups: - Outputs 1-4 in group1 (Timer5) - Outputs 5-6 in group2 (Timer4) - Outputs 7-8 in group3 (Timer12) +- Output 9 in group4 (Timer1) All outputs within the same group must use the same output protocol and rate. ``` @@ -663,14 +664,15 @@ This flight controller supports up to 9 FMU PWM outputs (AUX) and 8 IO PWM outpu FMU Outputs: - Outputs 1-6 support [DShot](../peripherals/dshot.md). -- Outputs 7-8 do not support DShot. +- Outputs 7-9 do not support DShot. - Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). -The 9 outputs are in 3 groups: +The 9 outputs are in 4 groups: - Outputs 1-4 in group1 (Timer5) - Outputs 5-6 in group2 (Timer4) - Outputs 7-8 in group3 (Timer12) +- Output 9 in group4 (Timer1) All outputs within the same group must use the same output protocol and rate. --> @@ -1291,7 +1293,7 @@ Serial port mapping could not be determined from source. ### Interfaces -- **PWM outputs**: 16 (8 FMU + 8 IO) +- **PWM outputs**: 17 (9 FMU + 8 IO) - **Serial ports**: 8 - **I2C ports**: 4 - BMP388 (barometer, internal) @@ -1299,7 +1301,7 @@ Serial port mapping could not be determined from source. - **SPI buses**: 5 - **CAN buses**: 2 - **USB**: Yes -- **RC input**: DSM/SRXL2, S.Bus/CPPM +- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST, PPM (via IO) - **Analog battery inputs**: 2 - **Additional analog inputs**: TODO: number of additional analog inputs - **Ethernet**: Yes @@ -1324,7 +1326,7 @@ Serial port mapping could not be determined from source. "chip_model": "STM32H753", "has_io_board": true, "total_outputs": 9, - "fmu_servo_outputs": 8, + "fmu_servo_outputs": 9, "io_outputs": 8, "has_sd_card": true, "has_ethernet": true, @@ -1413,14 +1415,15 @@ This flight controller supports up to 9 FMU PWM outputs (AUX) and 8 IO PWM outpu FMU Outputs: - Outputs 1-6 support [DShot](../peripherals/dshot.md). -- Outputs 7-8 do not support DShot. +- Outputs 7-9 do not support DShot. - Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). -The 9 outputs are in 3 groups: +The 9 outputs are in 4 groups: - Outputs 1-4 in group1 (Timer5) - Outputs 5-6 in group2 (Timer4) - Outputs 7-8 in group3 (Timer12) +- Output 9 in group4 (Timer1) All outputs within the same group must use the same output protocol and rate. ``` @@ -1617,14 +1620,15 @@ This flight controller supports up to 9 FMU PWM outputs (AUX) and 8 IO PWM outpu FMU Outputs: - Outputs 1-6 support [DShot](../peripherals/dshot.md). -- Outputs 7-8 do not support DShot. +- Outputs 7-9 do not support DShot. - Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). -The 9 outputs are in 3 groups: +The 9 outputs are in 4 groups: - Outputs 1-4 in group1 (Timer5) - Outputs 5-6 in group2 (Timer4) - Outputs 7-8 in group3 (Timer12) +- Output 9 in group4 (Timer1) All outputs within the same group must use the same output protocol and rate. --> @@ -2616,7 +2620,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti ### Interfaces -- **PWM outputs**: 9 (FMU) +- **PWM outputs**: 10 (FMU) - **Serial ports**: 7 - **I2C ports**: 2 - BMP388 (barometer, internal, bus 4) @@ -2649,7 +2653,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti "chip_model": "STM32H743", "has_io_board": false, "total_outputs": 10, - "fmu_servo_outputs": 9, + "fmu_servo_outputs": 10, "io_outputs": 0, "has_sd_card": true, "has_ethernet": true, @@ -2732,14 +2736,15 @@ This flight controller supports up to 10 FMU PWM outputs (MAIN). Outputs: - Outputs 1-8 support [DShot](../peripherals/dshot.md). -- Output 9 does not support DShot. +- Outputs 9-10 do not support DShot. - Outputs 1-8 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). -The 10 outputs are in 3 groups: +The 10 outputs are in 4 groups: - Outputs 1-4 in group1 (Timer1) - Outputs 5-8 in group2 (Timer3) - Output 9 in group3 (Timer5) +- Output 10 in group4 (Timer8) All outputs within the same group must use the same output protocol and rate. ``` @@ -2933,7 +2938,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti ### Interfaces -- **PWM outputs**: 16 (8 FMU + 8 IO) +- **PWM outputs**: 17 (9 FMU + 8 IO) - **Serial ports**: 8 - **I2C ports**: 4 - BMP388 (barometer, internal) @@ -2946,7 +2951,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti - ICM-20602 (IMU) - **CAN buses**: 2 - **USB**: Yes -- **RC input**: DSM/SRXL2, S.Bus/CPPM +- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST, PPM (via IO) - **Analog battery inputs**: 2 - **Additional analog inputs**: TODO: number of additional analog inputs - **Ethernet**: Yes @@ -2970,7 +2975,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti "chip_model": "STM32H753", "has_io_board": true, "total_outputs": 9, - "fmu_servo_outputs": 8, + "fmu_servo_outputs": 9, "io_outputs": 8, "has_sd_card": true, "has_ethernet": true, @@ -3056,14 +3061,15 @@ This flight controller supports up to 9 FMU PWM outputs (AUX) and 8 IO PWM outpu FMU Outputs: - Outputs 1-6 support [DShot](../peripherals/dshot.md). -- Outputs 7-8 do not support DShot. +- Outputs 7-9 do not support DShot. - Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). -The 9 outputs are in 3 groups: +The 9 outputs are in 4 groups: - Outputs 1-4 in group1 (Timer5) - Outputs 5-6 in group2 (Timer4) - Outputs 7-8 in group3 (Timer12) +- Output 9 in group4 (Timer1) All outputs within the same group must use the same output protocol and rate. ``` @@ -4478,7 +4484,7 @@ All outputs within the same group must use the same output protocol and rate. ### Interfaces -- **PWM outputs**: 8 (FMU) +- **PWM outputs**: 14 (FMU) - **Serial ports**: 7 - **I2C ports**: 4 - ICP-20100 (barometer, internal) @@ -4514,7 +4520,7 @@ All outputs within the same group must use the same output protocol and rate. "chip_model": "STM32H753", "has_io_board": false, "total_outputs": 14, - "fmu_servo_outputs": 8, + "fmu_servo_outputs": 14, "io_outputs": 0, "has_sd_card": true, "has_ethernet": true, @@ -4599,14 +4605,17 @@ This flight controller supports up to 14 FMU PWM outputs (MAIN). Outputs: - Outputs 1-6 support [DShot](../peripherals/dshot.md). -- Outputs 7-8 do not support DShot. +- Outputs 7-14 do not support DShot. - Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). -The 14 outputs are in 3 groups: +The 14 outputs are in 6 groups: - Outputs 1-4 in group1 (Timer5) - Outputs 5-6 in group2 (Timer4) - Outputs 7-8 in group3 (Timer1) +- Outputs 9-11 in group4 (Timer8) +- Output 12 in group5 (Timer15) +- Outputs 13-14 in group6 (Timer12) All outputs within the same group must use the same output protocol and rate. ``` @@ -4808,7 +4817,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti ### Interfaces -- **PWM outputs**: 16 (8 FMU + 8 IO) +- **PWM outputs**: 17 (9 FMU + 8 IO) - **Serial ports**: 8 - **I2C ports**: 4 - BMP581 (barometer, external, bus 2) @@ -4821,7 +4830,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti - ICM-45686 (IMU) - **CAN buses**: 2 - **USB**: Yes -- **RC input**: PPM +- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST, PPM (via IO) - **Analog battery inputs**: 2 - **Additional analog inputs**: TODO: number of additional analog inputs - **Ethernet**: Yes @@ -4846,7 +4855,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti "chip_model": "STM32H753", "has_io_board": true, "total_outputs": 9, - "fmu_servo_outputs": 8, + "fmu_servo_outputs": 9, "io_outputs": 8, "has_sd_card": true, "has_ethernet": true, @@ -4934,14 +4943,15 @@ This flight controller supports up to 9 FMU PWM outputs (AUX) and 8 IO PWM outpu FMU Outputs: - Outputs 1-6 support [DShot](../peripherals/dshot.md). -- Outputs 7-8 do not support DShot. +- Outputs 7-9 do not support DShot. - Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). -The 9 outputs are in 3 groups: +The 9 outputs are in 4 groups: - Outputs 1-4 in group1 (Timer5) - Outputs 5-6 in group2 (Timer4) - Outputs 7-8 in group3 (Timer12) +- Output 9 in group4 (Timer1) All outputs within the same group must use the same output protocol and rate. ``` @@ -5132,14 +5142,15 @@ This flight controller supports up to 9 FMU PWM outputs (AUX) and 8 IO PWM outpu FMU Outputs: - Outputs 1-6 support [DShot](../peripherals/dshot.md). -- Outputs 7-8 do not support DShot. +- Outputs 7-9 do not support DShot. - Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). -The 9 outputs are in 3 groups: +The 9 outputs are in 4 groups: - Outputs 1-4 in group1 (Timer5) - Outputs 5-6 in group2 (Timer4) - Outputs 7-8 in group3 (Timer12) +- Output 9 in group4 (Timer1) All outputs within the same group must use the same output protocol and rate. --> @@ -5526,7 +5537,7 @@ All outputs within the same group must use the same output protocol and rate. ### Interfaces -- **PWM outputs**: 8 (FMU) +- **PWM outputs**: 16 (FMU) - **Serial ports**: 8 - **I2C ports**: 4 - ICP-20100 (barometer, internal, bus 4) @@ -5562,7 +5573,7 @@ All outputs within the same group must use the same output protocol and rate. "chip_model": "STM32H743", "has_io_board": false, "total_outputs": 16, - "fmu_servo_outputs": 8, + "fmu_servo_outputs": 16, "io_outputs": 0, "has_sd_card": true, "has_ethernet": true, @@ -5648,13 +5659,17 @@ This flight controller supports up to 16 FMU PWM outputs (MAIN). Outputs: - Outputs 1-8 support [DShot](../peripherals/dshot.md). +- Outputs 9-16 do not support DShot. - Outputs 1-7 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). - Output 8 supports Bidirectional DShot output only (no eRPM capture). -The 16 outputs are in 2 groups: +The 16 outputs are in 5 groups: - Outputs 1-4 in group1 (Timer5) - Outputs 5-8 in group2 (Timer4) +- Outputs 9-11 in group3 (Timer1) +- Outputs 12-14 in group4 (Timer8) +- Outputs 15-16 in group5 (Timer12) All outputs within the same group must use the same output protocol and rate. ``` @@ -5841,13 +5856,17 @@ This flight controller supports up to 16 FMU PWM outputs (MAIN). Outputs: - Outputs 1-8 support [DShot](../peripherals/dshot.md). +- Outputs 9-16 do not support DShot. - Outputs 1-7 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). - Output 8 supports Bidirectional DShot output only (no eRPM capture). -The 16 outputs are in 2 groups: +The 16 outputs are in 5 groups: - Outputs 1-4 in group1 (Timer5) - Outputs 5-8 in group2 (Timer4) +- Outputs 9-11 in group3 (Timer1) +- Outputs 12-14 in group4 (Timer8) +- Outputs 15-16 in group5 (Timer12) All outputs within the same group must use the same output protocol and rate. --> @@ -5876,7 +5895,7 @@ All outputs within the same group must use the same output protocol and rate. ### Interfaces -- **PWM outputs**: 8 (FMU) +- **PWM outputs**: 16 (FMU) - **Serial ports**: 8 - **I2C ports**: 4 - ICP-20100 (barometer, internal, bus 4) @@ -5912,7 +5931,7 @@ All outputs within the same group must use the same output protocol and rate. "chip_model": "STM32H743", "has_io_board": false, "total_outputs": 16, - "fmu_servo_outputs": 8, + "fmu_servo_outputs": 16, "io_outputs": 0, "has_sd_card": true, "has_ethernet": true, @@ -5997,13 +6016,17 @@ This flight controller supports up to 16 FMU PWM outputs (MAIN). Outputs: - Outputs 1-8 support [DShot](../peripherals/dshot.md). +- Outputs 9-16 do not support DShot. - Outputs 1-7 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). - Output 8 supports Bidirectional DShot output only (no eRPM capture). -The 16 outputs are in 2 groups: +The 16 outputs are in 5 groups: - Outputs 1-4 in group1 (Timer5) - Outputs 5-8 in group2 (Timer4) +- Outputs 9-11 in group3 (Timer1) +- Outputs 12-14 in group4 (Timer8) +- Outputs 15-16 in group5 (Timer12) All outputs within the same group must use the same output protocol and rate. ``` @@ -6190,13 +6213,17 @@ This flight controller supports up to 16 FMU PWM outputs (MAIN). Outputs: - Outputs 1-8 support [DShot](../peripherals/dshot.md). +- Outputs 9-16 do not support DShot. - Outputs 1-7 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). - Output 8 supports Bidirectional DShot output only (no eRPM capture). -The 16 outputs are in 2 groups: +The 16 outputs are in 5 groups: - Outputs 1-4 in group1 (Timer5) - Outputs 5-8 in group2 (Timer4) +- Outputs 9-11 in group3 (Timer1) +- Outputs 12-14 in group4 (Timer8) +- Outputs 15-16 in group5 (Timer12) All outputs within the same group must use the same output protocol and rate. --> @@ -6596,6 +6623,7 @@ All outputs within the same group must use the same output protocol and rate. - MS5611 (barometer) - **CAN buses**: 2 - **USB**: Yes +- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST (via IO) - **Analog battery inputs**: 2 - **Additional analog inputs**: TODO: number of additional analog inputs @@ -6932,6 +6960,7 @@ All outputs within the same group must use the same output protocol and rate. - MS5611 (barometer) - **CAN buses**: 2 - **USB**: Yes +- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST (via IO) - **Analog battery inputs**: 2 - **Additional analog inputs**: TODO: number of additional analog inputs @@ -7270,6 +7299,7 @@ All outputs within the same group must use the same output protocol and rate. - MS5611 (barometer) - **CAN buses**: 2 - **USB**: Yes +- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST (via IO) - **Analog battery inputs**: 2 - **Additional analog inputs**: TODO: number of additional analog inputs @@ -9642,7 +9672,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti ### Interfaces -- **PWM outputs**: 13 (5 FMU + 8 IO) +- **PWM outputs**: 18 (10 FMU + 8 IO) - **Serial ports**: 7 - **I2C ports**: 4 - IST8310 (magnetometer, internal) @@ -9652,6 +9682,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti - MS5611 (barometer) - **CAN buses**: 2 - **USB**: Yes +- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST (via IO) - **Analog battery inputs**: 2 - **Additional analog inputs**: TODO: number of additional analog inputs @@ -9675,7 +9706,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti "chip_model": "STM32H743", "has_io_board": true, "total_outputs": 10, - "fmu_servo_outputs": 5, + "fmu_servo_outputs": 10, "io_outputs": 8, "has_sd_card": true, "has_ethernet": false, @@ -9758,12 +9789,18 @@ For battery and power module configuration see [Battery and Power Module Setup]( This flight controller supports up to 10 FMU PWM outputs (AUX) and 8 IO PWM outputs (MAIN). -All FMU outputs support [DShot](../peripherals/dshot.md) and [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). +FMU Outputs: -The 10 outputs are in 2 groups: +- Outputs 1-5 support [DShot](../peripherals/dshot.md). +- Outputs 6-10 do not support DShot. +- Outputs 1-5 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). + +The 10 outputs are in 4 groups: - Outputs 1-4 in group1 (Timer1) - Output 5 in group2 (Timer4) +- Outputs 6-8 in group3 (Timer2) +- Outputs 9-10 in group4 (Timer12) All outputs within the same group must use the same output protocol and rate. ``` @@ -9945,12 +9982,18 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti This flight controller supports up to 10 FMU PWM outputs (AUX) and 8 IO PWM outputs (MAIN). -All FMU outputs support [DShot](../peripherals/dshot.md) and [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). +FMU Outputs: -The 10 outputs are in 2 groups: +- Outputs 1-5 support [DShot](../peripherals/dshot.md). +- Outputs 6-10 do not support DShot. +- Outputs 1-5 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). + +The 10 outputs are in 4 groups: - Outputs 1-4 in group1 (Timer1) - Output 5 in group2 (Timer4) +- Outputs 6-8 in group3 (Timer2) +- Outputs 9-10 in group4 (Timer12) All outputs within the same group must use the same output protocol and rate. --> @@ -11970,7 +12013,7 @@ All outputs within the same group must use the same output protocol and rate. ### Interfaces -- **PWM outputs**: 16 (8 FMU + 8 IO) +- **PWM outputs**: 19 (11 FMU + 8 IO) - **Serial ports**: 7 - **I2C ports**: 4 - IST8310 (magnetometer, internal) @@ -11982,7 +12025,7 @@ All outputs within the same group must use the same output protocol and rate. - MS5611 (barometer) - **CAN buses**: 3 - **USB**: Yes -- **RC input**: PPM +- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST, PPM (via IO) - **Analog battery inputs**: 2 - **Additional analog inputs**: TODO: number of additional analog inputs @@ -12005,7 +12048,7 @@ All outputs within the same group must use the same output protocol and rate. "chip_model": "STM32F765", "has_io_board": true, "total_outputs": 11, - "fmu_servo_outputs": 8, + "fmu_servo_outputs": 11, "io_outputs": 8, "has_sd_card": true, "has_ethernet": false, @@ -12091,14 +12134,15 @@ This flight controller supports up to 11 FMU PWM outputs (AUX) and 8 IO PWM outp FMU Outputs: - Outputs 1-4 support [DShot](../peripherals/dshot.md). -- Outputs 5-8 do not support DShot. +- Outputs 5-11 do not support DShot. - Outputs 1-4 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). -The 11 outputs are in 3 groups: +The 11 outputs are in 4 groups: - Outputs 1-4 in group1 (Timer1) - Outputs 5-6 in group2 (Timer4) - Outputs 7-8 in group3 (Timer12) +- Outputs 9-11 in group4 (Timer2) All outputs within the same group must use the same output protocol and rate. ``` @@ -12283,14 +12327,15 @@ This flight controller supports up to 11 FMU PWM outputs (AUX) and 8 IO PWM outp FMU Outputs: - Outputs 1-4 support [DShot](../peripherals/dshot.md). -- Outputs 5-8 do not support DShot. +- Outputs 5-11 do not support DShot. - Outputs 1-4 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). -The 11 outputs are in 3 groups: +The 11 outputs are in 4 groups: - Outputs 1-4 in group1 (Timer1) - Outputs 5-6 in group2 (Timer4) - Outputs 7-8 in group3 (Timer12) +- Outputs 9-11 in group4 (Timer2) All outputs within the same group must use the same output protocol and rate. --> @@ -15173,7 +15218,7 @@ All outputs within the same group must use the same output protocol and rate. - ICM-42688P (IMU) - **CAN buses**: 1 - **USB**: Yes -- **RC input**: PPM +- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST, PPM (via IO) - **Analog battery inputs**: 1 - **Additional analog inputs**: TODO: number of additional analog inputs @@ -17683,6 +17728,7 @@ All outputs within the same group must use the same output protocol and rate. - MPU-9250 (IMU) - MS5611 (barometer) - **USB**: Yes +- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST (via IO) - **Analog battery inputs**: 1 - **Additional analog inputs**: TODO: number of additional analog inputs @@ -17990,6 +18036,7 @@ All outputs within the same group must use the same output protocol and rate. - MPU-9250 (IMU) - MS5611 (barometer) - **USB**: Yes +- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST (via IO) - **Analog battery inputs**: 1 - **Additional analog inputs**: TODO: number of additional analog inputs @@ -20816,6 +20863,7 @@ All outputs within the same group must use the same output protocol and rate. - MS5611 (barometer) - HMC5883L (magnetometer) - **USB**: Yes +- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST (via IO) - **Analog battery inputs**: 1 - **Additional analog inputs**: TODO: number of additional analog inputs @@ -21122,6 +21170,7 @@ All outputs within the same group must use the same output protocol and rate. - MS5611 (barometer) - HMC5883L (magnetometer) - **USB**: Yes +- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST (via IO) - **Analog battery inputs**: 1 - **Additional analog inputs**: TODO: number of additional analog inputs @@ -21728,7 +21777,7 @@ All outputs within the same group must use the same output protocol and rate. - MS5611 (barometer) - LIS3MDL (magnetometer) - **USB**: Yes -- **RC input**: PPM +- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST, PPM (via IO) - **Analog battery inputs**: 2 - **Additional analog inputs**: TODO: number of additional analog inputs @@ -22032,7 +22081,7 @@ All outputs within the same group must use the same output protocol and rate. ### Interfaces -- **PWM outputs**: 16 (8 FMU + 8 IO) +- **PWM outputs**: 19 (11 FMU + 8 IO) - **Serial ports**: 7 - **I2C ports**: 4 - IST8310 (magnetometer, internal) @@ -22043,7 +22092,7 @@ All outputs within the same group must use the same output protocol and rate. - MS5611 (barometer) - **CAN buses**: 3 - **USB**: Yes -- **RC input**: DSM/SRXL2, S.Bus/CPPM +- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST, PPM (via IO) - **Analog battery inputs**: 2 - **Additional analog inputs**: TODO: number of additional analog inputs @@ -22067,7 +22116,7 @@ All outputs within the same group must use the same output protocol and rate. "chip_model": "STM32F765", "has_io_board": true, "total_outputs": 11, - "fmu_servo_outputs": 8, + "fmu_servo_outputs": 11, "io_outputs": 8, "has_sd_card": true, "has_ethernet": false, @@ -22154,14 +22203,15 @@ This flight controller supports up to 11 FMU PWM outputs (AUX) and 8 IO PWM outp FMU Outputs: - Outputs 1-4 support [DShot](../peripherals/dshot.md). -- Outputs 5-8 do not support DShot. +- Outputs 5-11 do not support DShot. - Outputs 1-4 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). -The 11 outputs are in 3 groups: +The 11 outputs are in 4 groups: - Outputs 1-4 in group1 (Timer1) - Outputs 5-6 in group2 (Timer4) - Outputs 7-8 in group3 (Timer12) +- Outputs 9-11 in group4 (Timer2) All outputs within the same group must use the same output protocol and rate. ``` @@ -22345,14 +22395,15 @@ This flight controller supports up to 11 FMU PWM outputs (AUX) and 8 IO PWM outp FMU Outputs: - Outputs 1-4 support [DShot](../peripherals/dshot.md). -- Outputs 5-8 do not support DShot. +- Outputs 5-11 do not support DShot. - Outputs 1-4 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). -The 11 outputs are in 3 groups: +The 11 outputs are in 4 groups: - Outputs 1-4 in group1 (Timer1) - Outputs 5-6 in group2 (Timer4) - Outputs 7-8 in group3 (Timer12) +- Outputs 9-11 in group4 (Timer2) All outputs within the same group must use the same output protocol and rate. --> @@ -22382,7 +22433,7 @@ All outputs within the same group must use the same output protocol and rate. ### Interfaces -- **PWM outputs**: 16 (8 FMU + 8 IO) +- **PWM outputs**: 17 (9 FMU + 8 IO) - **Serial ports**: 8 - **I2C ports**: 4 - BMM150 (magnetometer, internal) @@ -22392,7 +22443,7 @@ All outputs within the same group must use the same output protocol and rate. - ICM-20602 (IMU) - **CAN buses**: 2 - **USB**: Yes -- **RC input**: DSM/SRXL2, S.Bus/CPPM +- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST, PPM (via IO) - **Analog battery inputs**: 2 - **Additional analog inputs**: TODO: number of additional analog inputs - **Ethernet**: Yes @@ -22417,7 +22468,7 @@ All outputs within the same group must use the same output protocol and rate. "chip_model": "STM32F765", "has_io_board": true, "total_outputs": 9, - "fmu_servo_outputs": 8, + "fmu_servo_outputs": 9, "io_outputs": 8, "has_sd_card": true, "has_ethernet": true, @@ -22508,14 +22559,15 @@ This flight controller supports up to 9 FMU PWM outputs (AUX) and 8 IO PWM outpu FMU Outputs: - Outputs 1-6 support [DShot](../peripherals/dshot.md). -- Outputs 7-8 do not support DShot. +- Outputs 7-9 do not support DShot. - Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). -The 9 outputs are in 3 groups: +The 9 outputs are in 4 groups: - Outputs 1-4 in group1 (Timer1) - Outputs 5-6 in group2 (Timer4) - Outputs 7-8 in group3 (Timer12) +- Output 9 in group4 (Timer5) All outputs within the same group must use the same output protocol and rate. ``` @@ -22711,14 +22763,15 @@ This flight controller supports up to 9 FMU PWM outputs (AUX) and 8 IO PWM outpu FMU Outputs: - Outputs 1-6 support [DShot](../peripherals/dshot.md). -- Outputs 7-8 do not support DShot. +- Outputs 7-9 do not support DShot. - Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). -The 9 outputs are in 3 groups: +The 9 outputs are in 4 groups: - Outputs 1-4 in group1 (Timer1) - Outputs 5-6 in group2 (Timer4) - Outputs 7-8 in group3 (Timer12) +- Output 9 in group4 (Timer5) All outputs within the same group must use the same output protocol and rate. --> @@ -22758,6 +22811,7 @@ All outputs within the same group must use the same output protocol and rate. - ICM-42688P (IMU) - **CAN buses**: 2 - **USB**: Yes +- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST (via IO) - **Analog battery inputs**: 2 - **Additional analog inputs**: TODO: number of additional analog inputs @@ -23097,7 +23151,7 @@ All outputs within the same group must use the same output protocol and rate. ### Interfaces -- **PWM outputs**: 8 (FMU) +- **PWM outputs**: 9 (FMU) - **Serial ports**: 8 - **I2C ports**: 4 - BMP388 (barometer, internal) @@ -23132,7 +23186,7 @@ All outputs within the same group must use the same output protocol and rate. "chip_model": "STM32H753", "has_io_board": false, "total_outputs": 9, - "fmu_servo_outputs": 8, + "fmu_servo_outputs": 9, "io_outputs": 0, "has_sd_card": true, "has_ethernet": false, @@ -23218,14 +23272,15 @@ This flight controller supports up to 9 FMU PWM outputs (MAIN). Outputs: - Outputs 1-6 support [DShot](../peripherals/dshot.md). -- Outputs 7-8 do not support DShot. +- Outputs 7-9 do not support DShot. - Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). -The 9 outputs are in 3 groups: +The 9 outputs are in 4 groups: - Outputs 1-4 in group1 (Timer5) - Outputs 5-6 in group2 (Timer4) - Outputs 7-8 in group3 (Timer12) +- Output 9 in group4 (Timer1) All outputs within the same group must use the same output protocol and rate. ``` @@ -23413,14 +23468,15 @@ This flight controller supports up to 9 FMU PWM outputs (MAIN). Outputs: - Outputs 1-6 support [DShot](../peripherals/dshot.md). -- Outputs 7-8 do not support DShot. +- Outputs 7-9 do not support DShot. - Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). -The 9 outputs are in 3 groups: +The 9 outputs are in 4 groups: - Outputs 1-4 in group1 (Timer5) - Outputs 5-6 in group2 (Timer4) - Outputs 7-8 in group3 (Timer12) +- Output 9 in group4 (Timer1) All outputs within the same group must use the same output protocol and rate. --> @@ -23450,14 +23506,14 @@ All outputs within the same group must use the same output protocol and rate. ### Interfaces -- **PWM outputs**: 16 (8 FMU + 8 IO) +- **PWM outputs**: 17 (9 FMU + 8 IO) - **Serial ports**: 8 - **I2C ports**: 4 - IST8310 (magnetometer, external, bus 1) - **SPI buses**: 5 - **CAN buses**: 2 - **USB**: Yes -- **RC input**: DSM/SRXL2, S.Bus/CPPM +- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST, PPM (via IO) - **Analog battery inputs**: 2 - **Additional analog inputs**: TODO: number of additional analog inputs - **Ethernet**: Yes @@ -23482,7 +23538,7 @@ All outputs within the same group must use the same output protocol and rate. "chip_model": "STM32H753", "has_io_board": true, "total_outputs": 9, - "fmu_servo_outputs": 8, + "fmu_servo_outputs": 9, "io_outputs": 8, "has_sd_card": true, "has_ethernet": true, @@ -23574,14 +23630,15 @@ This flight controller supports up to 9 FMU PWM outputs (AUX) and 8 IO PWM outpu FMU Outputs: - Outputs 1-6 support [DShot](../peripherals/dshot.md). -- Outputs 7-8 do not support DShot. +- Outputs 7-9 do not support DShot. - Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). -The 9 outputs are in 3 groups: +The 9 outputs are in 4 groups: - Outputs 1-4 in group1 (Timer5) - Outputs 5-6 in group2 (Timer4) - Outputs 7-8 in group3 (Timer12) +- Output 9 in group4 (Timer1) All outputs within the same group must use the same output protocol and rate. ``` @@ -23777,14 +23834,15 @@ This flight controller supports up to 9 FMU PWM outputs (AUX) and 8 IO PWM outpu FMU Outputs: - Outputs 1-6 support [DShot](../peripherals/dshot.md). -- Outputs 7-8 do not support DShot. +- Outputs 7-9 do not support DShot. - Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). -The 9 outputs are in 3 groups: +The 9 outputs are in 4 groups: - Outputs 1-4 in group1 (Timer5) - Outputs 5-6 in group2 (Timer4) - Outputs 7-8 in group3 (Timer12) +- Output 9 in group4 (Timer1) All outputs within the same group must use the same output protocol and rate. --> @@ -23822,7 +23880,7 @@ All outputs within the same group must use the same output protocol and rate. - IST8310 (magnetometer, external, bus 1) - **SPI buses**: 4 - **USB**: TODO: confirm USB connector type -- **RC input**: DSM/SRXL2, S.Bus/CPPM +- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST, PPM (via IO) - **Analog battery inputs**: 2 - **Additional analog inputs**: TODO: number of additional analog inputs - **Ethernet**: Yes @@ -24460,7 +24518,7 @@ Serial port mapping could not be determined from source. - BMI088 (IMU) - **CAN buses**: 2 - **USB**: Yes -- **RC input**: DSM/SRXL2, S.Bus +- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST (via IO) - **Analog battery inputs**: 1 - **Additional analog inputs**: TODO: number of additional analog inputs @@ -25072,6 +25130,7 @@ Serial port mapping could not be determined from source. - MS5611 (barometer) - **CAN buses**: 1 - **USB**: Yes +- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST (via IO) - **Analog battery inputs**: 1 - **Additional analog inputs**: TODO: number of additional analog inputs @@ -25385,7 +25444,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti - MPU-9250 (IMU) - **CAN buses**: 2 - **USB**: Yes -- **RC input**: PPM +- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST, PPM (via IO) - **Analog battery inputs**: 1 - **Additional analog inputs**: TODO: number of additional analog inputs - **Ethernet**: Yes @@ -26044,7 +26103,7 @@ All outputs within the same group must use the same output protocol and rate. ### Interfaces -- **PWM outputs**: 16 (8 FMU + 8 IO) +- **PWM outputs**: 17 (9 FMU + 8 IO) - **Serial ports**: 8 - **I2C ports**: 4 - ICP-20100 (barometer, external) @@ -26057,7 +26116,7 @@ All outputs within the same group must use the same output protocol and rate. - ICM-20649 (IMU) - **CAN buses**: 2 - **USB**: Yes -- **RC input**: DSM/SRXL2, S.Bus/CPPM +- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST, PPM (via IO) - **Analog battery inputs**: 2 - **Additional analog inputs**: TODO: number of additional analog inputs - **Ethernet**: Yes @@ -26082,7 +26141,7 @@ All outputs within the same group must use the same output protocol and rate. "chip_model": "STM32H753", "has_io_board": true, "total_outputs": 9, - "fmu_servo_outputs": 8, + "fmu_servo_outputs": 9, "io_outputs": 8, "has_sd_card": true, "has_ethernet": true, @@ -26172,14 +26231,15 @@ This flight controller supports up to 9 FMU PWM outputs (AUX) and 8 IO PWM outpu FMU Outputs: - Outputs 1-6 support [DShot](../peripherals/dshot.md). -- Outputs 7-8 do not support DShot. +- Outputs 7-9 do not support DShot. - Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). -The 9 outputs are in 3 groups: +The 9 outputs are in 4 groups: - Outputs 1-4 in group1 (Timer5) - Outputs 5-6 in group2 (Timer4) - Outputs 7-8 in group3 (Timer12) +- Output 9 in group4 (Timer1) All outputs within the same group must use the same output protocol and rate. ``` @@ -26370,14 +26430,15 @@ This flight controller supports up to 9 FMU PWM outputs (AUX) and 8 IO PWM outpu FMU Outputs: - Outputs 1-6 support [DShot](../peripherals/dshot.md). -- Outputs 7-8 do not support DShot. +- Outputs 7-9 do not support DShot. - Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). -The 9 outputs are in 3 groups: +The 9 outputs are in 4 groups: - Outputs 1-4 in group1 (Timer5) - Outputs 5-6 in group2 (Timer4) - Outputs 7-8 in group3 (Timer12) +- Output 9 in group4 (Timer1) All outputs within the same group must use the same output protocol and rate. --> @@ -26414,6 +26475,7 @@ All outputs within the same group must use the same output protocol and rate. - MPU-9250 (IMU) - MS5611 (barometer) - **USB**: Yes +- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST (via IO) - **Analog battery inputs**: 1 - **Additional analog inputs**: TODO: number of additional analog inputs @@ -26715,6 +26777,7 @@ All outputs within the same group must use the same output protocol and rate. - MPU-9250 (IMU) - MS5611 (barometer) - **USB**: Yes +- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST (via IO) - **Analog battery inputs**: 1 - **Additional analog inputs**: TODO: number of additional analog inputs @@ -27301,7 +27364,7 @@ Serial port mapping could not be determined from source. - BMI270 (IMU) - **CAN buses**: 2 - **USB**: Yes -- **RC input**: DSM/SRXL2, S.Bus +- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST (via IO) - **Analog battery inputs**: 1 - **Additional analog inputs**: TODO: number of additional analog inputs @@ -28580,7 +28643,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti ### Interfaces -- **PWM outputs**: 16 (8 FMU + 8 IO) +- **PWM outputs**: 17 (9 FMU + 8 IO) - **Serial ports**: 8 - **I2C ports**: 4 - ICP-20100 (barometer, internal) @@ -28591,7 +28654,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti - **SPI buses**: 5 - **CAN buses**: 2 - **USB**: Yes -- **RC input**: PPM +- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST, PPM (via IO) - **Analog battery inputs**: 2 - **Additional analog inputs**: TODO: number of additional analog inputs - **Ethernet**: Yes @@ -28616,7 +28679,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti "chip_model": "STM32H753", "has_io_board": true, "total_outputs": 9, - "fmu_servo_outputs": 8, + "fmu_servo_outputs": 9, "io_outputs": 8, "has_sd_card": true, "has_ethernet": true, @@ -28701,14 +28764,15 @@ This flight controller supports up to 9 FMU PWM outputs (AUX) and 8 IO PWM outpu FMU Outputs: - Outputs 1-6 support [DShot](../peripherals/dshot.md). -- Outputs 7-8 do not support DShot. +- Outputs 7-9 do not support DShot. - Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). -The 9 outputs are in 3 groups: +The 9 outputs are in 4 groups: - Outputs 1-4 in group1 (Timer5) - Outputs 5-6 in group2 (Timer4) - Outputs 7-8 in group3 (Timer12) +- Output 9 in group4 (Timer1) All outputs within the same group must use the same output protocol and rate. ``` diff --git a/docs/scripts/fc_doc_generator/tests/snapshots/pwm_stm32h7_capture_channels.md b/docs/scripts/fc_doc_generator/tests/snapshots/pwm_stm32h7_capture_channels.md new file mode 100644 index 0000000000..bb60990b9f --- /dev/null +++ b/docs/scripts/fc_doc_generator/tests/snapshots/pwm_stm32h7_capture_channels.md @@ -0,0 +1,20 @@ +## PWM Outputs {#pwm_outputs} + +This flight controller supports up to 16 FMU PWM outputs (MAIN). + +Outputs: + +- Outputs 1-8 support [DShot](../peripherals/dshot.md). +- Outputs 9-16 do not support DShot. +- Outputs 1-7 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry). +- Output 8 supports Bidirectional DShot output only (no eRPM capture). + +The 16 outputs are in 5 groups: + +- Outputs 1-4 in group1 (Timer5) +- Outputs 5-8 in group2 (Timer4) +- Outputs 9-11 in group3 (Timer1) +- Outputs 12-14 in group4 (Timer8) +- Outputs 15-16 in group5 (Timer12) + +All outputs within the same group must use the same output protocol and rate. \ No newline at end of file diff --git a/docs/scripts/fc_doc_generator/tests/test_compute.py b/docs/scripts/fc_doc_generator/tests/test_compute.py index 813459eabc..eecac1d1d3 100644 --- a/docs/scripts/fc_doc_generator/tests/test_compute.py +++ b/docs/scripts/fc_doc_generator/tests/test_compute.py @@ -148,3 +148,45 @@ class TestComputeBdshot: groups = fcdg.compute_groups(timers, channels) groups = fcdg.compute_bdshot(groups, channels, "unknown") assert all(g["bdshot_outputs"] == [] for g in groups) + + def test_capture_channel_no_bdshot_on_no_dma_timers(self, board_stm32h7_capture_channels): + # Timer1/Timer8/Timer12 have no DMA → dshot=False → bdshot=False + timers, channels = _parse(board_stm32h7_capture_channels) + groups = fcdg.compute_groups(timers, channels) + groups = fcdg.compute_bdshot(groups, channels, "stm32h7") + for g in groups: + if g["timer"] in ("Timer1", "Timer8", "Timer12"): + assert g["dshot"] is False + assert g["bdshot"] is False + assert g["bdshot_outputs"] == [] + + +class TestComputeGroupsCapture: + def test_capture_group_count(self, board_stm32h7_capture_channels): + timers, channels = _parse(board_stm32h7_capture_channels) + groups = fcdg.compute_groups(timers, channels) + assert len(groups) == 5 + + def test_capture_total_outputs(self, board_stm32h7_capture_channels): + timers, channels = _parse(board_stm32h7_capture_channels) + groups = fcdg.compute_groups(timers, channels) + all_outputs = sorted(o for g in groups for o in g["outputs"]) + assert all_outputs == list(range(1, 17)) + + def test_capture_dshot_only_on_dma_timers(self, board_stm32h7_capture_channels): + timers, channels = _parse(board_stm32h7_capture_channels) + groups = fcdg.compute_groups(timers, channels) + dshot_groups = {g["timer"] for g in groups if g["dshot"]} + assert dshot_groups == {"Timer5", "Timer4"} + non_dshot_groups = {g["timer"] for g in groups if not g["dshot"]} + assert non_dshot_groups == {"Timer1", "Timer8", "Timer12"} + + def test_capture_timer_group_memberships(self, board_stm32h7_capture_channels): + timers, channels = _parse(board_stm32h7_capture_channels) + groups = fcdg.compute_groups(timers, channels) + by_timer = {g["timer"]: g["outputs"] for g in groups} + assert by_timer["Timer5"] == [1, 2, 3, 4] + assert by_timer["Timer4"] == [5, 6, 7, 8] + assert by_timer["Timer1"] == [9, 10, 11] + assert by_timer["Timer8"] == [12, 13, 14] + assert by_timer["Timer12"] == [15, 16] diff --git a/docs/scripts/fc_doc_generator/tests/test_generators.py b/docs/scripts/fc_doc_generator/tests/test_generators.py index 7c21d1a73f..62f1471392 100644 --- a/docs/scripts/fc_doc_generator/tests/test_generators.py +++ b/docs/scripts/fc_doc_generator/tests/test_generators.py @@ -107,6 +107,29 @@ def _entry_imxrt(): } +def _entry_stm32h7_capture_channels(): + """16 outputs: 8 with DShot (Timer5/Timer4) + 8 capture-only (Timer1/Timer8/Timer12).""" + return { + "has_io_board": False, "total_outputs": 16, "io_outputs": 0, + "serial_ports": [], + "has_rc_input": False, "has_common_rc": False, "rc_serial_device": None, + "has_ppm_pin": False, "ppm_shared_with_rc_serial": False, + "has_pps_capture": False, "has_safety_switch": False, "has_safety_led": False, + "has_buzzer": False, + "num_power_inputs": 1, "has_redundant_power": False, + "has_dual_battery_monitoring": False, "has_dronecan_power_input": False, + "power_monitor_type": "analog", "has_sd_card": True, + "rc_ports_wizard": None, "gps_ports_wizard": None, "power_ports_wizard": None, + "groups": [ + _group(1, "Timer5", [1, 2, 3, 4], bdshot_outputs=[1, 2, 3, 4]), + _group(2, "Timer4", [5, 6, 7, 8], bdshot_outputs=[5, 6, 7], bdshot_output_only=[8]), + _group(3, "Timer1", [9, 10, 11], dshot=False), + _group(4, "Timer8", [12, 13, 14], dshot=False), + _group(5, "Timer12", [15, 16], dshot=False), + ], + } + + def _entry_stm32f4_no_dshot(): return { "has_io_board": False, "total_outputs": 6, "io_outputs": 0, @@ -151,6 +174,10 @@ class TestGeneratePwmSection: result = fcdg.generate_pwm_section(BOARD_KEY, _entry_imxrt()) snapshot("pwm_imxrt_all_dshot.md", result) + def test_stm32h7_capture_channels(self, snapshot): + result = fcdg.generate_pwm_section(BOARD_KEY, _entry_stm32h7_capture_channels()) + snapshot("pwm_stm32h7_capture_channels.md", result) + def test_stm32f4_no_dshot(self, snapshot): result = fcdg.generate_pwm_section(BOARD_KEY, _entry_stm32f4_no_dshot()) snapshot("pwm_stm32f4_no_dshot.md", result) diff --git a/docs/scripts/fc_doc_generator/tests/test_parsers.py b/docs/scripts/fc_doc_generator/tests/test_parsers.py index e94276dec5..97e5d52570 100644 --- a/docs/scripts/fc_doc_generator/tests/test_parsers.py +++ b/docs/scripts/fc_doc_generator/tests/test_parsers.py @@ -112,6 +112,24 @@ class TestParseTimerConfig: result = fcdg.parse_timer_config(board_imxrt) assert len(result["channels"]) == 8 + def test_capture_channel_count(self, board_stm32h7_capture_channels): + # 8 regular + 8 initIOTimerChannelCapture = 16 total + result = fcdg.parse_timer_config(board_stm32h7_capture_channels) + assert len(result["channels"]) == 16 + + def test_capture_channels_include_capture_timers(self, board_stm32h7_capture_channels): + result = fcdg.parse_timer_config(board_stm32h7_capture_channels) + timer_names = {ch["timer"] for ch in result["channels"]} + assert "Timer1" in timer_names + assert "Timer8" in timer_names + assert "Timer12" in timer_names + + def test_capture_channels_output_indices(self, board_stm32h7_capture_channels): + # All 16 outputs are numbered 1..16 in order + result = fcdg.parse_timer_config(board_stm32h7_capture_channels) + indices = [ch["output_index"] for ch in result["channels"]] + assert indices == list(range(1, 17)) + def test_stm32f4_no_dshot(self, board_stm32f4): result = fcdg.parse_timer_config(board_stm32f4) assert all(not t["dshot"] for t in result["timers"])