Implement orange stack light.

This commit is contained in:
Patrick Fairbank
2019-08-08 21:32:57 -07:00
parent 865f071cda
commit a603840b0d
7 changed files with 56 additions and 33 deletions

View File

@@ -673,12 +673,16 @@ func (arena *Arena) handleLeds() {
case TimeoutActive:
fallthrough
case PostTimeout:
// Set the stack light state -- blinking green if ready, or solid alliance color(s) if not.
// Set the stack light state -- solid alliance color(s) if robots are not connected, solid orange if scores are
// not input, or blinking green if ready.
redAllianceReady := arena.checkAllianceStationsReady("R1", "R2", "R3") == nil
blueAllianceReady := arena.checkAllianceStationsReady("B1", "B2", "B3") == nil
greenStackLight := redAllianceReady && blueAllianceReady && arena.Plc.GetCycleState(2, 0, 2)
arena.Plc.SetStackLights(!redAllianceReady, !blueAllianceReady, greenStackLight)
arena.Plc.SetStackBuzzer(redAllianceReady && blueAllianceReady)
preMatchScoreReady := arena.BypassPreMatchScore || arena.RedRealtimeScore.CurrentScore.IsValidPreMatch() &&
arena.BlueRealtimeScore.CurrentScore.IsValidPreMatch()
greenStackLight := redAllianceReady && blueAllianceReady && preMatchScoreReady &&
arena.Plc.GetCycleState(2, 0, 2)
arena.Plc.SetStackLights(!redAllianceReady, !blueAllianceReady, !preMatchScoreReady, greenStackLight)
arena.Plc.SetStackBuzzer(redAllianceReady && blueAllianceReady && preMatchScoreReady)
// Turn off lights if all teams become ready.
// TODO(pat): Implement for 2019.
@@ -700,9 +704,10 @@ func (arena *Arena) handleLeds() {
//arena.BlueSwitchLeds.SetMode(led.BlueMode, led.BlueMode)
}
arena.lastBlueAllianceReady = blueAllianceReady
case PostMatch:
arena.Plc.SetStackLights(false, false, false)
scoreReady := arena.RedRealtimeScore.FoulsCommitted && arena.BlueRealtimeScore.FoulsCommitted &&
arena.alliancePostMatchScoreReady("red") && arena.alliancePostMatchScoreReady("blue")
arena.Plc.SetStackLights(false, false, !scoreReady, false)
}
}
@@ -745,3 +750,8 @@ func (arena *Arena) playSound(name string) {
arena.PlaySoundNotifier.NotifyWithMessage(name)
}
}
func (arena *Arena) alliancePostMatchScoreReady(alliance string) bool {
numPanels := arena.ScoringPanelRegistry.GetNumPanels(alliance)
return numPanels > 0 && arena.ScoringPanelRegistry.GetNumScoreCommitted(alliance) >= numPanels
}

View File

