mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-06-13 08:04:03 +09:00
more accurate sleep counting
This commit is contained in:
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user