more accurate sleep counting

This commit is contained in:
minjaesong
2025-05-06 13:54:44 +09:00
parent aaf074c7d6
commit e179906322

View File

@@ -100,6 +100,7 @@ abstract class BlockTransferInterface(val isMaster: Boolean, val isSlave: Boolea
private var lastTransmissionTime = 0L private var lastTransmissionTime = 0L
private var delayAkku = 0.0
/** /**
* Calculates and applies appropriate delay based on data size and baud rate * 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 // Calculate delay in milliseconds
// Baud rate is bits per second, and we assume 10 bits per byte (8 data bits + start/stop bits) // Baud rate is bits per second, and we assume 10 bits per byte (8 data bits + start/stop bits)
val bitsTransmitted = byteCount * 10 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 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 // Only sleep if we need to slow down the transmission
if (elapsedTime < expectedTransmissionTimeMs) { if (delayAkku >= 1000_000.0) {
val sleepTime = expectedTransmissionTimeMs - elapsedTime val sleepTimeMS = (delayAkku / 1000000).toLong()
try { try {
Thread.sleep(sleepTime) Thread.sleep(sleepTimeMS)
println("Sleep $sleepTime ms for $byteCount bytes") println("Sleep $sleepTimeMS ms for $byteCount bytes")
delayAkku -= sleepTimeMS * 1000000.0
} }
catch (e: InterruptedException) { catch (e: InterruptedException) {
// Handle interruption if needed // Handle interruption if needed
} }
} }
else {
println("Sleep skip for $byteCount bytes")
}
// Update last transmission time // Update last transmission time
lastTransmissionTime = System.nanoTime() / 1000000L lastTransmissionTime = System.nanoTime()
} }
} }