@@ -219,11 +219,14 @@ func (arena *Arena) generateScorePostedMessage() interface{} {
func (arena *Arena) generateScoringStatusMessage() interface{} {
return &struct {
RefereeScoreReady bool
RedScoreReady bool
BlueScoreReady bool
NumRedScoringPanels int
NumRedScoringPanelsReady int
NumBlueScoringPanels int
NumBlueScoringPanelsReady int
}{arena.RedRealtimeScore.FoulsCommitted && arena.BlueRealtimeScore.FoulsCommitted,
arena.alliancePostMatchScoreReady("red"), arena.alliancePostMatchScoreReady("blue"),
arena.ScoringPanelRegistry.GetNumPanels("red"), arena.ScoringPanelRegistry.GetNumScoreCommitted("red"),
arena.ScoringPanelRegistry.GetNumPanels("blue"), arena.ScoringPanelRegistry.GetNumScoreCommitted("blue")}
}

View File

@@ -102,29 +102,32 @@ func (plc *Plc) Run() {
for {
if plc.handler == nil {
if plc.address == "" {
time.Sleep(time.Second * plcRetryIntevalSec)
// No PLC is configured; just allow the loop to continue to simulate inputs and outputs.
plc.IsHealthy = false
continue
}
err := plc.connect()
if err != nil {
log.Printf("PLC error: %v", err)
time.Sleep(time.Second * plcRetryIntevalSec)
plc.IsHealthy = false
continue
} else {
err := plc.connect()
if err != nil {
log.Printf("PLC error: %v", err)
//time.Sleep(time.Second * plcRetryIntevalSec)
plc.IsHealthy = false
continue
}
}
}
startTime := time.Now()
isHealthy := true
isHealthy = isHealthy && plc.writeCoils()
isHealthy = isHealthy && plc.readInputs()
isHealthy = isHealthy && plc.readCounters()
if !isHealthy {
plc.resetConnection()
if plc.handler != nil {
isHealthy := true
isHealthy = isHealthy && plc.writeCoils()
isHealthy = isHealthy && plc.readInputs()
isHealthy = isHealthy && plc.readCounters()
if !isHealthy {
plc.resetConnection()
}
plc.IsHealthy = isHealthy
}
plc.IsHealthy = isHealthy
plc.cycleCounter++
if plc.cycleCounter == cycleCounterMax {
plc.cycleCounter = 0
@@ -162,9 +165,10 @@ func (plc *Plc) GetTeamEstops() ([3]bool, [3]bool) {
}
// Set the on/off state of the stack lights on the scoring table.
func (plc *Plc) SetStackLights(red, blue, green bool) {
func (plc *Plc) SetStackLights(red, blue, orange, green bool) {
plc.coils[stackLightRed] = red
plc.coils[stackLightBlue] = blue
plc.coils[stackLightOrange] = orange
plc.coils[stackLightGreen] = green
}

View File

@@ -92,6 +92,12 @@
width: 80px;
}
input[type=number]::-webkit-inner-spin-button, input[type=number]::-webkit-outer-spin-button {
-webkit-appearance: none;
margin: 0;
-webkit-appearance: none;
margin: 0;
}
td[data-plc-value="false"] {
color: #f00;
}
td[data-plc-value="true"] {
color: #090;
}

View File

@@ -222,14 +222,12 @@ var handleAudienceDisplayMode = function(data) {
// Handles a websocket message to signal whether the referee and scorers have committed after the match.
var handleScoringStatus = function(data) {
var redScoreReady = data.NumRedScoringPanels > 0 && data.NumRedScoringPanelsReady >= data.NumRedScoringPanels;
var blueScoreReady = data.NumBlueScoringPanels > 0 && data.NumBlueScoringPanelsReady >= data.NumBlueScoringPanels;
scoreIsReady = data.RefereeScoreReady && redScoreReady && blueScoreReady;
scoreIsReady = data.RefereeScoreReady && data.RedScoreReady && data.BlueScoreReady;
$("#refereeScoreStatus").attr("data-ready", data.RefereeScoreReady);
$("#redScoreStatus").text("Red Scoring " + data.NumRedScoringPanelsReady + "/" + data.NumRedScoringPanels);
$("#redScoreStatus").attr("data-ready", redScoreReady);
$("#redScoreStatus").attr("data-ready", data.RedScoreReady);
$("#blueScoreStatus").text("Blue Scoring " + data.NumBlueScoringPanelsReady + "/" + data.NumBlueScoringPanels);
$("#blueScoreStatus").attr("data-ready", blueScoreReady);
$("#blueScoreStatus").attr("data-ready", data.BlueScoreReady);
};
// Handles a websocket message to update the alliance station display screen selector.

View File

@@ -24,6 +24,7 @@ var handleLedMode = function(data) {
var handlePlcIoChange = function(data) {
$.each(data.Inputs, function(index, input) {
$("#input" + index).text(input)
$("#input" + index).attr("data-plc-value", input);
});
$.each(data.Registers, function(index, register) {
@@ -32,6 +33,7 @@ var handlePlcIoChange = function(data) {
$.each(data.Coils, function(index, coil) {
$("#coil" + index).text(coil)
$("#coil" + index).attr("data-plc-value", coil);
});
};

View File

@@ -19,7 +19,7 @@
{{range $i, $name := .InputNames}}
<tr>
<td>{{$name}}</td>
<td id="input{{$i}}"></td>
<td id="input{{$i}}" data-plc-value="false"></td>
</tr>
{{end}}
</table>
@@ -45,7 +45,7 @@
{{range $i, $name := .CoilNames}}
<tr>
<td>{{$name}}</td>
<td id="coil{{$i}}"></td>
<td id="coil{{$i}}" data-plc-value="false"></td>
</tr>
{{end}}
</table>