From 80452a7a7da07d4ecd8c761ee49e007ab53cca96 Mon Sep 17 00:00:00 2001 From: Zhifei Ge Date: Fri, 12 Jun 2026 19:07:52 +0800 Subject: [PATCH] Sync RuntimeHost bridge for handle state contract --- app/libs/unity-bridge.aar | Bin 21402 -> 22619 bytes .../controlpanel/data/BridgeRepository.kt | 79 ++++++++++++++++-- 2 files changed, 73 insertions(+), 6 deletions(-) diff --git a/app/libs/unity-bridge.aar b/app/libs/unity-bridge.aar index 8fb521bcbc8107d29e351757f89c7b6ad7c7ed27..4ba3da3e34264ee5325ce9319f48286bb2a2e41b 100644 GIT binary patch delta 21994 zcmV(pK=8ksrvclr0kC!ff6Kh&t@Km?0J2&D01E&B0Ap-nb8}^LE^1+NlzIhFWWkax zGq}6EySoqW?(S}bI}FZ1S@xH~lNHn=qIIyn4!Z{Pm-@5k;&Y(;eBt*WeB-JSQG zlQ*N3<-j4p{@F-jNWX&pKkXmGW=;;w%Kxng+`l~RY&>mj{s%wQe}D5cb+IwGviKj| zvHs27#of`(#=*kc$<^)uu7UaInqa%0Dyc7EU~_*zWdGF`qV6{K=3-8cmNr&QX7(no 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 z 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 diff --git a/app/src/main/java/com/kiwii/controlpanel/data/BridgeRepository.kt b/app/src/main/java/com/kiwii/controlpanel/data/BridgeRepository.kt index 558bc1a..89930b6 100644 --- a/app/src/main/java/com/kiwii/controlpanel/data/BridgeRepository.kt +++ b/app/src/main/java/com/kiwii/controlpanel/data/BridgeRepository.kt @@ -36,31 +36,63 @@ class BridgeRepository { fun getLatestPoseFrameJson(): String = KiwiiRuntimeClientBridge.getLatestPoseFrameJson() fun getLatestBodyPoseFrameJson(): String = KiwiiRuntimeClientBridge.getLatestBodyPoseFrameJson() - fun getLeftHandleIMULatest(): FloatArray = KiwiiRuntimeClientBridge.getLatestLeftHandleIMU() + fun getLeftHandleIMULatest(): FloatArray = KiwiiRuntimeClientBridge.getLeftHandleIMULatest() + fun getLeftHandleIMUQueue(): Array { - val latest = KiwiiRuntimeClientBridge.getLatestLeftHandleIMU() + val queue = readHandleImuQueueCompat("getLeftHandleIMUQueue") + if (queue.isNotEmpty()) return queue + val latest = getLeftHandleIMULatest() return if (latest.isEmpty()) emptyArray() else arrayOf(latest) } + fun submitLeftStaticEffect(effectId: Int): String = KiwiiRuntimeClientBridge.submitLeftStaticEffect(effectId) fun submitLeftHeStream(streamId: Int, payload: String): String = - KiwiiRuntimeClientBridge.submitLeftHeStream(buildHeStreamPatternJson(streamId, payload)) + KiwiiRuntimeClientBridge.submitLeftHeStream(streamId, buildHeStreamPatternJson(streamId, payload)) + + fun getRightHandleIMULatest(): FloatArray = KiwiiRuntimeClientBridge.getRightHandleIMULatest() - fun getRightHandleIMULatest(): FloatArray = KiwiiRuntimeClientBridge.getLatestRightHandleIMU() fun getRightHandleIMUQueue(): Array { - val latest = KiwiiRuntimeClientBridge.getLatestRightHandleIMU() + val queue = readHandleImuQueueCompat("getRightHandleIMUQueue") + if (queue.isNotEmpty()) return queue + val latest = getRightHandleIMULatest() return if (latest.isEmpty()) emptyArray() else arrayOf(latest) } + fun submitRightStaticEffect(effectId: Int): String = KiwiiRuntimeClientBridge.submitRightStaticEffect(effectId) fun submitRightHeStream(streamId: Int, payload: String): String = - KiwiiRuntimeClientBridge.submitRightHeStream(buildHeStreamPatternJson(streamId, payload)) + KiwiiRuntimeClientBridge.submitRightHeStream(streamId, buildHeStreamPatternJson(streamId, payload)) fun getHandleStateJson(): String = KiwiiRuntimeClientBridge.getHandleStateJson() fun setMotorWeightKg(weight: Float): com.kiwii.bridge.MotorCommandResult = KiwiiRuntimeClientBridge.setMotorWeightKg(weight) fun setMotorTrainingMode(mode: Int, param: Float): String = KiwiiRuntimeClientBridge.setMotorTrainingMode(mode, param) + fun setMotorForceControlParamsJson(paramsJson: String): String { + return try { + val method = KiwiiRuntimeClientBridge::class.java.getMethod("setMotorForceControlParamsJson", String::class.java) + method.invoke(null, paramsJson) as? String ?: "{\"error\":\"setMotorForceControlParamsJson returned null\"}" + } catch (t: Throwable) { + "{\"error\":\"setMotorForceControlParamsJson unavailable: ${t.message}\"}" + } + } fun queryMotorTrainingMode(axis: Int): String = KiwiiRuntimeClientBridge.queryMotorTrainingMode(axis) fun getLatestMotorStateJson(): String = KiwiiRuntimeClientBridge.getLatestMotorStateJson() fun getMotorControlStateJson(): String = KiwiiRuntimeClientBridge.getMotorControlStateJson() + fun getMotorDisconnectDiagnosisJson(): String { + return try { + val method = KiwiiRuntimeClientBridge::class.java.getMethod("getMotorDisconnectDiagnosisJson") + method.invoke(null) as? String ?: "{\"error\":\"getMotorDisconnectDiagnosisJson returned null\"}" + } catch (t: Throwable) { + "{\"error\":\"getMotorDisconnectDiagnosisJson unavailable: ${t.message}\"}" + } + } + fun sendMotorHeartbeat(): String { + return try { + val method = KiwiiRuntimeClientBridge::class.java.getMethod("sendMotorHeartbeat") + method.invoke(null) as? String ?: "{\"error\":\"sendMotorHeartbeat returned null\"}" + } catch (t: Throwable) { + "{\"error\":\"sendMotorHeartbeat unavailable: ${t.message}\"}" + } + } fun getTelemetryStateJson(): String = KiwiiRuntimeClientBridge.getTelemetryStateJson() fun getSafetyStateJson(): String = KiwiiRuntimeClientBridge.getSafetyStateJson() @@ -68,6 +100,41 @@ class BridgeRepository { fun submitDeviceCommandDryRun(command: String): String = KiwiiRuntimeClientBridge.submitDeviceCommandDryRun(command) fun getDeviceCommandStateJson(): String = KiwiiRuntimeClientBridge.getDeviceCommandStateJson() + private fun readHandleImuQueueCompat(methodName: String): Array { + return try { + val method = KiwiiRuntimeClientBridge::class.java.getMethod(methodName) + when (val value = method.invoke(null)) { + is Array<*> -> { + @Suppress("UNCHECKED_CAST") + value.filterIsInstance().toTypedArray() + } + is FloatArray -> splitFlatImuQueue(value) + else -> emptyArray() + } + } catch (_: Throwable) { + emptyArray() + } + } + + private fun splitFlatImuQueue(flat: FloatArray): Array { + if (flat.isEmpty()) return emptyArray() + val sampleSize = when { + flat.size % 10 == 0 -> 10 + flat.size % 9 == 0 -> 9 + flat.size % 7 == 0 -> 7 + else -> flat.size + } + if (sampleSize <= 0) return emptyArray() + val out = ArrayList() + var offset = 0 + while (offset < flat.size) { + val end = minOf(offset + sampleSize, flat.size) + out.add(flat.copyOfRange(offset, end)) + offset = end + } + return out.toTypedArray() + } + private fun buildHeStreamPatternJson(streamId: Int, payload: String): String { val trimmed = payload.trim() if (trimmed.startsWith("{")) return trimmed