mirror of
https://github.com/espressif/esp-idf.git
synced 2026-09-22 13:01:16 +03:00
refactor(esp_wifi): migrate regulatory tools to esp-pylib
Replace ad-hoc print/raise patterns in reg_parse.py and reg2fw.py with esp_pylib.logger log.warn/log.die and install_exception_reporting(). Signed-off-by: Chen Yudong <chenyudong@espressif.com>
This commit is contained in:
@@ -6,5 +6,5 @@
|
||||
`esp_wifi_regulatory.c` is generated from `esp_wifi_regulatory.txt` by using the `reg2fw.py` script.
|
||||
|
||||
- Generate `esp_wifi_regulatory.c`
|
||||
- `cd ~/esp-idf/components/esp_wifi/regulatory`
|
||||
- `python reg2fw.py`
|
||||
- `cd ${IDF_PATH}/components/esp_wifi/regulatory`
|
||||
- `python reg2fw.py`
|
||||
|
||||
@@ -5,8 +5,10 @@ import os
|
||||
from datetime import datetime
|
||||
from typing import TextIO
|
||||
|
||||
from esp_pylib.logger import log
|
||||
from reg_parse import DBParser
|
||||
from reg_parse import Regdomain
|
||||
from rich.markup import escape
|
||||
|
||||
# Not a valid ISO 3166-1 alpha-2 code; marks end of regdomain_table for linear scans (matches wifi_regdomain_t.cn[2]).
|
||||
REGDOMAIN_TABLE_SENTINEL_CC = '##'
|
||||
@@ -95,7 +97,7 @@ def main() -> None:
|
||||
mtime = os.path.getmtime(file_path)
|
||||
copyright_year = datetime.fromtimestamp(mtime).year
|
||||
except FileNotFoundError:
|
||||
raise Exception(f'File {file_path} not found')
|
||||
log.die(f'File {file_path} not found')
|
||||
|
||||
reg.simplify_countries(regdomains)
|
||||
reg.simplify_countries_2g(regdomains)
|
||||
@@ -111,11 +113,11 @@ def main() -> None:
|
||||
max_rules_count = max_rules_country[1]
|
||||
max_rules_countries = [cc for cc, count in country_rules_count.items() if count == max_rules_count]
|
||||
|
||||
print('\n=== Regulatory Statistics ===')
|
||||
print(f'Total supported countries: {total_countries}')
|
||||
print(f'Country(ies) with most rules: {", ".join(max_rules_countries)}')
|
||||
print(f'Maximum number of rules: {max_rules_count}')
|
||||
print('=' * 30 + '\n')
|
||||
log.print('\n=== Regulatory Statistics ===')
|
||||
log.print(f'Total supported countries: {total_countries}')
|
||||
log.print(f'Country(ies) with most rules: {", ".join(max_rules_countries)}')
|
||||
log.print(f'Maximum number of rules: {max_rules_count}')
|
||||
log.print('=' * 30 + '\n')
|
||||
|
||||
type_list = list(reg.typical_regulatory.keys())
|
||||
perm_list = list(reg.typical_regulatory.values())
|
||||
@@ -124,8 +126,9 @@ def main() -> None:
|
||||
perm_list_2g = list(reg.typical_regulatory_2g.values())
|
||||
|
||||
output_file = 'esp_wifi_regulatory.c'
|
||||
output_file_path = os.path.join(directory, output_file)
|
||||
|
||||
with open(output_file, 'w') as cfile:
|
||||
with open(output_file_path, 'w') as cfile:
|
||||
cfile.write('/*\n')
|
||||
cfile.write(f' * SPDX-FileCopyrightText: 2025-{copyright_year} Espressif Systems (Shanghai) CO LTD\n')
|
||||
cfile.write(' *\n')
|
||||
@@ -143,8 +146,11 @@ def main() -> None:
|
||||
write_regulatory_data(cfile, reg, type_list_2g, perm_list_2g, filter_5g=False)
|
||||
cfile.write('#endif // CONFIG_SOC_WIFI_SUPPORT_5G\n')
|
||||
|
||||
print(f'{output_file} generated successfully.')
|
||||
log.print(f'{escape(output_file)} generated successfully.')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
from esp_pylib.excepthook import install_exception_reporting
|
||||
|
||||
install_exception_reporting()
|
||||
main()
|
||||
|
||||
@@ -23,14 +23,15 @@
|
||||
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
import math
|
||||
import sys
|
||||
from collections import OrderedDict
|
||||
from collections import defaultdict
|
||||
from collections.abc import Callable
|
||||
from functools import total_ordering
|
||||
from math import ceil
|
||||
from typing import TextIO
|
||||
|
||||
from esp_pylib.logger import log
|
||||
from rich.markup import escape
|
||||
|
||||
flag_definitions: dict[str, int] = {
|
||||
'NO-OFDM': 1 << 0,
|
||||
'NO-CCK': 1 << 1,
|
||||
@@ -291,13 +292,8 @@ class Country:
|
||||
permissions_2g = property(_get_permissions_2g_tuple)
|
||||
|
||||
|
||||
class MySyntaxError(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class DBParser:
|
||||
def __init__(self, warn: Callable[[str], None] | None = None) -> None:
|
||||
self._warn_callout = warn or sys.stderr.write
|
||||
def __init__(self) -> None:
|
||||
self._lineno: int = 0
|
||||
self._comments: list[str] = []
|
||||
self._banddup: dict[str, str] = {}
|
||||
@@ -361,10 +357,10 @@ class DBParser:
|
||||
|
||||
def _syntax_error(self, txt: str | None = None) -> None:
|
||||
txt = f' ({txt})' if txt else ''
|
||||
raise MySyntaxError(f'Syntax error in line {self._lineno}{txt}')
|
||||
log.die(f'Syntax error in line {self._lineno}{escape(txt)}')
|
||||
|
||||
def _warn(self, txt: str) -> None:
|
||||
self._warn(f'Warning (line {self._lineno}): {txt}\n')
|
||||
log.warn(f'line {self._lineno}: {escape(txt)}')
|
||||
|
||||
def channel_to_freq(self, channel: int) -> int:
|
||||
if channel == 14:
|
||||
@@ -561,7 +557,10 @@ class DBParser:
|
||||
self._warn(f"country '{cname}' not alpha2")
|
||||
cname_bytes = cname.encode('ascii')
|
||||
if cname_bytes not in self._countries:
|
||||
self._countries[cname_bytes] = Country(dfs_region, comments=self._comments)
|
||||
try:
|
||||
self._countries[cname_bytes] = Country(dfs_region, comments=self._comments)
|
||||
except DFSRegionError as e:
|
||||
self._syntax_error(f'Invalid DFS region {e.dfs_region}')
|
||||
self._current_countries[cname_bytes] = self._countries[cname_bytes]
|
||||
self._comments = []
|
||||
|
||||
|
||||
Reference in New Issue
Block a user