Browse Source

A start for cruise control

Douglas Thrift 5 years ago
parent
commit
b501089897
1 changed files with 23 additions and 7 deletions
  1. 23 7
      rover/control.go

+ 23 - 7
rover/control.go

@@ -45,11 +45,12 @@ func (d *driveMode) Set(value string) error {
 func control(mode driveMode, g *gamepad.Gamepad, leftMotor, rightMotor *ev3dev.TachoMotor) error {
 	log.Printf("control loop started (drive mode: %v)", mode)
 
-	if err := setPolarity(ev3dev.Inversed, leftMotor, rightMotor); err != nil {
+	if err := setPolarity(ev3dev.Normal, leftMotor, rightMotor); err != nil {
 		return err
 	}
 
 	gamepadMotors := false
+	var leftCruise, rightCruise int
 
 	for {
 		select {
@@ -57,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); err != nil {
+					if err := tankAnalogControl(e, leftMotor, &leftCruise); err != nil {
 						return err
 					}
 				}
@@ -66,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); err != nil {
+					if err := tankAnalogControl(e, rightMotor, &rightCruise); err != nil {
 						return err
 					}
 				}
@@ -85,15 +86,30 @@ func control(mode driveMode, g *gamepad.Gamepad, leftMotor, rightMotor *ev3dev.T
 				if err := stop(leftMotor, rightMotor); err != nil {
 					return err
 				}
+				leftCruise, rightCruise = 0, 0
 			}
 		case e := <-g.X:
 			log.Println("x", e)
 		case e := <-g.Y:
 			log.Println("y", e)
 		case e := <-g.Left:
-			log.Println("left", e)
+			if e.IsButtonPress() && gamepadMotors {
+				var err error
+				leftCruise, err = leftMotor.Speed()
+				if err != nil {
+					return err
+				}
+				log.Printf("left cruise set: %v", leftCruise)
+			}
 		case e := <-g.Right:
-			log.Println("right", e)
+			if e.IsButtonPress() && gamepadMotors {
+				var err error
+				rightCruise, err = leftMotor.Speed()
+				if err != nil {
+					return err
+				}
+				log.Printf("right cruise set: %v", rightCruise)
+			}
 		case e := <-g.Back:
 			log.Println("back", e)
 		case e := <-g.Start:
@@ -135,9 +151,9 @@ func stop(motors ...*ev3dev.TachoMotor) error {
 	return nil
 }
 
-func tankAnalogControl(e gamepad.Event, motor *ev3dev.TachoMotor) error {
+func tankAnalogControl(e gamepad.Event, motor *ev3dev.TachoMotor, cruise *int) error {
 	if e.IsAxisY() {
-		speed := int(float64(motor.MaxSpeed()) * e.Fraction())
+		speed := -int(float64(motor.MaxSpeed()) * e.Fraction())
 		currentSpeed, err := motor.Speed()
 		if err != nil {
 			return err