Space glasses MCU commands so the IMU rate sticks, fit fixed resolutions to the glasses

This commit is contained in:
maxjivi05 committed 2026-10-13 11:24:01 -04:00
1 parent eabed0a593
commit c8c62960f6
3 files changed
+12 -4

No files matched your search

@@ -2776,7 +2776,11 @@ class SessionActivity : ComponentActivity(), SurfaceHolder.Callback {
if (glassesScreen == null || glasses.width <= 0 || glasses.height <= 0) return null
val panel = (if (glasses.sbs) glasses.width / 2 else glasses.width) to glasses.height
val mode = SessionPrefs.prefMode(intent.getStringExtra(SessionService.EXTRA_MODE) ?: SessionService.MODE_STEAM)
return com.droiddeck.launcher.session.SessionDisplay.resolveChoice(panel, SessionPrefs.resolutionChoice(this, mode, panel))
val display = com.droiddeck.launcher.session.SessionDisplay
val choice = SessionPrefs.resolutionChoice(this, mode, panel)
val size = display.resolveChoice(panel, choice)
val fixed = choice != display.MATCH_SCREEN && choice != display.FOLLOW_SCREEN && display.presetHeight(choice) == null
return if (fixed) display.resolve(panel, minOf(size.first, size.second), SessionPrefs.SHAPE_AUTO) else size
}
private fun onGlassesChanged() {
@@ -143,7 +143,7 @@ object Glasses {
fun query() = post {
val l = link ?: return@post
listOf(VitureProtocol.MSG_GET_DISPLAY, VitureProtocol.MSG_GET_BRIGHTNESS, VitureProtocol.MSG_GET_VOLUME, VitureProtocol.MSG_GET_IMU).forEachIndexed { i, msg ->
handler.postDelayed({ if (link === l) l.send(msg) }, 60L * i)
handler.postDelayed({ if (link === l) l.send(msg) }, VitureLink.COMMAND_GAP_MS * i)
}
}
@@ -391,7 +391,7 @@ object Glasses {
Log.i(TAG, "opened ${model?.name} pid=0x%04X imu=%s".format(device.productId, l.hasImu))
publish { it.copy(connected = true) }
listOf(VitureProtocol.MSG_GET_BRIGHTNESS, VitureProtocol.MSG_GET_VOLUME, VitureProtocol.MSG_GET_DISPLAY).forEachIndexed { i, msg ->
handler.postDelayed({ if (link === l) l.send(msg) }, 60L * (i + 1))
handler.postDelayed({ if (link === l) l.send(msg) }, VitureLink.COMMAND_GAP_MS * (i + 1))
}
handler.postDelayed({
if (link !== l) return@postDelayed
@@ -26,6 +26,7 @@ internal class VitureLink private constructor(
@Volatile private var running = true
private val writeLock = Any()
private var lastSendAt = 0L
private val readers = mutableListOf<Thread>()
val hasImu: Boolean get() = imuIn != null
@@ -68,7 +69,9 @@ internal class VitureLink private constructor(
val pkt = VitureProtocol.packet(msgId, payload)
val n = synchronized(writeLock) {
if (!running) return false
connection.bulkTransfer(mcuOut, pkt, pkt.size, WRITE_TIMEOUT_MS)
val wait = lastSendAt + COMMAND_GAP_MS - SystemClock.uptimeMillis()
if (wait > 0) SystemClock.sleep(wait)
connection.bulkTransfer(mcuOut, pkt, pkt.size, WRITE_TIMEOUT_MS).also { lastSendAt = SystemClock.uptimeMillis() }
}
Log.i(TAG, "send 0x%04X [%s] -> %d".format(msgId, payload.joinToString("") { "%02X".format(it) }, n))
return n == pkt.size
@@ -88,6 +91,7 @@ internal class VitureLink private constructor(
private const val READ_TIMEOUT_MS = 100
private const val WRITE_TIMEOUT_MS = 250
private const val LOST_AFTER = 50
const val COMMAND_GAP_MS = 60L
fun open(usb: UsbManager, device: UsbDevice, listener: Listener): VitureLink? {
val hid = (0 until device.interfaceCount).map(device::getInterface)