package main import ( "flag" "log" "net/http" "time" "douglasthrift.net/dtrobots/gamepad" "github.com/ev3go/ev3dev" ) func main() { var ( device string listen string leftPort string leftDriver string rightPort string rightDriver string mode driveMode systemd bool ) flag.StringVar(&device, "gamepad", "usb-Logitech_Wireless_Gamepad_F710_9B0692E6-event-joystick", "the gamepad device id") flag.StringVar(&listen, "listen", "localhost:8080", "the HTTP listen address and port") flag.StringVar(&leftPort, "motor-left-port", "spi0.1:MC", "the left motor port") flag.StringVar(&leftDriver, "motor-left-driver", "lego-nxt-motor", "the left motor driver") flag.StringVar(&rightPort, "motor-right-port", "spi0.1:MB", "the right motor port") flag.StringVar(&rightDriver, "motor-right-driver", "lego-nxt-motor", "the right motor driver") flag.Var(&mode, "mode", "the drive mode (default \"tank\")") flag.BoolVar(&systemd, "systemd", false, "do not include timestamps in log since systemd already does") flag.Parse() if systemd { log.SetFlags(0) } g, err := gamepad.NewGamepad("/dev/input/by-id/"+device, gamepad.All) if err != nil { log.Fatalf("error creating gamepad: %v", err) } leftMotor, err := ev3dev.TachoMotorFor(leftPort, leftDriver) if err != nil { log.Fatalf("error detecting left motor: %v", err) } log.Printf("detected left motor: %v", leftMotor) rightMotor, err := ev3dev.TachoMotorFor(rightPort, rightDriver) if err != nil { log.Fatalf("error detecting right motor: %v", err) } log.Printf("detected right motor: %v", rightMotor) if err := printInterfaces(); err != nil { log.Fatalf("error printing interfaces: %v", err) } go func() { log.Fatalf("error controlling rover: %v", control(mode, g, leftMotor, rightMotor)) }() go func() { log.Fatalf("error reading from gamepad: %v", g.Read()) }() ifTicker := time.NewTicker(1 * time.Minute) go func() { for range ifTicker.C { if err := printInterfaces(); err != nil { log.Fatalf("error printing interfaces: %v", err) } } }() log.Print("HTTP server started") log.Fatalf("error listening and serving: %v", http.ListenAndServe(listen, nil)) }