Skip to content

Commit a37ae98

Browse files
committed
Add solenoids
1 parent d3afa6d commit a37ae98

File tree

8 files changed

+126
-7
lines changed

8 files changed

+126
-7
lines changed

build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
plugins {
22

3-
id "org.jetbrains.kotlin.jvm" version "1.3.20"
3+
id "org.jetbrains.kotlin.jvm" version "1.3.40"
44
id "idea"
55
}
66

7-
version = "19.2.0"
7+
version = "19.3.0"
88

99
repositories {
1010
jcenter()

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
kotlin.code.style=official
2-
kotlin_version = 1.3.20
2+
kotlin_version = 1.3.40
33
junit_version = 5.2.0
44
koin_version = 1.0.2
55
thirdcoast_version = 19.1.2

src/main/kotlin/org/strykeforce/thirdcoast/Koin.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,14 @@ import com.ctre.phoenix.motorcontrol.can.TalonSRX
77
import com.ctre.phoenix.motorcontrol.can.TalonSRXConfiguration
88
import edu.wpi.first.wpilibj.DigitalOutput
99
import edu.wpi.first.wpilibj.Servo
10+
import edu.wpi.first.wpilibj.Solenoid
1011
import org.jline.reader.LineReader
1112
import org.jline.reader.LineReaderBuilder
1213
import org.jline.terminal.Terminal
1314
import org.jline.terminal.TerminalBuilder
1415
import org.koin.dsl.module.module
1516
import org.strykeforce.thirdcoast.command.Command
16-
import org.strykeforce.thirdcoast.device.CanifierService
17-
import org.strykeforce.thirdcoast.device.DigitalOutputService
18-
import org.strykeforce.thirdcoast.device.ServoService
19-
import org.strykeforce.thirdcoast.device.TalonService
17+
import org.strykeforce.thirdcoast.device.*
2018
import org.strykeforce.thirdcoast.swerve.SwerveDrive
2119
import org.strykeforce.thirdcoast.swerve.SwerveDriveConfig
2220
import org.strykeforce.thirdcoast.swerve.Wheel
@@ -39,6 +37,8 @@ val tctModule = module {
3937

4038
single { ServoService { id -> Servo(id) } }
4139

40+
single { SolenoidService { id -> Solenoid(id) } }
41+
4242
single { DigitalOutputService { id -> DigitalOutput(id) } }
4343

4444
single { CanifierService(get()) { id -> CANifier(id) } }

src/main/kotlin/org/strykeforce/thirdcoast/command/Command.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import org.strykeforce.thirdcoast.dio.RunDigitalOutputsCommand
1212
import org.strykeforce.thirdcoast.dio.SelectDigitalOutputsCommand
1313
import org.strykeforce.thirdcoast.servo.RunServosCommand
1414
import org.strykeforce.thirdcoast.servo.SelectServosCommand
15+
import org.strykeforce.thirdcoast.solenoid.RunSolenoidsCommand
16+
import org.strykeforce.thirdcoast.solenoid.SelectSolenoidsCommand
1517
import org.strykeforce.thirdcoast.swerve.AdjustAzimuthCommand
1618
import org.strykeforce.thirdcoast.swerve.SaveZeroCommand
1719
import org.strykeforce.thirdcoast.swerve.SelectAzimuthCommand
@@ -54,6 +56,8 @@ interface Command {
5456
"talon.velocity.period" -> SelectVelocityMeasurmentPeriodCommand(parent, key, toml)
5557
"servo.select" -> SelectServosCommand(parent, key, toml)
5658
"servo.run" -> RunServosCommand(parent, key, toml)
59+
"solenoid.select" -> SelectSolenoidsCommand(parent, key, toml)
60+
"solenoid.run" -> RunSolenoidsCommand(parent, key, toml)
5761
"digital_output.select" -> SelectDigitalOutputsCommand(parent, key, toml)
5862
"digital_output.run" -> RunDigitalOutputsCommand(parent, key, toml)
5963
"canifier.select" -> SelectCanifierCommand(parent, key, toml)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package org.strykeforce.thirdcoast.device
2+
3+
import edu.wpi.first.wpilibj.Solenoid
4+
5+
class SolenoidService(factory: (id: Int) -> Solenoid) : AbstractDeviceService<Solenoid>(factory)
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package org.strykeforce.thirdcoast.solenoid
2+
3+
import edu.wpi.first.wpilibj.Servo
4+
import edu.wpi.first.wpilibj.Solenoid
5+
import mu.KotlinLogging
6+
import net.consensys.cava.toml.TomlTable
7+
import org.koin.standalone.inject
8+
import org.strykeforce.thirdcoast.command.AbstractCommand
9+
import org.strykeforce.thirdcoast.command.Command
10+
import org.strykeforce.thirdcoast.command.prompt
11+
import org.strykeforce.thirdcoast.device.ServoService
12+
import org.strykeforce.thirdcoast.device.SolenoidService
13+
import org.strykeforce.thirdcoast.readBoolean
14+
import org.strykeforce.thirdcoast.readDouble
15+
import org.strykeforce.thirdcoast.warn
16+
17+
private val logger = KotlinLogging.logger {}
18+
19+
class RunSolenoidsCommand(
20+
parent: Command?,
21+
key: String,
22+
toml: TomlTable
23+
) : AbstractCommand(parent, key, toml) {
24+
25+
private val solenoidService: SolenoidService by inject()
26+
27+
override val menu: String
28+
get() = formatMenu(solenoidService.active.map(Solenoid::get).joinToString())
29+
30+
override fun execute(): Command {
31+
if (solenoidService.active.isEmpty()) {
32+
terminal.warn("no solenoids selected")
33+
return super.execute()
34+
}
35+
var done = false
36+
37+
while (!done) {
38+
try {
39+
val setpoints = mutableListOf<Boolean>()
40+
solenoidService.active.forEach {
41+
val setpoint = reader.readBoolean(this.prompt("solenoid ${it.name} (y/n)"), it.get())
42+
setpoints += setpoint
43+
}
44+
solenoidService.active.forEachIndexed { i, solenoid ->
45+
solenoid.set(setpoints[i])
46+
logger.info { "set solenoid ${solenoid.name} to ${setpoints[i]}" }
47+
}
48+
done = true
49+
} catch (e: Exception) {
50+
terminal.warn("please enter a y/n value)")
51+
}
52+
}
53+
54+
return super.execute()
55+
}
56+
57+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package org.strykeforce.thirdcoast.solenoid
2+
3+
import edu.wpi.first.wpilibj.Solenoid
4+
import net.consensys.cava.toml.TomlTable
5+
import org.koin.standalone.inject
6+
import org.strykeforce.thirdcoast.command.AbstractCommand
7+
import org.strykeforce.thirdcoast.command.Command
8+
import org.strykeforce.thirdcoast.command.prompt
9+
import org.strykeforce.thirdcoast.device.SolenoidService
10+
import org.strykeforce.thirdcoast.readIntList
11+
import org.strykeforce.thirdcoast.warn
12+
13+
class SelectSolenoidsCommand(
14+
parent: Command?,
15+
key: String,
16+
toml: TomlTable
17+
) : AbstractCommand(parent, key, toml) {
18+
private val solenoidService: SolenoidService by inject()
19+
20+
override val menu: String
21+
get() = formatMenu(solenoidService.active.joinToString(transform = Solenoid::port))
22+
23+
override fun execute(): Command {
24+
while (true) {
25+
try {
26+
val ports = reader.readIntList(this.prompt("ports"))
27+
solenoidService.activate(ports)
28+
return super.execute()
29+
} catch (e: IllegalArgumentException) {
30+
terminal.warn("Please enter a list of Solenoid ports separated by ','")
31+
}
32+
}
33+
}
34+
}
35+
36+
internal fun Solenoid.port(): String {
37+
val name = this.name
38+
val start = name.indexOf(',') + 1
39+
return name.substring(start, start + 1)
40+
}

src/main/resources/commands.toml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,19 @@ type = "menu"
347347
order = 20
348348
menu = "active servos"
349349

350+
[solenoid]
351+
type = "menu"
352+
order = 25
353+
menu = "work with solenoids"
354+
[solenoid.run]
355+
type = "solenoid.run"
356+
order = 10
357+
menu = "set solenoid positions"
358+
[solenoid.select]
359+
type = "solenoid.select"
360+
order = 20
361+
menu = "active solenoids"
362+
350363
[digital_output]
351364
type = "menu"
352365
order = 30

0 commit comments

Comments
 (0)