Add ESP32 Serial support to SwiftyCar

This commit is contained in:
Piv
2020-09-12 22:08:03 +09:30
parent cbe2a48f0c
commit 3894e04876
4 changed files with 38 additions and 9 deletions

View File

@@ -64,6 +64,15 @@
"version": "1.12.0" "version": "1.12.0"
} }
}, },
{
"package": "Swift2dCar",
"repositoryURL": "https://vato.ddns.net/gitlab/vato007/swift2dcar.git",
"state": {
"branch": "master",
"revision": "970aac902531408614db0a37a7300e9373dafb50",
"version": null
}
},
{ {
"package": "SwiftRPLidar", "package": "SwiftRPLidar",
"repositoryURL": "https://vato.ddns.net/gitlab/vato007/swiftrplidar.git", "repositoryURL": "https://vato.ddns.net/gitlab/vato007/swiftrplidar.git",
@@ -77,8 +86,8 @@
"package": "SwiftSerial", "package": "SwiftSerial",
"repositoryURL": "https://vato.ddns.net/gitlab/vato007/SwiftSerial.git", "repositoryURL": "https://vato.ddns.net/gitlab/vato007/SwiftSerial.git",
"state": { "state": {
"branch": "dtr_support", "branch": "master",
"revision": "2cb65bc2ff508acc05c165d1a05381cc681f7591", "revision": "27a5d92aa00f6e91581389485994364e16bed2c5",
"version": null "version": null
} }
}, },

View File

@@ -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/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://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/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")) .package(url: "https://vato.ddns.net/gitlab/vato007/swift2dcar.git", .branch("master"))
], ],
targets: [ 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. // Targets can depend on other targets in this package, and on products in packages which this package depends on.
.target( .target(
name: "SwiftyCar", 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( .testTarget(
name: "SwiftyCarTests", name: "SwiftyCarTests",
dependencies: ["SwiftyCar"]), dependencies: ["SwiftyCar"]),

View File

@@ -8,16 +8,31 @@
import Foundation import Foundation
import SwiftyGPIO import SwiftyGPIO
import Swift2dCar 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"] { if let value = ProcessInfo.processInfo.environment["CAR_VEHICLE"] {
switch value{ switch value{
case "CAR_2D": case "VEHICLE_2D":
// Get car for rpi. // Get car for rpi.
let pwms = SwiftyGPIO.hardwarePWMs(for:.RaspberryPi3)! 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])!)!) 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: default:
return MockVehicle() return MockVehicle()
} }

View File

@@ -24,7 +24,7 @@ func doServer() throws {
return false return false
} }
// Create a provider using the features we read. // 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) let trackingProvider = LidarProvider(lidar: lidar)
// Start the server and print its address once it has started. // Start the server and print its address once it has started.