From 3894e0487627dc2297fd3249dafbfbd414c2fe99 Mon Sep 17 00:00:00 2001 From: Piv <18462828+Piv200@users.noreply.github.com> Date: Sat, 12 Sep 2020 22:08:03 +0930 Subject: [PATCH] Add ESP32 Serial support to SwiftyCar --- SwiftyCar/Package.resolved | 13 +++++++++-- SwiftyCar/Package.swift | 9 ++++++-- .../Sources/SwiftyCar/VehicleFactory.swift | 23 +++++++++++++++---- SwiftyCar/Sources/SwiftyCar/main.swift | 2 +- 4 files changed, 38 insertions(+), 9 deletions(-) diff --git a/SwiftyCar/Package.resolved b/SwiftyCar/Package.resolved index 8eac167..2a9708e 100644 --- a/SwiftyCar/Package.resolved +++ b/SwiftyCar/Package.resolved @@ -64,6 +64,15 @@ "version": "1.12.0" } }, + { + "package": "Swift2dCar", + "repositoryURL": "https://vato.ddns.net/gitlab/vato007/swift2dcar.git", + "state": { + "branch": "master", + "revision": "970aac902531408614db0a37a7300e9373dafb50", + "version": null + } + }, { "package": "SwiftRPLidar", "repositoryURL": "https://vato.ddns.net/gitlab/vato007/swiftrplidar.git", @@ -77,8 +86,8 @@ "package": "SwiftSerial", "repositoryURL": "https://vato.ddns.net/gitlab/vato007/SwiftSerial.git", "state": { - "branch": "dtr_support", - "revision": "2cb65bc2ff508acc05c165d1a05381cc681f7591", + "branch": "master", + "revision": "27a5d92aa00f6e91581389485994364e16bed2c5", "version": null } }, diff --git a/SwiftyCar/Package.swift b/SwiftyCar/Package.swift index 41d8751..35852aa 100644 --- a/SwiftyCar/Package.swift +++ b/SwiftyCar/Package.swift @@ -14,7 +14,7 @@ let package = Package( .package(url: "https://github.com/grpc/grpc-swift.git", from: "1.0.0-alpha.19"), .package(url: "https://github.com/uraimo/SwiftyGPIO.git", from: "1.0.0"), .package(url: "https://vato.ddns.net/gitlab/vato007/swiftrplidar.git", .branch("master")), - .package(url: "https://vato.ddns.net/gitlab/vato007/SwiftSerial.git", .branch("dtr_support")), + .package(url: "https://vato.ddns.net/gitlab/vato007/SwiftSerial.git", .branch("master")), .package(url: "https://vato.ddns.net/gitlab/vato007/swift2dcar.git", .branch("master")) ], targets: [ @@ -22,7 +22,12 @@ let package = Package( // Targets can depend on other targets in this package, and on products in packages which this package depends on. .target( name: "SwiftyCar", - dependencies: ["SwiftyGPIO", .product(name: "GRPC", package: "grpc-swift"), "SwiftRPLidar", "SwiftSerial", "Swift2dCar"]), + dependencies: [ + "SwiftyGPIO", + .product(name: "GRPC", package: "grpc-swift"), + "SwiftRPLidar", + "SwiftSerial", + "Swift2dCar"]), .testTarget( name: "SwiftyCarTests", dependencies: ["SwiftyCar"]), diff --git a/SwiftyCar/Sources/SwiftyCar/VehicleFactory.swift b/SwiftyCar/Sources/SwiftyCar/VehicleFactory.swift index 79a8e85..e0f78a8 100644 --- a/SwiftyCar/Sources/SwiftyCar/VehicleFactory.swift +++ b/SwiftyCar/Sources/SwiftyCar/VehicleFactory.swift @@ -8,16 +8,31 @@ import Foundation import SwiftyGPIO import Swift2dCar +import SwiftSerial -func getVehicle2D() throws -> Vehicle2D { +func getVehicle2D() throws -> Vehicle2D? { + // TODO: Clean up this factory, or see if we can get dependency injection working. if let value = ProcessInfo.processInfo.environment["CAR_VEHICLE"] { switch value{ - case "CAR_2D": + case "VEHICLE_2D": // Get car for rpi. let pwms = SwiftyGPIO.hardwarePWMs(for:.RaspberryPi3)! - - // Read the feature database. return try RPiVehicle2D(withThrottlePin: PWMHardwareServo(forPin: (pwms[0]?[.P18])!)!, withSteeringPin:PWMHardwareServo(forPin: (pwms[1]?[.P19])!)!) + case "VEHICLE_SERIAL": + // TODO: Get from environment variable. tty won't work in macos anyway. + // We share the serialport object, as cu will block on macOS (required by SwiftSerial), so can't open 2 of the same port. + let serialPort = SerialPort(path: "/dev/ttyUSB0") + guard let throttlePin = Esp32ServoOutput(forChannel: 1, forPin: 14, onPort: serialPort) else { + print("Failed to create throttle pin.") + return nil + } + + guard let steeringPin = Esp32ServoOutput(forChannel: 2, forPin: 12, onPort: serialPort) else { + print("Failed to create steering pin.") + return nil + } + + return try RPiVehicle2D(withThrottlePin: PWMHardwareServo(forPin: throttlePin)!, withSteeringPin: PWMHardwareServo(forPin: steeringPin)!) default: return MockVehicle() } diff --git a/SwiftyCar/Sources/SwiftyCar/main.swift b/SwiftyCar/Sources/SwiftyCar/main.swift index 2f9838c..d0b56b3 100644 --- a/SwiftyCar/Sources/SwiftyCar/main.swift +++ b/SwiftyCar/Sources/SwiftyCar/main.swift @@ -24,7 +24,7 @@ func doServer() throws { return false } // Create a provider using the features we read. - let provider = try MotorProvider(vehicle: getVehicle2D()) + let provider = try MotorProvider(vehicle: getVehicle2D()!) let trackingProvider = LidarProvider(lidar: lidar) // Start the server and print its address once it has started.