diff --git a/components/esp_wifi/regulatory/README.md b/components/esp_wifi/regulatory/README.md index e078582a79b..5a3ea9d3f5a 100644 --- a/components/esp_wifi/regulatory/README.md +++ b/components/esp_wifi/regulatory/README.md @@ -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` \ No newline at end of file + - `cd ${IDF_PATH}/components/esp_wifi/regulatory` + - `python reg2fw.py` diff --git a/components/esp_wifi/regulatory/reg2fw.py b/components/esp_wifi/regulatory/reg2fw.py index 36a4b6bc7b5..a64081341a2 100755 --- a/components/esp_wifi/regulatory/reg2fw.py +++ b/components/esp_wifi/regulatory/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() diff --git a/components/esp_wifi/regulatory/reg_parse.py b/components/esp_wifi/regulatory/reg_parse.py index dd092982a24..ce09050b3b9 100755 --- a/components/esp_wifi/regulatory/reg_parse.py +++ b/components/esp_wifi/regulatory/reg_parse.py @@ -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 = []