张世豪
8 天以前 de75ec84e295c3f952a200897aa22aa73d7d5867
src/yaokong/RemoteControlDialog.java
@@ -25,6 +25,9 @@
    private Timer steeringControlTimer;  // 转向控制定时器
    private int targetForwardSpeed = 0;  // 目标前进/后退速度
    private int targetSteeringSpeed = 0;  // 目标转向速度
    // 独立跟踪每个摇杆的当前速度,避免相互影响
    private int independentForwardSpeed = 0;  // 独立的前进速度(不受转向摇杆影响)
    private int independentSteeringSpeed = 0;  // 独立的转向速度(不受前进摇杆影响)
    private List<JButton> bladeButtons = new ArrayList<>();  // 存储刀盘控制按钮,用于清理定时器
    private String bladeUpDefaultText = "刀盘升";  // 刀盘升按钮默认文字
    private String bladeDownDefaultText = "刀盘降";  // 刀盘降按钮默认文字
@@ -158,27 +161,38 @@
        moveJoystick.setJoystickListener(new JoystickListener() {
            @Override
            public void onJoystickMoved(double x, double y) {
                // 只使用Y轴控制前进后退,向上(北)为正
                // 计算并四舍五入到整数速度值,正为前进,负为后退
                // 只使用Y轴控制前进后退
                // y值范围:-1.0(向上)到 1.0(向下)
                // 计算速度值:向下(y>0)为后退(负值),向上(y<0)为前进(正值)
                // 后退值范围:0 到 -100,前进值范围:0 到 100
                int forwardVal = (int) Math.round(-y * 100.0);
                // 限制在 [-100, 100]
                forwardVal = Math.max(-100, Math.min(100, forwardVal));
                // 更新目标速度
                targetForwardSpeed = forwardVal;
                if (Math.abs(y) > 0.1) {
                    // 摇杆不在中心位置,启动持续发送定时器
                    startForwardControlTimer();
                } else {
                    // 摇杆回到中心位置,停止发送
                    stopForwardControlTimer();
                    stopForward();
                // 死区处理:如果速度值在-10到10之间,视为0(避免微小抖动)
                if (Math.abs(forwardVal) <= 10) {
                    forwardVal = 0;
                }
                // 更新顶部显示(移动显示当前前进/后退速度,转向取当前转向速度作为参考)
                int steeringVal = Control03.getCurrentSteeringSpeed();
                updateJoystickValues(forwardVal, steeringVal);
                // 更新目标速度和独立速度
                targetForwardSpeed = forwardVal;
                independentForwardSpeed = forwardVal;
                if (forwardVal != 0) {
                    // 摇杆不在死区,启动持续发送定时器
                    // 后退时 forwardVal 为负值(-100到-11),前进时 forwardVal 为正值(11到100)
                    startForwardControlTimer();
                } else {
                    // 摇杆在死区或中心位置,停止定时器
                    stopForwardControlTimer();
                    // 将独立的前进速度设置为0
                    independentForwardSpeed = 0;
                    // 发送停止指令(保持转向速度不变)
                    Control03.setAndSendSpeeds(independentSteeringSpeed, 0);
                }
                // 更新顶部显示(使用独立的速度值)
                updateJoystickValues(forwardVal, independentSteeringSpeed);
            }
        });
        // 转向摇杆(蓝色主题)
@@ -187,26 +201,37 @@
        turnJoystick.setJoystickListener(new JoystickListener() {
            @Override
            public void onJoystickMoved(double x, double y) {
                // 只使用X轴控制左右转向,向右为正
                // 计算并四舍五入到整数转向值,正为右转,负为左转
                // 只使用X轴控制左右转向
                // x值范围:-1.0(向左)到 1.0(向右)
                // 计算转向值:向左(x<0)为左转(负值),向右(x>0)为右转(正值)
                // 左转值范围:0 到 -100,右转值范围:0 到 100
                int steeringVal = (int) Math.round(x * 100.0);
                steeringVal = Math.max(-100, Math.min(100, steeringVal));
                // 更新目标速度
                targetSteeringSpeed = steeringVal;
                if (Math.abs(x) > 0.1) {
                    // 摇杆不在中心位置,启动持续发送定时器
                    startSteeringControlTimer();
                } else {
                    // 摇杆回到中心位置,停止发送
                    stopSteeringControlTimer();
                    stopSteering();
                // 死区处理:如果速度值在-10到10之间,视为0(避免微小抖动)
                if (Math.abs(steeringVal) <= 10) {
                    steeringVal = 0;
                }
                // 更新顶部显示(转向显示当前转向速度,移动显示当前前进速度)
                int forwardVal = Control03.getCurrentForwardSpeed();
                updateJoystickValues(forwardVal, steeringVal);
                // 更新目标速度和独立速度
                targetSteeringSpeed = steeringVal;
                independentSteeringSpeed = steeringVal;
                if (steeringVal != 0) {
                    // 摇杆不在死区,启动持续发送定时器
                    // 左转时 steeringVal 为负值(-100到-11),右转时 steeringVal 为正值(11到100)
                    startSteeringControlTimer();
                } else {
                    // 摇杆在死区或中心位置,停止定时器
                    stopSteeringControlTimer();
                    // 将独立的转向速度设置为0
                    independentSteeringSpeed = 0;
                    // 发送停止指令(保持前进速度不变)
                    Control03.setAndSendSpeeds(0, independentForwardSpeed);
                }
                // 更新顶部显示(使用独立的速度值)
                updateJoystickValues(independentForwardSpeed, steeringVal);
            }
        });
        joystickPanel.add(moveJoystick);
@@ -625,14 +650,9 @@
    }
    private void stopForward() {
        if (Control03.getCurrentForwardSpeed() != 0) {
            boolean success = Control03.approachForwardSpeedToZero(20);
            if (!success) {
                showSerialClosedWarning();
                return;
            }
            serialWarningShown = false;
        }
        // 将独立的前进速度设置为0,保持转向速度不变
        independentForwardSpeed = 0;
        Control03.setAndSendSpeeds(independentSteeringSpeed, 0);
    }
    private void applySteeringSpeed(int speed) {
@@ -655,14 +675,9 @@
    }
    private void stopSteering() {
        if (Control03.getCurrentSteeringSpeed() != 0) {
            boolean success = Control03.approachSteeringSpeedToZero(25);
            if (!success) {
                showSerialClosedWarning();
                return;
            }
            serialWarningShown = false;
        }
        // 将独立的转向速度设置为0,保持前进速度不变
        independentSteeringSpeed = 0;
        Control03.setAndSendSpeeds(0, independentForwardSpeed);
    }
    /**
@@ -729,36 +744,24 @@
     * 持续发送前进/后退速度指令
     */
    private void applyForwardSpeedContinuously(int targetSpeed) {
        int currentSpeed = Control03.getCurrentForwardSpeed();
        int currentSteeringSpeed = Control03.getCurrentSteeringSpeed();
        // 更新独立的前进速度
        independentForwardSpeed = targetSpeed;
        
        // 如果已经达到目标速度,直接发送一次以保持状态
        if (currentSpeed == targetSpeed) {
            // 直接发送目标速度指令以保持状态(即使速度相同也要发送)
            Control03.setAndSendSpeeds(currentSteeringSpeed, targetSpeed);
        } else {
            // 逐步调整到目标速度
            int delta = targetSpeed > currentSpeed ? 10 : -10;
            Control03.adjustForwardSpeed(delta);
        }
        // 使用独立的转向速度(不受前进摇杆影响),只更新前进速度
        // 这样前进摇杆的操作不会影响转向速度
        Control03.setAndSendSpeeds(independentSteeringSpeed, independentForwardSpeed);
    }
    /**
     * 持续发送转向速度指令
     */
    private void applySteeringSpeedContinuously(int targetSpeed) {
        int currentSpeed = Control03.getCurrentSteeringSpeed();
        int currentForwardSpeed = Control03.getCurrentForwardSpeed();
        // 更新独立的转向速度
        independentSteeringSpeed = targetSpeed;
        
        // 如果已经达到目标速度,直接发送一次以保持状态
        if (currentSpeed == targetSpeed) {
            // 直接发送目标速度指令以保持状态(即使速度相同也要发送)
            Control03.setAndSendSpeeds(targetSpeed, currentForwardSpeed);
        } else {
            // 逐步调整到目标速度
            int delta = targetSpeed > currentSpeed ? 15 : -15;
            Control03.adjustSteeringSpeed(delta);
        }
        // 使用独立的前进速度(不受转向摇杆影响),只更新转向速度
        // 这样转向摇杆的操作不会影响前进速度
        Control03.setAndSendSpeeds(independentSteeringSpeed, independentForwardSpeed);
    }
    // 更新顶部显示的摇杆数值(在 EDT 上调用),文字根据数值映射为方向描述