From e1799063222636c9a1b8e6e60132eecb02238102 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Tue, 6 May 2025 13:54:44 +0900 Subject: [PATCH] more accurate sleep counting --- .../tsvm/peripheral/BlockTransferInterface.kt | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/tsvm_core/src/net/torvald/tsvm/peripheral/BlockTransferInterface.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/BlockTransferInterface.kt index 6430d1f..f3a5da5 100644 --- a/tsvm_core/src/net/torvald/tsvm/peripheral/BlockTransferInterface.kt +++ b/tsvm_core/src/net/torvald/tsvm/peripheral/BlockTransferInterface.kt @@ -100,6 +100,7 @@ abstract class BlockTransferInterface(val isMaster: Boolean, val isSlave: Boolea private var lastTransmissionTime = 0L + private var delayAkku = 0.0 /** * Calculates and applies appropriate delay based on data size and baud rate @@ -109,25 +110,34 @@ abstract class BlockTransferInterface(val isMaster: Boolean, val isSlave: Boolea // Calculate delay in milliseconds // Baud rate is bits per second, and we assume 10 bits per byte (8 data bits + start/stop bits) val bitsTransmitted = byteCount * 10 - val expectedTransmissionTimeMs = (bitsTransmitted * 1000L) / baudRate + val expectedTransmissionTimeNS = (bitsTransmitted * 1000_000_000L).toDouble() / baudRate - val currentTime = System.nanoTime() / 1000000L + val currentTime = System.nanoTime() val elapsedTime = if (lastTransmissionTime > 0) currentTime - lastTransmissionTime else 0 + // Add to our accumulator + if (expectedTransmissionTimeNS - elapsedTime > 0) + delayAkku += expectedTransmissionTimeNS - elapsedTime + + // Only sleep if we need to slow down the transmission - if (elapsedTime < expectedTransmissionTimeMs) { - val sleepTime = expectedTransmissionTimeMs - elapsedTime + if (delayAkku >= 1000_000.0) { + val sleepTimeMS = (delayAkku / 1000000).toLong() try { - Thread.sleep(sleepTime) - println("Sleep $sleepTime ms for $byteCount bytes") + Thread.sleep(sleepTimeMS) + println("Sleep $sleepTimeMS ms for $byteCount bytes") + delayAkku -= sleepTimeMS * 1000000.0 } catch (e: InterruptedException) { // Handle interruption if needed } } + else { + println("Sleep skip for $byteCount bytes") + } // Update last transmission time - lastTransmissionTime = System.nanoTime() / 1000000L + lastTransmissionTime = System.nanoTime() } }