Implement scoring table stack light logic.

This commit is contained in:
Patrick Fairbank
2018-08-18 22:50:29 -07:00
parent 918e8741e0
commit fcc3199c7f
2 changed files with 22 additions and 9 deletions

View File

@@ -775,22 +775,27 @@ func (arena *Arena) handlePlcOutput() {
func (arena *Arena) handleLeds() {
switch arena.MatchState {
case PreMatch:
// Set the stack light state -- blinking green if ready, or solid alliance color(s) if not.
redAllianceReady := arena.checkAllianceStationsReady("R1", "R2", "R3") == nil
blueAllianceReady := arena.checkAllianceStationsReady("B1", "B2", "B3") == nil
greenStackLight := redAllianceReady && blueAllianceReady && arena.Plc.GetCycleState(2, 0, 25)
arena.Plc.SetStackLights(!redAllianceReady, !blueAllianceReady, greenStackLight)
// Turn off each alliance switch if all teams become ready.
if arena.checkAllianceStationsReady("R1", "R2", "R3") == nil && !arena.lastRedAllianceReady {
if redAllianceReady && !arena.lastRedAllianceReady {
arena.RedSwitchLeds.SetMode(led.OffMode, led.OffMode)
arena.lastRedAllianceReady = true
} else if arena.checkAllianceStationsReady("R1", "R2", "R3") != nil && arena.lastRedAllianceReady {
} else if !redAllianceReady && arena.lastRedAllianceReady {
arena.RedSwitchLeds.SetMode(led.RedMode, led.RedMode)
arena.lastRedAllianceReady = false
}
if arena.checkAllianceStationsReady("B1", "B2", "B3") == nil && !arena.lastBlueAllianceReady {
arena.lastRedAllianceReady = redAllianceReady
if blueAllianceReady && !arena.lastBlueAllianceReady {
arena.BlueSwitchLeds.SetMode(led.OffMode, led.OffMode)
arena.lastBlueAllianceReady = true
} else if arena.checkAllianceStationsReady("B1", "B2", "B3") != nil && arena.lastBlueAllianceReady {
} else if !blueAllianceReady && arena.lastBlueAllianceReady {
arena.BlueSwitchLeds.SetMode(led.BlueMode, led.BlueMode)
arena.lastBlueAllianceReady = false
}
arena.lastBlueAllianceReady = blueAllianceReady
case WarmupPeriod:
arena.Plc.SetStackLights(false, false, true)
arena.ScaleLeds.SetMode(arena.warmupLedMode, arena.warmupLedMode)
arena.RedSwitchLeds.SetMode(arena.warmupLedMode, arena.warmupLedMode)
arena.BlueSwitchLeds.SetMode(arena.warmupLedMode, arena.warmupLedMode)
@@ -807,6 +812,7 @@ func (arena *Arena) handleLeds() {
arena.RedSwitchLeds.SetMode(led.OffMode, led.OffMode)
arena.BlueSwitchLeds.SetMode(led.OffMode, led.OffMode)
case PostMatch:
arena.Plc.SetStackLights(false, false, false)
mode := led.FadeSingleMode
if arena.FieldReset {
mode = led.GreenMode

View File

@@ -31,7 +31,7 @@ const (
modbusPort = 502
plcLoopPeriodMs = 100
plcRetryIntevalSec = 3
cycleCounterMax = 96
cycleCounterMax = 100
)
// Discrete inputs
@@ -201,6 +201,13 @@ func (plc *Plc) GetPowerUpButtons() (bool, bool, bool, bool, bool, bool) {
plc.Inputs[blueForceActivate], plc.Inputs[blueLevitateActivate], plc.Inputs[blueBoostActivate]
}
// Set the on/off state of the stack lights on the scoring table.
func (plc *Plc) SetStackLights(red, blue, green bool) {
plc.Coils[stackLightRed] = red
plc.Coils[stackLightBlue] = blue
plc.Coils[stackLightGreen] = green
}
func (plc *Plc) GetCycleState(max, index, duration int) bool {
return plc.cycleCounter/duration%max == index
}