Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @file:Suppress("EXPERIMENTAL_FEATURE_WARNING")
- package de.icks.led.shared
- import androidx.annotation.ColorInt
- import de.icks.led.util.currentMillisFromMidnight
- private const val COMMAND_TYPE_MASK = 0xF000000_00000000
- private const val COMMAND_TYPE_INDEX = 0x1000000_00000000
- private const val COMMAND_TYPE_FILL = 0x2000000_00000000
- private const val COMMAND_TYPE_COLOR = 0x3000000_00000000
- private const val TIMESTAMP_MASK = 0x0FFFFFF_00000000 // Note: 279 minutes as millis is the maximum timestamp
- private const val PAYLOAD_MASK = 0x0000000_FFFFFFFF
- private val millisFromMidNight = currentMillisFromMidnight()
- private fun maskedTimestamp() = ((System.currentTimeMillis() - millisFromMidNight) shl 32) and TIMESTAMP_MASK
- interface LedCommand {
- val encodedCommand: Long
- }
- interface TimestampCommand: LedCommand {
- /**
- * Millis from midnight
- */
- val timestampMillis get() = (encodedCommand and TIMESTAMP_MASK) shr 32
- }
- inline class LedIndexCommand(override val encodedCommand: Long) : TimestampCommand {
- constructor( index: Int) : this(COMMAND_TYPE_INDEX or maskedTimestamp() or (PAYLOAD_MASK and index.toLong()))
- val index get() = (encodedCommand and PAYLOAD_MASK).toInt()
- }
- inline class LedColorCommand(override val encodedCommand: Long): TimestampCommand {
- constructor(@ColorInt color: Int) : this(COMMAND_TYPE_COLOR or maskedTimestamp() or (PAYLOAD_MASK and color.toLong()))
- val color @ColorInt get() = (encodedCommand and PAYLOAD_MASK).toInt()
- }
- inline class LedFillCommand(override val encodedCommand: Long): TimestampCommand {
- constructor() : this(COMMAND_TYPE_FILL or maskedTimestamp())
- }
- interface LedCommandResolver {
- fun resolveCommand(encodedCommand: Long) {
- when(encodedCommand and COMMAND_TYPE_MASK) {
- COMMAND_TYPE_INDEX -> onIndexCommand(LedIndexCommand(encodedCommand))
- COMMAND_TYPE_FILL -> onFillCommand(LedFillCommand(encodedCommand))
- COMMAND_TYPE_COLOR -> onColorCommand(LedColorCommand(encodedCommand))
- }
- }
- fun onIndexCommand(command: LedIndexCommand) {}
- fun onFillCommand(command: LedFillCommand) {}
- fun onColorCommand(command: LedColorCommand) {}
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement