summaryrefslogtreecommitdiff
path: root/vendor/github.com/xtaci/kcp-go/v5/autotune.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/xtaci/kcp-go/v5/autotune.go')
-rw-r--r--vendor/github.com/xtaci/kcp-go/v5/autotune.go64
1 files changed, 64 insertions, 0 deletions
diff --git a/vendor/github.com/xtaci/kcp-go/v5/autotune.go b/vendor/github.com/xtaci/kcp-go/v5/autotune.go
new file mode 100644
index 0000000..1f85be3
--- /dev/null
+++ b/vendor/github.com/xtaci/kcp-go/v5/autotune.go
@@ -0,0 +1,64 @@
+package kcp
+
+const maxAutoTuneSamples = 258
+
+// pulse represents a 0/1 signal with time sequence
+type pulse struct {
+ bit bool // 0 or 1
+ seq uint32 // sequence of the signal
+}
+
+// autoTune object
+type autoTune struct {
+ pulses [maxAutoTuneSamples]pulse
+}
+
+// Sample adds a signal sample to the pulse buffer
+func (tune *autoTune) Sample(bit bool, seq uint32) {
+ tune.pulses[seq%maxAutoTuneSamples] = pulse{bit, seq}
+}
+
+// Find a period for a given signal
+// returns -1 if not found
+//
+// --- ------
+// | |
+// |______________|
+// Period
+// Falling Edge Rising Edge
+func (tune *autoTune) FindPeriod(bit bool) int {
+ // last pulse and initial index setup
+ lastPulse := tune.pulses[0]
+ idx := 1
+
+ // left edge
+ var leftEdge int
+ for ; idx < len(tune.pulses); idx++ {
+ if lastPulse.bit != bit && tune.pulses[idx].bit == bit { // edge found
+ if lastPulse.seq+1 == tune.pulses[idx].seq { // ensure edge continuity
+ leftEdge = idx
+ break
+ }
+ }
+ lastPulse = tune.pulses[idx]
+ }
+
+ // right edge
+ var rightEdge int
+ lastPulse = tune.pulses[leftEdge]
+ idx = leftEdge + 1
+
+ for ; idx < len(tune.pulses); idx++ {
+ if lastPulse.seq+1 == tune.pulses[idx].seq { // ensure pulses in this level monotonic
+ if lastPulse.bit == bit && tune.pulses[idx].bit != bit { // edge found
+ rightEdge = idx
+ break
+ }
+ } else {
+ return -1
+ }
+ lastPulse = tune.pulses[idx]
+ }
+
+ return rightEdge - leftEdge
+}