Update vault logic with measured distance sensor values.

This commit is contained in:
Patrick Fairbank
2018-08-18 21:31:22 -07:00
parent 347ad04885
commit 918e8741e0
4 changed files with 56 additions and 31 deletions

View File

@@ -4,9 +4,9 @@ package field
import "strconv"
const _coil_name = "heartbeatstackLightGreenstackLightOrangestackLightRedstackLightBluecoilCount"
const _coil_name = "heartbeatmatchResetstackLightGreenstackLightOrangestackLightRedstackLightBluered1EthernetDisablered2EthernetDisablered3EthernetDisableblue1EthernetDisableblue2EthernetDisableblue3EthernetDisablecoilCount"
var _coil_index = [...]uint8{0, 9, 24, 40, 53, 67, 76}
var _coil_index = [...]uint8{0, 9, 19, 34, 50, 63, 77, 96, 115, 134, 154, 174, 194, 203}
func (i coil) String() string {
if i < 0 || i >= coil(len(_coil_index)-1) {

View File

@@ -90,10 +90,17 @@ type coil int
const (
heartbeat coil = iota
matchReset
stackLightGreen
stackLightOrange
stackLightRed
stackLightBlue
red1EthernetDisable
red2EthernetDisable
red3EthernetDisable
blue1EthernetDisable
blue2EthernetDisable
blue3EthernetDisable
coilCount
)

View File

@@ -59,14 +59,25 @@ func (vault *Vault) CheckForNewlyPlayedPowerUp() string {
}
func countCubes(distance uint16) int {
// TODO(patrick): Update with real values once there is a physical setup to test with.
if distance >= 3000 {
// Ed Jordan's measurements:
// Empty 125
// 1 Short 98
// 1 Tall 92
// 2 Short 68
// 2 Tall 58
// 3 Short 43
// 3 Tall 26
if distance <= 15 {
// The sensor is probably disconnected or obstructed; this is too tall to be a cube stack.
return 0
}
if distance <= 50 {
return 3
}
if distance >= 2000 {
if distance <= 75 {
return 2
}
if distance >= 1000 {
if distance <= 105 {
return 1
}
return 0

View File

@@ -9,6 +9,13 @@ import (
"time"
)
const (
zeroCubeDistance = 125
oneCubeDistance = 98
twoCubeDistance = 58
threeCubeDistance = 43
)
func TestVaultNumCubes(t *testing.T) {
// TODO(patrick): Update with real values once there is a physical setup to test with.
vault := Vault{}
@@ -16,27 +23,27 @@ func TestVaultNumCubes(t *testing.T) {
assert.Equal(t, 0, vault.LevitateCubes)
assert.Equal(t, 0, vault.BoostCubes)
vault.UpdateCubes(1000, 0, 0)
vault.UpdateCubes(oneCubeDistance, zeroCubeDistance, zeroCubeDistance)
assert.Equal(t, 1, vault.ForceCubes)
assert.Equal(t, 0, vault.LevitateCubes)
assert.Equal(t, 0, vault.BoostCubes)
vault.UpdateCubes(0, 1000, 1000)
vault.UpdateCubes(zeroCubeDistance, oneCubeDistance, oneCubeDistance)
assert.Equal(t, 0, vault.ForceCubes)
assert.Equal(t, 1, vault.LevitateCubes)
assert.Equal(t, 1, vault.BoostCubes)
vault.UpdateCubes(0, 0, 2000)
vault.UpdateCubes(zeroCubeDistance, zeroCubeDistance, twoCubeDistance)
assert.Equal(t, 0, vault.ForceCubes)
assert.Equal(t, 0, vault.LevitateCubes)
assert.Equal(t, 2, vault.BoostCubes)
vault.UpdateCubes(2000, 2000, 3000)
vault.UpdateCubes(twoCubeDistance, twoCubeDistance, threeCubeDistance)
assert.Equal(t, 2, vault.ForceCubes)
assert.Equal(t, 2, vault.LevitateCubes)
assert.Equal(t, 3, vault.BoostCubes)
vault.UpdateCubes(3000, 3000, 3000)
vault.UpdateCubes(threeCubeDistance, threeCubeDistance, threeCubeDistance)
assert.Equal(t, 3, vault.ForceCubes)
assert.Equal(t, 3, vault.LevitateCubes)
assert.Equal(t, 3, vault.BoostCubes)
@@ -45,27 +52,27 @@ func TestVaultNumCubes(t *testing.T) {
func TestVaultLevitate(t *testing.T) {
vault := Vault{}
vault.UpdateCubes(0, 0, 0)
vault.UpdateCubes(zeroCubeDistance, zeroCubeDistance, zeroCubeDistance)
vault.UpdateButtons(false, true, false, time.Now())
assert.False(t, vault.LevitatePlayed)
vault.UpdateCubes(0, 1000, 0)
vault.UpdateCubes(zeroCubeDistance, oneCubeDistance, zeroCubeDistance)
vault.UpdateButtons(false, true, false, time.Now())
assert.False(t, vault.LevitatePlayed)
vault.UpdateCubes(0, 2000, 0)
vault.UpdateCubes(zeroCubeDistance, twoCubeDistance, zeroCubeDistance)
vault.UpdateButtons(false, true, false, time.Now())
assert.False(t, vault.LevitatePlayed)
vault.UpdateCubes(0, 3000, 0)
vault.UpdateCubes(zeroCubeDistance, threeCubeDistance, zeroCubeDistance)
vault.UpdateButtons(true, false, true, time.Now())
assert.False(t, vault.LevitatePlayed)
vault.UpdateCubes(0, 3000, 0)
vault.UpdateCubes(zeroCubeDistance, threeCubeDistance, zeroCubeDistance)
vault.UpdateButtons(false, true, false, time.Now())
assert.True(t, vault.LevitatePlayed)
vault.UpdateCubes(0, 3000, 0)
vault.UpdateCubes(zeroCubeDistance, threeCubeDistance, zeroCubeDistance)
vault.UpdateButtons(false, false, false, time.Now())
assert.True(t, vault.LevitatePlayed)
}
@@ -74,16 +81,16 @@ func TestVaultForce(t *testing.T) {
vault := Vault{Alliance: BlueAlliance}
ResetPowerUps()
vault.UpdateCubes(0, 0, 0)
vault.UpdateCubes(zeroCubeDistance, zeroCubeDistance, zeroCubeDistance)
vault.UpdateButtons(true, false, false, time.Now())
assert.Nil(t, vault.ForcePowerUp)
vault.UpdateCubes(3000, 0, 0)
vault.UpdateCubes(threeCubeDistance, zeroCubeDistance, zeroCubeDistance)
vault.UpdateButtons(false, true, true, time.Now())
assert.Nil(t, vault.ForcePowerUp)
// Activation with one cube.
vault.UpdateCubes(1000, 0, 0)
vault.UpdateCubes(oneCubeDistance, zeroCubeDistance, zeroCubeDistance)
vault.UpdateButtons(true, false, false, time.Now())
if assert.NotNil(t, vault.ForcePowerUp) {
assert.Equal(t, BlueAlliance, vault.ForcePowerUp.Alliance)
@@ -94,7 +101,7 @@ func TestVaultForce(t *testing.T) {
// Activation with two cubes.
vault = Vault{Alliance: RedAlliance}
ResetPowerUps()
vault.UpdateCubes(2000, 0, 0)
vault.UpdateCubes(twoCubeDistance, zeroCubeDistance, zeroCubeDistance)
vault.UpdateButtons(true, false, false, time.Now())
if assert.NotNil(t, vault.ForcePowerUp) {
assert.Equal(t, RedAlliance, vault.ForcePowerUp.Alliance)
@@ -105,7 +112,7 @@ func TestVaultForce(t *testing.T) {
// Activation with three cubes.
vault = Vault{Alliance: BlueAlliance}
ResetPowerUps()
vault.UpdateCubes(3000, 0, 0)
vault.UpdateCubes(threeCubeDistance, zeroCubeDistance, zeroCubeDistance)
vault.UpdateButtons(true, false, false, time.Now())
assert.NotNil(t, vault.ForcePowerUp)
if assert.NotNil(t, vault.ForcePowerUp) {
@@ -114,7 +121,7 @@ func TestVaultForce(t *testing.T) {
assert.Equal(t, 3, vault.ForcePowerUp.Level)
}
vault.UpdateCubes(3000, 0, 0)
vault.UpdateCubes(threeCubeDistance, zeroCubeDistance, zeroCubeDistance)
vault.UpdateButtons(false, false, false, time.Now())
assert.NotNil(t, vault.ForcePowerUp)
}
@@ -123,16 +130,16 @@ func TestVaultBoost(t *testing.T) {
vault := Vault{Alliance: BlueAlliance}
ResetPowerUps()
vault.UpdateCubes(0, 0, 0)
vault.UpdateCubes(zeroCubeDistance, zeroCubeDistance, zeroCubeDistance)
vault.UpdateButtons(false, false, true, time.Now())
assert.Nil(t, vault.BoostPowerUp)
vault.UpdateCubes(0, 0, 3000)
vault.UpdateCubes(zeroCubeDistance, zeroCubeDistance, threeCubeDistance)
vault.UpdateButtons(true, true, false, time.Now())
assert.Nil(t, vault.BoostPowerUp)
// Activation with one cube.
vault.UpdateCubes(0, 0, 1000)
vault.UpdateCubes(zeroCubeDistance, zeroCubeDistance, oneCubeDistance)
vault.UpdateButtons(false, false, true, time.Now())
if assert.NotNil(t, vault.BoostPowerUp) {
assert.Equal(t, BlueAlliance, vault.BoostPowerUp.Alliance)
@@ -143,7 +150,7 @@ func TestVaultBoost(t *testing.T) {
// Activation with two cubes.
vault = Vault{Alliance: RedAlliance}
ResetPowerUps()
vault.UpdateCubes(0, 0, 2000)
vault.UpdateCubes(zeroCubeDistance, zeroCubeDistance, twoCubeDistance)
vault.UpdateButtons(false, false, true, time.Now())
if assert.NotNil(t, vault.BoostPowerUp) {
assert.Equal(t, RedAlliance, vault.BoostPowerUp.Alliance)
@@ -154,7 +161,7 @@ func TestVaultBoost(t *testing.T) {
// Activation with three cubes.
vault = Vault{Alliance: BlueAlliance}
ResetPowerUps()
vault.UpdateCubes(0, 0, 3000)
vault.UpdateCubes(zeroCubeDistance, zeroCubeDistance, threeCubeDistance)
vault.UpdateButtons(false, false, true, time.Now())
assert.NotNil(t, vault.BoostPowerUp)
if assert.NotNil(t, vault.BoostPowerUp) {
@@ -163,16 +170,16 @@ func TestVaultBoost(t *testing.T) {
assert.Equal(t, 3, vault.BoostPowerUp.Level)
}
vault.UpdateCubes(0, 0, 3000)
vault.UpdateCubes(zeroCubeDistance, zeroCubeDistance, threeCubeDistance)
vault.UpdateButtons(false, false, false, time.Now())
assert.NotNil(t, vault.BoostPowerUp)
}
func TestVaultMultipleActivations(t *testing.T) {
redVault := Vault{Alliance: RedAlliance}
redVault.UpdateCubes(1000, 3000, 1000)
redVault.UpdateCubes(oneCubeDistance, threeCubeDistance, oneCubeDistance)
blueVault := Vault{Alliance: BlueAlliance}
blueVault.UpdateCubes(1000, 3000, 1000)
blueVault.UpdateCubes(oneCubeDistance, threeCubeDistance, oneCubeDistance)
ResetPowerUps()
redVault.UpdateButtons(true, false, false, timeAfterStart(0))