diff --git a/app/src/main/java/club/clubk/ktag/konfigurator/Device.kt b/app/src/main/java/club/clubk/ktag/konfigurator/Device.kt index 8b607aa..e715e5f 100644 --- a/app/src/main/java/club/clubk/ktag/konfigurator/Device.kt +++ b/app/src/main/java/club/clubk/ktag/konfigurator/Device.kt @@ -2,23 +2,131 @@ package club.clubk.ktag.konfigurator import java.util.UUID +const val EDIT_DELAY_TIME: Long = 3L + +sealed class DeviceState { + data object Configurable : DeviceState() + data object Ready : DeviceState() + data object Playing : DeviceState() + data object WrapUp : DeviceState() +} + +sealed class DeviceConfigureState { + data object Discovered: DeviceConfigureState() + data object Configuring: DeviceConfigureState() + data object Success: DeviceConfigureState() + data object Failure: DeviceConfigureState() +} + +enum class DeviceParameter { + PLAYER_ID, TEAM, SECONDARY_COLOR, MAX_HEALTH, SPECIAL_WEAPONS +} + data class Device(val uuid: UUID = UUID.randomUUID(), var name: String = "Unknown Device", - var address: String = "FF:FF:FF:FF:FF:FF", - var deviceType : Int? = null, - var team : Int? = null, - var playerID : Int? = null, - var deviceState: DeviceState? = null + var address: String = "00:00:00:00:00:00", + var deviceType: UInt? = null, + var deviceState: DeviceState? = null, + // All configurable variables + private var _playerID: UInt? = null, + private var _team: UInt? = null, + private var _secondaryColor: UInt? = null, + private var _maxHealth: UInt? = null, + private var _specialWeapons: UInt? = null ) { + var deviceConfigureState: DeviceConfigureState = DeviceConfigureState.Discovered + private set + + var dirtyPlayerID: Boolean = false + private set + var dirtyTeam: Boolean = false + private set + var dirtySecondaryColor: Boolean = false + private set + var dirtyMaxHealth: Boolean = false + private set + var dirtySpecialWeapons: Boolean = false + private set + + var lastEditTime: Long = 0L + private set + + val playerID: UInt? get() = _playerID + val team: UInt? get() = _team + val secondaryColor: UInt? get() = _secondaryColor + val maxHealth: UInt? get() = _maxHealth + val specialWeapons: UInt? get() = _specialWeapons fun deviceTypeName(): String { return when(deviceType) { - 0 -> "Little Boy BLuE" - 1 -> "2020TPC" - 2 -> "Mobile App" - 3 -> "32ESPecial" + 0u -> "Little Boy BLuE" + 1u -> "2020TPC" + 2u -> "Mobile App" + 3u -> "32ESPecial" else -> "Unknown Device Type" } } -} + fun deviceTypeDrawable() { + return + } + + fun isDirty(): Boolean { + return dirtyPlayerID || dirtyTeam || dirtySecondaryColor + || dirtyMaxHealth || dirtySpecialWeapons + } + + fun isPastEditTime(): Boolean { + return System.nanoTime() - lastEditTime!! >= EDIT_DELAY_TIME + } + + fun setParameter(parameter: DeviceParameter, value: Any) { + lastEditTime = System.nanoTime() + when (parameter) { + DeviceParameter.PLAYER_ID -> { + _playerID = value as UInt + dirtyPlayerID = true + } + DeviceParameter.TEAM -> { + _team = value as UInt + dirtyTeam = true + } + DeviceParameter.SECONDARY_COLOR -> { + _secondaryColor = value as UInt + dirtySecondaryColor = true + } + DeviceParameter.MAX_HEALTH -> { + _maxHealth = value as UInt + dirtyMaxHealth = true + } + DeviceParameter.SPECIAL_WEAPONS -> { + _specialWeapons = value as UInt + dirtySpecialWeapons = true + } + } + } + + fun checkForDirt() { + if (isDirty() && isPastEditTime()) { + return + } + } + + fun getDirtyParameters(): List { + val changed = mutableListOf() + if (dirtyPlayerID) changed.add(DeviceParameter.PLAYER_ID) + if (dirtyTeam) changed.add(DeviceParameter.TEAM) + if (dirtySecondaryColor) changed.add(DeviceParameter.SECONDARY_COLOR) + if (dirtyMaxHealth) changed.add(DeviceParameter.MAX_HEALTH) + if (dirtySpecialWeapons) changed.add(DeviceParameter.SPECIAL_WEAPONS) + return changed + } + + fun clearDirt() { + dirtyPlayerID = false + dirtyTeam = false + dirtySecondaryColor = false + dirtyMaxHealth = false + dirtySpecialWeapons = false + } +} diff --git a/app/src/main/java/club/clubk/ktag/konfigurator/DeviceState.kt b/app/src/main/java/club/clubk/ktag/konfigurator/DeviceState.kt deleted file mode 100644 index 22ea035..0000000 --- a/app/src/main/java/club/clubk/ktag/konfigurator/DeviceState.kt +++ /dev/null @@ -1,8 +0,0 @@ -package club.clubk.ktag.konfigurator - -sealed class DeviceState { - object Configurable : DeviceState() - object Ready : DeviceState() - object Playing : DeviceState() - object WrapUp : DeviceState() -} \ No newline at end of file diff --git a/app/src/main/java/club/clubk/ktag/konfigurator/GameConfig.kt b/app/src/main/java/club/clubk/ktag/konfigurator/GameConfig.kt index ccf6988..47e96a0 100644 --- a/app/src/main/java/club/clubk/ktag/konfigurator/GameConfig.kt +++ b/app/src/main/java/club/clubk/ktag/konfigurator/GameConfig.kt @@ -5,5 +5,5 @@ data class GameConfig(var name: String = "Default", var pregameLength: Int = 60000, var numRounds: Int = 2, var maxHealth: Int = 10, - var numBombs: Int = 1 // Special Weapons Received on Game Reentry + var specialWeapons: Int = 1 // Special Weapons Received on Game Reentry ) diff --git a/app/src/main/java/club/clubk/ktag/konfigurator/MainActivity.kt b/app/src/main/java/club/clubk/ktag/konfigurator/MainActivity.kt index d67932b..b0f0519 100644 --- a/app/src/main/java/club/clubk/ktag/konfigurator/MainActivity.kt +++ b/app/src/main/java/club/clubk/ktag/konfigurator/MainActivity.kt @@ -1,8 +1,6 @@ package club.clubk.ktag.konfigurator import android.Manifest -import android.bluetooth.BluetoothManager -import android.content.Context import android.content.pm.PackageManager import android.os.Build import android.os.Bundle @@ -23,7 +21,6 @@ import androidx.core.content.ContextCompat import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.KeyboardType @@ -253,7 +250,7 @@ fun GameConfigEditor(oldGameConfig: GameConfig, var pregameLength by rememberSaveable(oldGameConfig.pregameLength) { mutableStateOf(oldGameConfig.pregameLength.toString()) } var numRounds by rememberSaveable(oldGameConfig.numRounds) { mutableStateOf(oldGameConfig.numRounds.toString()) } var maxHealth by rememberSaveable(oldGameConfig.maxHealth) { mutableStateOf(oldGameConfig.maxHealth.toString()) } - var numBombs by rememberSaveable(oldGameConfig.numBombs) { mutableStateOf(oldGameConfig.numBombs.toString()) } + var numBombs by rememberSaveable(oldGameConfig.specialWeapons) { mutableStateOf(oldGameConfig.specialWeapons.toString()) } // For tracking validation errors var gameLengthError by rememberSaveable { mutableStateOf(false) } @@ -283,7 +280,7 @@ fun GameConfigEditor(oldGameConfig: GameConfig, pregameLength = pregameLength.toIntOrNull() ?: oldGameConfig.pregameLength, numRounds = numRounds.toIntOrNull() ?: oldGameConfig.numRounds, maxHealth = maxHealth.toIntOrNull() ?: oldGameConfig.maxHealth, - numBombs = numBombs.toIntOrNull() ?: oldGameConfig.numBombs + specialWeapons = numBombs.toIntOrNull() ?: oldGameConfig.specialWeapons ) onSave(newGameConfig) } @@ -479,9 +476,9 @@ fun SideBySideButtons( @Composable fun DeviceCard(stateMachine: StateMachineViewModel, device: Device) { val backgroundColor = when (device.team) { - 0 -> Color.Magenta - 1 -> Color.Red - 2 -> Color.Blue + 0u -> Color.Magenta + 1u -> Color.Red + 2u -> Color.Blue else -> MaterialTheme.colorScheme.surface // Default color } Card(modifier = Modifier