wangzhibo
2026-08-26 70481429367ca00144b24f118cbfdfb28b02967d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
from pathlib import Path
 
ROOT = Path(__file__).resolve().parents[1]
 
 
def read_text(path: str) -> str:
    return (ROOT / path).read_text(encoding="utf-8")
 
 
def require(condition: bool, message: str) -> None:
    if not condition:
        raise SystemExit(message)
 
 
def main() -> None:
    app = read_text("main/application.cc")
    board = read_text("main/boards/sening-xiaozhi-s3/sening_xiaozhi_s3.cc")
 
    require(
        "void Application::LoadLocalAssetsForWakeWord()" in app,
        "Application must load local assets/srmodels before starting Wi-Fi",
    )
    require(
        "bool local_assets_applied_ = false;" in read_text("main/application.h"),
        "Application must track whether local assets were applied before network startup",
    )
    initialize_body = app.split("void Application::Initialize()", 1)[1].split("void Application::Run()", 1)[0]
    require(
        initialize_body.find("LoadLocalAssetsForWakeWord();") != -1 and initialize_body.find("LoadLocalAssetsForWakeWord();") < initialize_body.find("board.StartNetwork();"),
        "Application must load local srmodels before board.StartNetwork() can enter Wi-Fi config mode",
    )
    require(
        "case kDeviceStateWifiConfiguring:\n            audio_service_.EnableVoiceProcessing(false);\n            audio_service_.EnableWakeWordDetection(audio_service_.IsAfeWakeWord());" in app,
        "Wi-Fi config mode must keep AFE wake/offline command detection running",
    )
    connection_failed_branch = board.split("event == NetworkEvent::ConnectionFailed", 1)[1].split("event == NetworkEvent::WifiConfigModeEnter", 1)[0]
    require(
        "BoardMqtt_ResumePlaylistIfUnfinished();" not in connection_failed_branch,
        "ConnectionFailed callback must not resume playlist before config-mode prompt",
    )
    require(
        "event == NetworkEvent::WifiConfigModeEnter" in board,
        "board network callback must handle Wi-Fi config mode entry",
    )
    require(
        "xTaskCreate([](void *arg)" in board and "mqtt_resume_after_config" in board,
        "playlist resume after config mode must be deferred in a task",
    )
    require(
        "vTaskDelay(pdMS_TO_TICKS(" in board and "BoardMqtt_ResumePlaylistIfUnfinished();" in board,
        "deferred config-mode resume task must wait before resuming playlist",
    )
 
 
if __name__ == "__main__":
    main()