Browse Source

Working cruise control

Douglas Thrift 5 years ago
parent
commit
5713672d7b
1 changed files with 33 additions and 3 deletions
  1. 33 3
      rover/control.go

+ 33 - 3
rover/control.go

@@ -58,7 +58,7 @@ func control(mode driveMode, g *gamepad.Gamepad, leftMotor, rightMotor *ev3dev.T
 			if gamepadMotors {
 				switch mode {
 				case tank:
-					if err := tankAnalogControl(e, leftMotor, &leftCruise); err != nil {
+					if err := tankAnalogControl(e, "left", leftMotor, &leftCruise); err != nil {
 						return err
 					}
 				}
@@ -67,7 +67,7 @@ func control(mode driveMode, g *gamepad.Gamepad, leftMotor, rightMotor *ev3dev.T
 			if gamepadMotors {
 				switch mode {
 				case tank:
-					if err := tankAnalogControl(e, rightMotor, &rightCruise); err != nil {
+					if err := tankAnalogControl(e, "right", rightMotor, &rightCruise); err != nil {
 						return err
 					}
 				}
@@ -151,9 +151,12 @@ func stop(motors ...*ev3dev.TachoMotor) error {
 	return nil
 }
 
-func tankAnalogControl(e gamepad.Event, motor *ev3dev.TachoMotor, cruise *int) error {
+func tankAnalogControl(e gamepad.Event, side string, motor *ev3dev.TachoMotor, cruise *int) error {
 	if e.IsAxisY() {
 		speed := -int(float64(motor.MaxSpeed()) * e.Fraction())
+		if *cruise != 0 && !(*cruise > 0 && speed > 0 && speed > *cruise) && !(*cruise < 0 && speed < 0 && speed > *cruise) {
+			speed = *cruise
+		}
 		currentSpeed, err := motor.Speed()
 		if err != nil {
 			return err
@@ -169,6 +172,33 @@ func tankAnalogControl(e gamepad.Event, motor *ev3dev.TachoMotor, cruise *int) e
 				return err
 			}
 		}
+	} else if e.IsAxisZ() {
+		if *cruise != 0 {
+			speed := int(float64(*cruise) * (1 - e.Fraction()))
+			currentSpeed, err := motor.Speed()
+			if err != nil {
+				return err
+			}
+			if speed != currentSpeed {
+				motor.SetSpeedSetpoint(speed)
+				if speed == 0 {
+					motor.Command("stop")
+				} else {
+					motor.Command("run-forever")
+				}
+				if err := motor.Err(); err != nil {
+					return err
+				}
+			}
+		}
+	} else if e.IsButtonPress() {
+		*cruise = 0
+		log.Printf("%v cruise set: %v", side, *cruise)
+		motor.SetSpeedSetpoint(*cruise)
+		motor.Command("stop")
+		if err := motor.Err(); err != nil {
+			return err
+		}
 	}
 	return nil
 }