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
122 lines
3.2 KiB
Python
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.")
|