/** * @file track_map.c * @brief 赛道地图 — S 型遍历拓扑表 * * S 型路径: * C1(→) → 左转 → 连接 → 左转 → C2(←) → 右转 → 连接 → 右转 → * C3(→) → 左转 → 连接 → 左转 → C4(←) → 右转 → 连接 → 右转 → * C5(→) → 左转 → 连接 → 左转 → C6(←) → 左转 → 出场 */ #include "track_map.h" /* ========================================================= * 硬编码 S 型遍历表 * ========================================================= */ static const TrackMap_t s_map = { .corridors = { /* id travel_dir exit_turn entry_turn is_last * -- ---------- --------- ---------- ------- */ { 0, TRAVEL_DIR_POSITIVE, TURN_DIR_LEFT, TURN_DIR_LEFT, false }, /* C1: → 到右端后左转 */ { 1, TRAVEL_DIR_NEGATIVE, TURN_DIR_RIGHT, TURN_DIR_RIGHT, false }, /* C2: ← 到左端后右转 */ { 2, TRAVEL_DIR_POSITIVE, TURN_DIR_LEFT, TURN_DIR_LEFT, false }, /* C3: → */ { 3, TRAVEL_DIR_NEGATIVE, TURN_DIR_RIGHT, TURN_DIR_RIGHT, false }, /* C4: ← */ { 4, TRAVEL_DIR_POSITIVE, TURN_DIR_LEFT, TURN_DIR_LEFT, false }, /* C5: → */ { 5, TRAVEL_DIR_NEGATIVE, TURN_DIR_LEFT, TURN_DIR_LEFT, true }, /* C6: ← 最后一条, 左转出场 */ }, .entry_corridor_id = 0, .link_distance_m = TRACK_MAP_LINK_DISTANCE_M, .corridor_length_m = TRACK_MAP_CORRIDOR_LENGTH_M, }; /* ========================================================= * API 实现 * ========================================================= */ void TrackMap_Init(void) { /* 静态表,无需运行时初始化 */ } const TrackMap_t* TrackMap_Get(void) { return &s_map; } const CorridorDescriptor_t* TrackMap_GetCorridor(uint8_t id) { if (id >= TRACK_MAP_CORRIDOR_COUNT) { return &s_map.corridors[0]; } return &s_map.corridors[id]; } uint8_t TrackMap_GetNextCorridorId(uint8_t current_id) { if (current_id + 1 >= TRACK_MAP_CORRIDOR_COUNT) { return current_id; /* 已是最后一条 */ } return current_id + 1; } bool TrackMap_IsLastCorridor(uint8_t id) { if (id >= TRACK_MAP_CORRIDOR_COUNT) return true; return s_map.corridors[id].is_last; } TurnDirection_t TrackMap_GetExitTurnDir(uint8_t id) { if (id >= TRACK_MAP_CORRIDOR_COUNT) return TURN_DIR_LEFT; return s_map.corridors[id].exit_turn_dir; } TurnDirection_t TrackMap_GetEntryTurnDir(uint8_t id) { if (id >= TRACK_MAP_CORRIDOR_COUNT) return TURN_DIR_LEFT; return s_map.corridors[id].entry_turn_dir; }