Files
yiliao2026/bashes/radar-driver-switch.sh
Orange 261f533e1e Please enter the commit message for your changes. Lines starting
with '#' will be ignored, and an empty message aborts the commit.

On branch master
Your branch is ahead of 'origin/master' by 31 commits.
  (use "git push" to publish your local commits)

Changes to be committed:
	new file:   .gitignore
	new file:   .vscode/c_cpp_properties.json
	new file:   .vscode/launch.json
	new file:   .vscode/settings.json
	new file:   CLAUDE.md
	new file:   README.md
	new file:   bashes/README.md
	new file:   bashes/radar-driver-switch.sh
	new file:   bashes/radar-driver-switch.sh.bak
	new file:   dependencies/dependencies.txt
	new file:   src/LSLIDAR_X_ROS2-20240228/src/README.md
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/CMakeLists.txt
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/include/lslidar_driver/input.h
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/include/lslidar_driver/lsiosr.h
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/include/lslidar_driver/lslidar_driver.h
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/launch/lslidar_double_launch.py
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/launch/lsm10_net_launch.py
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/launch/lsm10_uart_launch.py
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/launch/lsm10p_net_launch.py
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/launch/lsm10p_uart_launch.py
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/launch/lsn10_launch.py
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/launch/lsn10_net_launch.py
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/launch/lsn10p_launch.py
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/launch/lsn10p_net_launch.py
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/launch/viewer_scan_launch.py
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/package.xml
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/params/lidar_net_ros2/lsm10_net.yaml
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/params/lidar_net_ros2/lsm10p_net.yaml
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/params/lidar_net_ros2/lsn10_net.yaml
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/params/lidar_net_ros2/lsn10p_net.yaml
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/params/lidar_uart_ros2/lsm10.yaml
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/params/lidar_uart_ros2/lsm10_p.yaml
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/params/lidar_uart_ros2/lsn10.yaml
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/params/lidar_uart_ros2/lsn10p.yaml
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/rviz/lslidar.rviz
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/src/input.cc
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/src/lsiosr.cpp
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/src/lslidar_driver.cc
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/src/lslidar_driver.cc.bak
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_driver/src/lslidar_driver_node.cc
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_msgs/CMakeLists.txt
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_msgs/msg/LslidarDifop.msg
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_msgs/msg/LslidarPacket.msg
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_msgs/msg/LslidarPoint.msg
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_msgs/msg/LslidarScan.msg
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_msgs/msg/LslidarSweep.msg
	new file:   src/LSLIDAR_X_ROS2-20240228/src/lslidar_msgs/package.xml
	new file:   src/LSLIDAR_X_ROS2-20240228/src/version.txt
	new file:   src/LSLIDAR_X_ROS2-20240228/src/wheeltec_udev.sh
	new file:   "src/LSLIDAR_X_ROS2-20240228/src/\351\225\255\347\245\236Lsx\351\233\267\350\276\276\346\227\213\350\275\254\350\247\222\345\272\246.png"
	new file:   src/LSLIDAR_X_ROS2-20240228/wheeltec_lidar.launch.py
	new file:   "src/LSLIDAR_X_ROS2-20240228/wheeltec_lidar.launch.py\344\273\205\345\234\250WHEELTEC\351\225\234\345\203\217\344\270\255\344\275\277\347\224\250"
	new file:   src/cyy_navigation2/CMakeLists.txt
	new file:   src/cyy_navigation2/bt/follow_point.xml
	new file:   src/cyy_navigation2/bt/nav_to_pose_with_consistent_replanning_and_if_path_becomes_invalid.xml
	new file:   src/cyy_navigation2/bt/navigate_through_poses_w_replanning_and_recovery.xml
	new file:   src/cyy_navigation2/bt/navigate_to_pose_w_replanning_and_recovery.xml
	new file:   src/cyy_navigation2/bt/navigate_to_pose_w_replanning_goal_patience_and_recovery.xml
	new file:   src/cyy_navigation2/bt/navigate_w_recovery_and_replanning_only_if_path_becomes_invalid.xml
	new file:   src/cyy_navigation2/bt/navigate_w_replanning_distance.xml
	new file:   src/cyy_navigation2/bt/navigate_w_replanning_only_if_goal_is_updated.xml
	new file:   src/cyy_navigation2/bt/navigate_w_replanning_only_if_path_becomes_invalid.xml
	new file:   src/cyy_navigation2/bt/navigate_w_replanning_speed.xml
	new file:   src/cyy_navigation2/bt/navigate_w_replanning_time.xml
	new file:   src/cyy_navigation2/bt/odometry_calibration.xml
	new file:   src/cyy_navigation2/config/nav2_params.yaml
	new file:   src/cyy_navigation2/launch/car_bringup.launch.py
	new file:   src/cyy_navigation2/launch/cyy_nav.launch.py
	new file:   src/cyy_navigation2/launch/cyy_nav_box.launch.py
	new file:   src/cyy_navigation2/maps/cyy_map.data
	new file:   src/cyy_navigation2/maps/cyy_map.pgm
	new file:   src/cyy_navigation2/maps/cyy_map.yaml
	new file:   src/cyy_navigation2/maps/cyy_map1.pgm
	new file:   src/cyy_navigation2/maps/cyy_map1.yaml
	new file:   src/cyy_navigation2/package.xml
	new file:   src/cyy_navigation2/param/nav2_params.yaml
	new file:   src/cyy_navigation2/param/slam_toolbox_localization.yaml
	new file:   src/cyy_slamtoolbox/CMakeLists.txt
	new file:   src/cyy_slamtoolbox/config/angular_filter_example.yaml
	new file:   src/cyy_slamtoolbox/config/box_filter_example.yaml
	new file:   src/cyy_slamtoolbox/config/footprint_filter_example.yaml
	new file:   src/cyy_slamtoolbox/config/intensity_filter_example.yaml
	new file:   src/cyy_slamtoolbox/config/laser_filter_config.yaml
	new file:   src/cyy_slamtoolbox/config/mapper_params_lifelong.yaml
	new file:   src/cyy_slamtoolbox/config/mapper_params_localization.yaml
	new file:   src/cyy_slamtoolbox/config/mapper_params_offline.yaml
	new file:   src/cyy_slamtoolbox/config/mapper_params_online_async.yaml
	new file:   src/cyy_slamtoolbox/config/mapper_params_online_sync.yaml
	new file:   src/cyy_slamtoolbox/config/mask_filter_example.yaml
	new file:   src/cyy_slamtoolbox/config/median_filter_example.yaml
	new file:   src/cyy_slamtoolbox/config/median_spatial_filter_example.yaml
	new file:   src/cyy_slamtoolbox/config/multiple_filters_example.yaml
	new file:   src/cyy_slamtoolbox/config/pass_through_example.yaml
	new file:   src/cyy_slamtoolbox/config/polygon_filter_example.yaml
	new file:   src/cyy_slamtoolbox/config/range_filter_example.yaml
	new file:   src/cyy_slamtoolbox/config/scan_blob_filter_example.yaml
	new file:   src/cyy_slamtoolbox/config/sector_filter_example.yaml
	new file:   src/cyy_slamtoolbox/config/shadow_filter_example.yaml
	new file:   src/cyy_slamtoolbox/config/slam_toolbox_default.rviz
	new file:   src/cyy_slamtoolbox/config/speckle_filter_example.yaml
	new file:   src/cyy_slamtoolbox/launch/cyy_slam_toolbox_launch.launch.py
	new file:   src/cyy_slamtoolbox/launch/cyy_slam_toolbox_location.launch.py
	new file:   src/cyy_slamtoolbox/launch/filter.launch.py
	new file:   src/cyy_slamtoolbox/package.xml
	new file:   src/gc_navigation2_real/CMakeLists.txt
	new file:   src/gc_navigation2_real/behavior_tree/nav_to_pose_ackermann.xml
	new file:   src/gc_navigation2_real/config/slam_toolbox_async_real.yaml
	new file:   src/gc_navigation2_real/config/slam_toolbox_localization_real.yaml
	new file:   src/gc_navigation2_real/launch/real_bringup.launch.py
	new file:   src/gc_navigation2_real/launch/real_nav2_slam.launch.py
	new file:   src/gc_navigation2_real/launch/real_nav2_slam_online.launch.py
	new file:   src/gc_navigation2_real/launch/real_slam_mapping.launch.py
	new file:   src/gc_navigation2_real/maps/Readme.txt
	new file:   src/gc_navigation2_real/package.xml
	new file:   src/gc_navigation2_real/params/gc_navigation_slam_real.yaml
	new file:   src/gc_navigation2_slamtoolbox/CMakeLists.txt
	new file:   src/gc_navigation2_slamtoolbox/config/mapper_params_lifelong.yaml
	new file:   src/gc_navigation2_slamtoolbox/config/mapper_params_localization.yaml
	new file:   src/gc_navigation2_slamtoolbox/config/mapper_params_offline.yaml
	new file:   src/gc_navigation2_slamtoolbox/config/mapper_params_online_multi_async.yaml
	new file:   src/gc_navigation2_slamtoolbox/config/mapper_params_online_sync.yaml
	new file:   src/gc_navigation2_slamtoolbox/config/nav_to_pose_ackermann.xml
	new file:   src/gc_navigation2_slamtoolbox/config/slam_toolbox_async.yaml
	new file:   src/gc_navigation2_slamtoolbox/config/slam_toolbox_localization.yaml
	new file:   src/gc_navigation2_slamtoolbox/config/slam_toolbox_mapping.yaml
	new file:   src/gc_navigation2_slamtoolbox/launch/gc_nav2_with_amcl.launch.py
	new file:   src/gc_navigation2_slamtoolbox/launch/gc_nav2_with_slam.launch.py
	new file:   src/gc_navigation2_slamtoolbox/launch/gc_nav2_with_slam_online.launch.py
	new file:   src/gc_navigation2_slamtoolbox/launch/gc_nav2_with_slam_online_real.launch.py
	new file:   src/gc_navigation2_slamtoolbox/launch/gc_nav_slamtoolbox_lifelong.launch.py
	new file:   src/gc_navigation2_slamtoolbox/launch/gc_nav_slamtoolbox_location.launch.py
	new file:   src/gc_navigation2_slamtoolbox/launch/gc_nav_slamtoolbox_on_async.launch.py
	new file:   src/gc_navigation2_slamtoolbox/launch/gc_slam_mapping.launch.py
	new file:   src/gc_navigation2_slamtoolbox/maps/my_map.data
	new file:   src/gc_navigation2_slamtoolbox/maps/my_map.pgm
	new file:   src/gc_navigation2_slamtoolbox/maps/my_map.posegraph
	new file:   src/gc_navigation2_slamtoolbox/maps/my_map.yaml
	new file:   src/gc_navigation2_slamtoolbox/maps/zhihui.data
	new file:   src/gc_navigation2_slamtoolbox/maps/zhihui.pgm
	new file:   src/gc_navigation2_slamtoolbox/maps/zhihui.posegraph
	new file:   src/gc_navigation2_slamtoolbox/maps/zhihui.yaml
	new file:   src/gc_navigation2_slamtoolbox/package.xml
	new file:   src/gc_navigation2_slamtoolbox/params/gc_navigation_amcl.yaml
	new file:   src/gc_navigation2_slamtoolbox/params/gc_navigation_slam.yaml
	new file:   src/gc_navigation2_slamtoolbox/params/gc_navigation_slam.yaml.bak
	new file:   src/gc_navigation2_slamtoolbox/world/zhihui/model.config
	new file:   src/gc_navigation2_slamtoolbox/world/zhihui/model.sdf
	new file:   src/gc_navigation_fish/CMakeLists.txt
	new file:   src/gc_navigation_fish/launch/gc_navigation.launch.py
	new file:   src/gc_navigation_fish/maps/test_map.pgm
	new file:   src/gc_navigation_fish/maps/test_map.yaml
	new file:   src/gc_navigation_fish/package.xml
	new file:   src/gc_navigation_fish/param/gc_navigation.yaml
	new file:   src/gc_navigation_fish/param/navigation_test.yaml
	new file:   src/gc_slam_toolbox_fish/CMakeLists.txt
	new file:   src/gc_slam_toolbox_fish/config/gc_2d.lua
	new file:   src/gc_slam_toolbox_fish/launch/catograph.launch.py
	new file:   src/gc_slam_toolbox_fish/package.xml
	new file:   src/ground_slam/.gitignore
	new file:   src/ground_slam/CMakeLists.txt
	new file:   src/ground_slam/LICENSE.md
	new file:   src/ground_slam/README.md
	new file:   src/ground_slam/cmake/FindEigen3.cmake
	new file:   src/ground_slam/cmake/FindFFTW3.cmake
	new file:   src/ground_slam/configs/config_HD.yaml
	new file:   src/ground_slam/configs/config_geekplus.yaml
	new file:   src/ground_slam/configs/config_ntu.yaml
	new file:   src/ground_slam/figures/data_association.jpg
	new file:   src/ground_slam/figures/features_small.jpg
	new file:   src/ground_slam/figures/fig1.jpg
	new file:   src/ground_slam/figures/loop_error.jpg
	new file:   src/ground_slam/figures/loop_trajectory.jpg
	new file:   src/ground_slam/figures/pipeline.png
	new file:   src/ground_slam/figures/rmse_curve.jpg
	new file:   src/ground_slam/figures/sample_images.jpg
	new file:   src/ground_slam/figures/trajectory.jpg
	new file:   src/ground_slam/figures/video.png
	new file:   src/ground_slam/include/camera.h
	new file:   src/ground_slam/include/circ_shift.h
	new file:   src/ground_slam/include/correlation_flow.h
	new file:   src/ground_slam/include/dataset.h
	new file:   src/ground_slam/include/edge.h
	new file:   src/ground_slam/include/frame.h
	new file:   src/ground_slam/include/loop_closure.h
	new file:   src/ground_slam/include/map.h
	new file:   src/ground_slam/include/map_builder.h
	new file:   src/ground_slam/include/map_stitcher.h
	new file:   src/ground_slam/include/optimization_2d/angle_local_parameterization.h
	new file:   src/ground_slam/include/optimization_2d/normalize_angle.h
	new file:   src/ground_slam/include/optimization_2d/pose_graph_2d.h
	new file:   src/ground_slam/include/optimization_2d/pose_graph_2d_error_term.h
	new file:   src/ground_slam/include/optimization_2d/types.h
	new file:   src/ground_slam/include/read_configs.h
	new file:   src/ground_slam/include/thread_publisher.h
	new file:   src/ground_slam/include/timer.h
	new file:   src/ground_slam/include/utils.h
	new file:   src/ground_slam/include/visualization.h
	new file:   src/ground_slam/main.cpp
	new file:   src/ground_slam/package.xml
	new file:   src/ground_slam/src/camera.cc
	new file:   src/ground_slam/src/correlation_flow.cc
	new file:   src/ground_slam/src/dataset.cc
	new file:   src/ground_slam/src/edge.cc
	new file:   src/ground_slam/src/frame.cc
	new file:   src/ground_slam/src/loop_closure.cc
	new file:   src/ground_slam/src/map.cc
	new file:   src/ground_slam/src/map_builder.cc
	new file:   src/ground_slam/src/map_stitcher.cc
	new file:   src/ground_slam/src/optimization_2d/pose_graph_2d.cc
	new file:   src/ground_slam/src/thread_publisher.cc
	new file:   src/ground_slam/src/timer.cc
	new file:   src/ground_slam/src/utils.cc
	new file:   src/ground_slam/src/visualization.cc
	new file:   src/ground_slam/supplementary/GroundSLAM_Supplement_Materia.pdf
	new file:   src/origincar_base/CMakeLists.txt
	new file:   src/origincar_base/config/ekf.yaml
	new file:   src/origincar_base/config/imu.yaml
	new file:   src/origincar_base/include/origincar_base/Quaternion_Solution.h
	new file:   src/origincar_base/include/origincar_base/origincar_base.h
	new file:   src/origincar_base/launch/__pycache__/testtwo.launch.cpython-38.pyc
	new file:   src/origincar_base/launch/base_serial.launch.py
	new file:   src/origincar_base/launch/ekf.launch.py
	new file:   src/origincar_base/launch/origincar_bringup.launch.py
	new file:   src/origincar_base/launch/robot_mode_description.launch.py
	new file:   src/origincar_base/msg/Position.msg
	new file:   src/origincar_base/package.xml
	new file:   src/origincar_base/scripts/__pycache__/cmd_vel_to_ackermann_drive.cpython-310.pyc
	new file:   src/origincar_base/scripts/cmd_vel_to_ackermann_drive.py
	new file:   src/origincar_base/src/Quaternion_Solution.cpp
	new file:   src/origincar_base/src/origincar_base.cpp
	new file:   src/origincar_base/src/origincar_base.cpp.bak
	new file:   src/origincar_description/CMakeLists.txt
	new file:   src/origincar_description/CMakeLists.txt.save
	new file:   src/origincar_description/config/joint_names_origincar_description.yaml
	new file:   src/origincar_description/config/joint_names_origincar_description.yaml:Zone.Identifier
	new file:   "src/origincar_description/config/joint_names_origincar_description.yaml\357\200\272Zone.Identifier"
	new file:   src/origincar_description/launch/display.launch
	new file:   src/origincar_description/launch/display.launch.py
	new file:   src/origincar_description/launch/gazebo.launch
	new file:   src/origincar_description/launch/gazebo.launch.py
	new file:   src/origincar_description/meshes/base_link.STL
	new file:   src/origincar_description/meshes/base_link.STL:Zone.Identifier
	new file:   "src/origincar_description/meshes/base_link.STL\357\200\272Zone.Identifier"
	new file:   src/origincar_description/meshes/down_left_Link.STL
	new file:   src/origincar_description/meshes/down_left_Link.STL:Zone.Identifier
	new file:   "src/origincar_description/meshes/down_left_Link.STL\357\200\272Zone.Identifier"
	new file:   src/origincar_description/meshes/down_right_Link.STL
	new file:   src/origincar_description/meshes/down_right_Link.STL:Zone.Identifier
	new file:   "src/origincar_description/meshes/down_right_Link.STL\357\200\272Zone.Identifier"
	new file:   src/origincar_description/meshes/up_left_Link.STL
	new file:   src/origincar_description/meshes/up_left_Link.STL:Zone.Identifier
	new file:   "src/origincar_description/meshes/up_left_Link.STL\357\200\272Zone.Identifier"
	new file:   src/origincar_description/meshes/up_right_Link.STL
	new file:   src/origincar_description/meshes/up_right_Link.STL:Zone.Identifier
	new file:   "src/origincar_description/meshes/up_right_Link.STL\357\200\272Zone.Identifier"
	new file:   src/origincar_description/package.xml
	new file:   src/origincar_description/rviz/README
	new file:   src/origincar_description/rviz/display.rviz
	new file:   src/origincar_description/urdf/origincar.urdf
	new file:   src/origincar_description/urdf/origincar.xacro
	new file:   src/origincar_description/world/fishbot.world
	new file:   src/origincar_description/world/gc_world.world
	new file:   src/origincar_description/world/test.world
	new file:   src/origincar_description/world/zhihui.world
	new file:   src/origincar_msg/CMakeLists.txt
	new file:   src/origincar_msg/msg/Data.msg
	new file:   src/origincar_msg/msg/Sign.msg
	new file:   src/origincar_msg/package.xml
	new file:   src/zbw_slamtoolbox/CMakeLists.txt
	new file:   src/zbw_slamtoolbox/config/mapper_params_online_async.yaml
	new file:   src/zbw_slamtoolbox/config/mapper_params_online_sync copy.yaml
	new file:   src/zbw_slamtoolbox/config/navigation.yaml
	new file:   src/zbw_slamtoolbox/launch/navigation.launch.py
	new file:   src/zbw_slamtoolbox/launch/slamtoolbox.launch.py
	new file:   src/zbw_slamtoolbox/package.xml
	new file:   "\347\253\236\350\265\233\346\226\271\346\241\210_\347\254\25421\345\261\212\346\231\272\350\203\275\346\261\275\350\275\246\347\253\236\350\265\233\345\234\260\347\223\234\346\234\272\345\231\250\344\272\272\350\265\233\351\241\271.md"
	new file:   "\350\260\203\350\257\225\350\256\260\345\275\225.log"
