Compare commits
7 Commits
760d293044
...
master
Author | SHA1 | Date | |
---|---|---|---|
84fcfdde62
|
|||
4f594f7412
|
|||
cf83c4b609
|
|||
7d251291dc
|
|||
5d09d99ff5
|
|||
dc40185002
|
|||
facf18336f |
20
.github/workflows/go-test-build.yaml
vendored
Normal file
20
.github/workflows/go-test-build.yaml
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
name: go-test-build
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
go-test-build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: ghcr.io/catthehacker/ubuntu:runner-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
go: [ "1.22", "1.21" ]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: ${{ matrix.go }}
|
||||||
|
- run: go test -v ./...
|
||||||
|
- run: go build -o main main.go
|
19
.github/workflows/golangci-lint.yaml
vendored
Normal file
19
.github/workflows/golangci-lint.yaml
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
name: golangci-lint
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
goglangci-lint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: ghcr.io/catthehacker/ubuntu:runner-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: "1.22"
|
||||||
|
- name: golangci-lint
|
||||||
|
uses: golangci/golangci-lint-action@v6
|
||||||
|
with:
|
||||||
|
version: v1.61
|
15
.github/workflows/nix-check-build.yaml
vendored
Normal file
15
.github/workflows/nix-check-build.yaml
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
name: nix-check-build
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
nix-check-build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: ghcr.io/catthehacker/ubuntu:runner-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: cachix/install-nix-action@v27
|
||||||
|
- run: nix flake check
|
||||||
|
- run: nix build
|
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1 +1,2 @@
|
|||||||
|
.direnv
|
||||||
result
|
result
|
||||||
|
@@ -7,7 +7,7 @@ type Debouncer struct {
|
|||||||
C <-chan bool
|
C <-chan bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(ch <-chan bool) *Debouncer {
|
func New(ch <-chan bool, window time.Duration) *Debouncer {
|
||||||
output := make(chan bool)
|
output := make(chan bool)
|
||||||
var currentState bool
|
var currentState bool
|
||||||
var lastState bool
|
var lastState bool
|
||||||
@@ -21,11 +21,11 @@ func New(ch <-chan bool) *Debouncer {
|
|||||||
output <- false
|
output <- false
|
||||||
lastState = false
|
lastState = false
|
||||||
} else {
|
} else {
|
||||||
falseTimer.Reset(200 * time.Millisecond)
|
falseTimer.Reset(window)
|
||||||
}
|
}
|
||||||
case v, ok := <-ch:
|
case v, ok := <-ch:
|
||||||
if !ok {
|
if !ok {
|
||||||
falseTimer.Reset(200 * time.Millisecond)
|
falseTimer.Reset(window)
|
||||||
<-falseTimer.C
|
<-falseTimer.C
|
||||||
output <- false
|
output <- false
|
||||||
close(output)
|
close(output)
|
||||||
@@ -35,12 +35,12 @@ func New(ch <-chan bool) *Debouncer {
|
|||||||
if !lastState {
|
if !lastState {
|
||||||
output <- true
|
output <- true
|
||||||
lastState = true
|
lastState = true
|
||||||
falseTimer.Reset(200 * time.Millisecond)
|
falseTimer.Reset(window)
|
||||||
}
|
}
|
||||||
|
|
||||||
currentState = true
|
currentState = true
|
||||||
} else {
|
} else {
|
||||||
falseTimer.Reset(200 * time.Millisecond)
|
falseTimer.Reset(window)
|
||||||
|
|
||||||
currentState = false
|
currentState = false
|
||||||
}
|
}
|
||||||
|
@@ -10,7 +10,7 @@ import (
|
|||||||
func TestDebouncer(t *testing.T) {
|
func TestDebouncer(t *testing.T) {
|
||||||
t.Run("Simple", func(t *testing.T) {
|
t.Run("Simple", func(t *testing.T) {
|
||||||
ch := make(chan bool)
|
ch := make(chan bool)
|
||||||
d := debouncer.New(ch)
|
d := debouncer.New(ch, 200*time.Millisecond)
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
ch <- true
|
ch <- true
|
||||||
@@ -23,7 +23,7 @@ func TestDebouncer(t *testing.T) {
|
|||||||
})
|
})
|
||||||
t.Run("TrueTrueTrueFalse", func(t *testing.T) {
|
t.Run("TrueTrueTrueFalse", func(t *testing.T) {
|
||||||
ch := make(chan bool)
|
ch := make(chan bool)
|
||||||
d := debouncer.New(ch)
|
d := debouncer.New(ch, 200*time.Millisecond)
|
||||||
go func() {
|
go func() {
|
||||||
ch <- true
|
ch <- true
|
||||||
ch <- true
|
ch <- true
|
||||||
@@ -40,7 +40,7 @@ func TestDebouncer(t *testing.T) {
|
|||||||
})
|
})
|
||||||
t.Run("Debounce", func(t *testing.T) {
|
t.Run("Debounce", func(t *testing.T) {
|
||||||
ch := make(chan bool)
|
ch := make(chan bool)
|
||||||
d := debouncer.New(ch)
|
d := debouncer.New(ch, 200*time.Millisecond)
|
||||||
go func() {
|
go func() {
|
||||||
ch <- true
|
ch <- true
|
||||||
time.Sleep(10 * time.Millisecond)
|
time.Sleep(10 * time.Millisecond)
|
||||||
@@ -65,7 +65,7 @@ func TestDebouncer(t *testing.T) {
|
|||||||
})
|
})
|
||||||
t.Run("DebounceDelay", func(t *testing.T) {
|
t.Run("DebounceDelay", func(t *testing.T) {
|
||||||
ch := make(chan bool)
|
ch := make(chan bool)
|
||||||
d := debouncer.New(ch)
|
d := debouncer.New(ch, 200*time.Millisecond)
|
||||||
go func() {
|
go func() {
|
||||||
ch <- true
|
ch <- true
|
||||||
ch <- false
|
ch <- false
|
||||||
|
@@ -46,9 +46,9 @@
|
|||||||
in
|
in
|
||||||
pkgs.buildGoModule {
|
pkgs.buildGoModule {
|
||||||
version = version;
|
version = version;
|
||||||
name = "ghettoptt";
|
pname = "ghettoptt";
|
||||||
src = src;
|
src = src;
|
||||||
vendorHash = "sha256-7K0LFYHJ1NBEL7lRCqsKcWpCJY0btRv9eUhyRN9U7/I=";
|
vendorHash = "sha256-Jnk06H/5dIGbb284c2IReZfS7U0TaBoGWYkU/mjyBek=";
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -58,6 +58,7 @@
|
|||||||
default = pkgs.mkShell {
|
default = pkgs.mkShell {
|
||||||
packages = with pkgs; [
|
packages = with pkgs; [
|
||||||
go
|
go
|
||||||
|
golangci-lint
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
6
go.mod
6
go.mod
@@ -14,8 +14,8 @@ require (
|
|||||||
github.com/klauspost/compress v1.17.10 // indirect
|
github.com/klauspost/compress v1.17.10 // indirect
|
||||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
||||||
github.com/prometheus/client_model v0.6.1 // indirect
|
github.com/prometheus/client_model v0.6.1 // indirect
|
||||||
github.com/prometheus/common v0.59.1 // indirect
|
github.com/prometheus/common v0.60.0 // indirect
|
||||||
github.com/prometheus/procfs v0.15.1 // indirect
|
github.com/prometheus/procfs v0.15.1 // indirect
|
||||||
golang.org/x/sys v0.25.0 // indirect
|
golang.org/x/sys v0.26.0 // indirect
|
||||||
google.golang.org/protobuf v1.34.2 // indirect
|
google.golang.org/protobuf v1.35.1 // indirect
|
||||||
)
|
)
|
||||||
|
28
go.sum
28
go.sum
@@ -1,7 +1,5 @@
|
|||||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||||
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
|
|
||||||
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
|
||||||
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
||||||
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
@@ -14,29 +12,31 @@ github.com/holoplot/go-evdev v0.0.0-20240306072622-217e18f17db1 h1:92OsBIf5KB1Ta
|
|||||||
github.com/holoplot/go-evdev v0.0.0-20240306072622-217e18f17db1/go.mod h1:iHAf8OIncO2gcQ8XOjS7CMJ2aPbX2Bs0wl5pZyanEqk=
|
github.com/holoplot/go-evdev v0.0.0-20240306072622-217e18f17db1/go.mod h1:iHAf8OIncO2gcQ8XOjS7CMJ2aPbX2Bs0wl5pZyanEqk=
|
||||||
github.com/klauspost/compress v1.17.10 h1:oXAz+Vh0PMUvJczoi+flxpnBEPxoER1IaAnU/NMPtT0=
|
github.com/klauspost/compress v1.17.10 h1:oXAz+Vh0PMUvJczoi+flxpnBEPxoER1IaAnU/NMPtT0=
|
||||||
github.com/klauspost/compress v1.17.10/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
|
github.com/klauspost/compress v1.17.10/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
|
||||||
|
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
|
||||||
|
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
|
||||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
|
||||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
||||||
github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/prometheus/client_golang v1.20.4 h1:Tgh3Yr67PaOv/uTqloMsCEdeuFTatm5zIq5+qNN23vI=
|
github.com/prometheus/client_golang v1.20.4 h1:Tgh3Yr67PaOv/uTqloMsCEdeuFTatm5zIq5+qNN23vI=
|
||||||
github.com/prometheus/client_golang v1.20.4/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
|
github.com/prometheus/client_golang v1.20.4/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
|
||||||
github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=
|
|
||||||
github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=
|
|
||||||
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
|
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
|
||||||
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
|
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
|
||||||
github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE=
|
|
||||||
github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=
|
|
||||||
github.com/prometheus/common v0.59.1 h1:LXb1quJHWm1P6wq/U824uxYi4Sg0oGvNeUm1z5dJoX0=
|
github.com/prometheus/common v0.59.1 h1:LXb1quJHWm1P6wq/U824uxYi4Sg0oGvNeUm1z5dJoX0=
|
||||||
github.com/prometheus/common v0.59.1/go.mod h1:GpWM7dewqmVYcd7SmRaiWVe9SSqjf0UrwnYnpEZNuT0=
|
github.com/prometheus/common v0.59.1/go.mod h1:GpWM7dewqmVYcd7SmRaiWVe9SSqjf0UrwnYnpEZNuT0=
|
||||||
github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=
|
github.com/prometheus/common v0.60.0 h1:+V9PAREWNvJMAuJ1x1BaWl9dewMW4YrHZQbx0sJNllA=
|
||||||
github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
|
github.com/prometheus/common v0.60.0/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw=
|
||||||
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
|
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
|
||||||
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
|
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
|
||||||
golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU=
|
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
|
||||||
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||||
golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
|
golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
|
||||||
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=
|
golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
|
||||||
google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
|
golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
|
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
|
||||||
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
|
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
|
||||||
|
google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA=
|
||||||
|
google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
|
||||||
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
27
main.go
27
main.go
@@ -7,6 +7,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
|
"time"
|
||||||
|
|
||||||
"git.t-juice.club/torjus/ghettoptt/bus"
|
"git.t-juice.club/torjus/ghettoptt/bus"
|
||||||
"git.t-juice.club/torjus/ghettoptt/debouncer"
|
"git.t-juice.club/torjus/ghettoptt/debouncer"
|
||||||
@@ -15,7 +16,7 @@ import (
|
|||||||
"github.com/prometheus/client_golang/prometheus/promhttp"
|
"github.com/prometheus/client_golang/prometheus/promhttp"
|
||||||
)
|
)
|
||||||
|
|
||||||
const Version = "v0.1.3"
|
const Version = "v0.1.4"
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
// Setup logger
|
// Setup logger
|
||||||
@@ -39,9 +40,10 @@ func main() {
|
|||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
defer input.Close()
|
defer input.Close()
|
||||||
input.NonBlock()
|
if err := input.NonBlock(); err != nil {
|
||||||
|
slog.Error("Failed to set non-blocking mode", "error", err)
|
||||||
var done bool
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
// Start metrics server
|
// Start metrics server
|
||||||
srvCtx, srvCancel := context.WithCancel(context.Background())
|
srvCtx, srvCancel := context.WithCancel(context.Background())
|
||||||
@@ -55,18 +57,19 @@ func main() {
|
|||||||
}
|
}
|
||||||
go func() {
|
go func() {
|
||||||
<-ctx.Done()
|
<-ctx.Done()
|
||||||
srv.Shutdown(context.Background())
|
_ = srv.Shutdown(context.Background())
|
||||||
srvCancel()
|
srvCancel()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
slog.Info("Starting metrics server", "addr", srv.Addr)
|
slog.Info("Starting metrics server", "addr", srv.Addr)
|
||||||
srv.ListenAndServe()
|
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
|
||||||
|
slog.Warn("Failed to start metrics server", "error", err)
|
||||||
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// Listen for context cancellation
|
// Listen for context cancellation
|
||||||
go func() {
|
go func() {
|
||||||
<-ctx.Done()
|
<-ctx.Done()
|
||||||
done = true
|
|
||||||
input.Close()
|
input.Close()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
@@ -76,7 +79,7 @@ func main() {
|
|||||||
doneCtx, doneCancel := context.WithCancel(srvCtx)
|
doneCtx, doneCancel := context.WithCancel(srvCtx)
|
||||||
defer doneCancel()
|
defer doneCancel()
|
||||||
|
|
||||||
debouncer := debouncer.New(eventCh)
|
debouncer := debouncer.New(eventCh, 400*time.Millisecond)
|
||||||
go func() {
|
go func() {
|
||||||
var done bool
|
var done bool
|
||||||
for !done {
|
for !done {
|
||||||
@@ -86,7 +89,7 @@ func main() {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
slog.Error("Error reading from input device", "error", err)
|
slog.Error("Error reading from input device", "error", err)
|
||||||
mbus.StopTalking()
|
_ = mbus.StopTalking()
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
if ev.Code == evdev.KEY_F24 && ev.Value == 1 {
|
if ev.Code == evdev.KEY_F24 && ev.Value == 1 {
|
||||||
@@ -106,15 +109,15 @@ func main() {
|
|||||||
|
|
||||||
for v := range debouncer.C {
|
for v := range debouncer.C {
|
||||||
if v {
|
if v {
|
||||||
mbus.StartTalking()
|
_ = mbus.StartTalking()
|
||||||
slog.Info("Started talking")
|
slog.Info("Started talking")
|
||||||
} else {
|
} else {
|
||||||
mbus.StopTalking()
|
_ = mbus.StopTalking()
|
||||||
slog.Info("Stopped talking")
|
slog.Info("Stopped talking")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mbus.StopTalking()
|
_ = mbus.StopTalking()
|
||||||
<-srvCtx.Done()
|
<-srvCtx.Done()
|
||||||
slog.Info("Exiting")
|
slog.Info("Exiting")
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user