Files
inav/docs/development/msp/get_all_inav_enums_h.py
admin dac37fd077
Make sure docs are updated / settings_md (push) Canceled after 0s
Build firmware / test (push) Canceled after 0s
Build firmware / build-SITL-Windows (push) Canceled after 0s
Build firmware / build-SITL-Mac (push) Canceled after 0s
Build firmware / build-SITL-Linux (push) Canceled after 0s
Build firmware / build-SITL-Linux-arm64 (push) Canceled after 0s
Build firmware / upload-artifacts (push) Canceled after 0s
Build firmware / build-single-target (push) Canceled after 0s
Build firmware / build (9) (push) Canceled after 0s
Build firmware / build (8) (push) Canceled after 0s
Build firmware / build (7) (push) Canceled after 0s
Build firmware / build (6) (push) Canceled after 0s
Build firmware / build (5) (push) Canceled after 0s
Build firmware / build (4) (push) Canceled after 0s
Build firmware / build (3) (push) Canceled after 0s
Build firmware / build (2) (push) Canceled after 0s
Build firmware / build (14) (push) Canceled after 0s
Build firmware / build (13) (push) Canceled after 0s
Build firmware / build (12) (push) Canceled after 0s
Build firmware / build (11) (push) Canceled after 0s
Build firmware / build (10) (push) Canceled after 0s
Build firmware / build (1) (push) Canceled after 0s
Build firmware / build (0) (push) Canceled after 0s
Build firmware / detect (push) Canceled after 0s
Build pre-release / build (push) Canceled after 0s
Build pre-release / Release (push) Canceled after 0s
Sync inav to Gitea
2026-08-03 16:37:40 +08:00

122 lines
3.2 KiB
Python

#!/usr/bin/env python3
import argparse
import datetime
import re
from pathlib import Path
SUBDIRS = [
'common',
'blackbox',
'navigation',
'sensors',
'programming',
'rx',
'telemetry',
'io',
'flight',
'fc',
'drivers',
]
def strip_comments(text: str) -> str:
text = re.sub(r'/\*.*?\*/', '', text, flags=re.DOTALL) # block comments
text = re.sub(r'//.*', '', text) # line comments
return text
def extract_enums(fn: str, text: str):
src = strip_comments(text)
out = []
# typedef enum { ... } Alias;
i = 0
while True:
m = re.search(r'\btypedef\s+enum\b', src[i:])
if not m: break
start = i + m.start()
lb = src.find('{', i + m.end())
if lb == -1: break
depth = 0
k = lb
while k < len(src):
if src[k] == '{': depth += 1
elif src[k] == '}':
depth -= 1
if depth == 0:
semi = src.find(';', k)
if semi == -1: break
tail = src[k+1:semi]
alias = re.findall(r'\b([A-Za-z_]\w*)\b', tail)
if alias:
block = src[start:semi+1].strip()
out += [f'// {fn}\n', block + '\n\n']
i = semi + 1
break
k += 1
else:
break
# enum Tag { ... }; → also emit typedef enum Tag Tag;
i = 0
while True:
m = re.search(r'\benum\s+([A-Za-z_]\w*)\s*{', src[i:])
if not m: break
start = i + m.start()
tag = m.group(1)
lb = src.find('{', i + m.end() - 1)
if lb == -1: break
depth = 0
k = lb
while k < len(src):
if src[k] == '{': depth += 1
elif src[k] == '}':
depth -= 1
if depth == 0:
semi = src.find(';', k)
if semi == -1: break
block = src[start:semi+1].strip()
out += [
f'// {fn}\n',
block + '\n',
f'typedef enum {tag} {tag};\n\n'
]
i = semi + 1
break
k += 1
else:
break
return out
all_enums = []
def parse_args():
parser = argparse.ArgumentParser(description='Collect all enums from INAV sources.')
parser.add_argument(
'--inav-root',
default='../inav/src/main',
help="Path to the INAV 'src/main' directory (default: %(default)s)",
)
return parser.parse_args()
args = parse_args()
base_dir = Path(args.inav_root).expanduser()
for sd in SUBDIRS:
root = base_dir / sd
if not root.is_dir():
continue
for fn in root.rglob('*'):
print(fn)
if fn.suffix in ('.c', '.h'):
txt = fn.read_text(errors='ignore')
ret = extract_enums(fn, txt)
if ret: print(fn)
all_enums.extend(ret)
with open('all_enums.h', 'w') as out:
out.write(f"// Consolidated enums — generated on {datetime.datetime.now()}\n\n")
out.writelines(all_enums)
print(f"Found {len(all_enums)} enums. Wrote all_enums.h.")