2026-06-13 19:55:01 +08:00

102 lines
4.3 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# 退出码说明
# 0 - 成功
# 1 - 错误等待TTY设备就绪超时
# 2 - 错误未找到CH343驱动
# 3 - 错误雷达端口上未找到CH34x设备
# 4 - 错误未从cdc_acm找到雷达接口
# 5 - 错误解绑cdc_acm驱动失败
# 6 - 错误绑定usb_ch343驱动失败
# ── 配置 ────────────────────────────────────────────
TTY_DEVICE="/dev/ttyACM*"
CDC_ACM_PATH="/sys/bus/usb/drivers/cdc_acm"
USB_CH343_PATH="/sys/bus/usb/drivers/usb_ch343"
RADAR_USB_PORT="1-1.4" # 雷达 CH34x 的 USB 物理端口(固定不变)
CHECK_INTERVAL=1
MAX_WAIT_SECONDS=30
# ── 初始化 ──────────────────────────────────────────
start_time=$(cut -d. -f1 /proc/uptime)
# ── 1. 等待 TTY 设备就绪 ────────────────────────────
while true; do
for dev in /dev/ttyACM*; do
[ -e "$dev" ] || continue
if [ -c "$dev" ] && [ -r "$dev" ] && [ -w "$dev" ]; then
echo "[雷达驱动自动切换程序] 设备 $dev 已就绪!" > /dev/kmsg
TTY_DEVICE="$dev"
break 2
fi
done
if [ ${MAX_WAIT_SECONDS} -gt 0 ]; then
current_time=$(cut -d. -f1 /proc/uptime)
elapsed_seconds=$((current_time - start_time))
if [ ${elapsed_seconds} -ge ${MAX_WAIT_SECONDS} ]; then
echo "[雷达驱动自动切换程序] 错误:等待 ${TTY_DEVICE} 超时(${MAX_WAIT_SECONDS}秒)!" > /dev/kmsg
exit 1
fi
echo "[雷达驱动自动切换程序] 仍在等待${TTY_DEVICE}(已等待${elapsed_seconds}秒)..." > /dev/kmsg
fi
sleep ${CHECK_INTERVAL}
done
# ── 2. 确认 CH343 驱动已加载 ────────────────────────
if [ -d "${USB_CH343_PATH}" ]; then
echo "[雷达驱动自动切换程序] CH343驱动已加载继续..." > /dev/kmsg
else
echo "[雷达驱动自动切换程序] 错误未找到CH343驱动" > /dev/kmsg
exit 2
fi
# ── 3. 通过物理端口定位雷达 CH34x ───────────────────
radar_sysfs="/sys/bus/usb/devices/${RADAR_USB_PORT}"
if [ ! -d "${radar_sysfs}" ]; then
echo "[雷达驱动自动切换程序] 错误:端口 ${RADAR_USB_PORT} 上无设备!" > /dev/kmsg
exit 3
fi
vendor_id=$(cat "${radar_sysfs}/idVendor" 2>/dev/null)
product_id=$(cat "${radar_sysfs}/idProduct" 2>/dev/null)
if [ "${vendor_id}" != "1a86" ] || [ "${product_id}" != "55d4" ]; then
echo "[雷达驱动自动切换程序] 错误:端口 ${RADAR_USB_PORT} 上 VID:PID=${vendor_id}:${product_id}非雷达CH34x" > /dev/kmsg
exit 3
fi
echo "[雷达驱动自动切换程序] 雷达确认位于端口 ${RADAR_USB_PORT}VID:PID=${vendor_id}:${product_id}" > /dev/kmsg
# ── 4. 查找 cdc_acm 下雷达的接口 ────────────────────
cdc_acm_sub_addr=$(ls "${CDC_ACM_PATH}" 2>/dev/null | grep "^${RADAR_USB_PORT}:" | head -n 1)
if [ -z "${cdc_acm_sub_addr}" ]; then
echo "[雷达驱动自动切换程序] 错误cdc_acm驱动中未找到端口 ${RADAR_USB_PORT} 的接口" > /dev/kmsg
exit 4
fi
echo "[雷达驱动自动切换程序] 雷达 cdc_acm 接口:${cdc_acm_sub_addr}" > /dev/kmsg
# ── 5. 解绑 cdc_acm ─────────────────────────────────
echo "${cdc_acm_sub_addr}" | sudo tee "${CDC_ACM_PATH}/unbind" > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "[雷达驱动自动切换程序] 已解绑 cdc_acm${cdc_acm_sub_addr}" > /dev/kmsg
else
echo "[雷达驱动自动切换程序] 错误:解绑 cdc_acm 失败" > /dev/kmsg
exit 5
fi
# ── 6. 绑定 ch343 ───────────────────────────────────
echo "${cdc_acm_sub_addr}" | sudo tee "${USB_CH343_PATH}/bind" > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "[雷达驱动自动切换程序] 已绑定 usb_ch343${cdc_acm_sub_addr}" > /dev/kmsg
else
echo "[雷达驱动自动切换程序] 错误:绑定 usb_ch343 失败" > /dev/kmsg
exit 6
fi
echo "[雷达驱动自动切换程序] 雷达驱动切换完毕!" > /dev/kmsg
exit 0