forked from Elara6331/itd
Create and propagate contexts wherever possible
This commit is contained in:
parent
c05147518d
commit
60f1eedc9a
31
calls.go
31
calls.go
@ -1,6 +1,7 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"sync"
|
||||
|
||||
"github.com/godbus/dbus/v5"
|
||||
@ -8,15 +9,15 @@ import (
|
||||
"go.arsenm.dev/infinitime"
|
||||
)
|
||||
|
||||
func initCallNotifs(dev *infinitime.Device) error {
|
||||
func initCallNotifs(ctx context.Context, dev *infinitime.Device) error {
|
||||
// Connect to system bus. This connection is for method calls.
|
||||
conn, err := newSystemBusConn()
|
||||
conn, err := newSystemBusConn(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Check if modem manager interface exists
|
||||
exists, err := modemManagerExists(conn)
|
||||
exists, err := modemManagerExists(ctx, conn)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -28,7 +29,7 @@ func initCallNotifs(dev *infinitime.Device) error {
|
||||
}
|
||||
|
||||
// Connect to system bus. This connection is for monitoring.
|
||||
monitorConn, err := newSystemBusConn()
|
||||
monitorConn, err := newSystemBusConn(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -78,13 +79,13 @@ func initCallNotifs(dev *infinitime.Device) error {
|
||||
switch res {
|
||||
case infinitime.CallStatusAccepted:
|
||||
// Attempt to accept call
|
||||
err = acceptCall(conn, callObj)
|
||||
err = acceptCall(ctx, conn, callObj)
|
||||
if err != nil {
|
||||
log.Warn().Err(err).Msg("Error accepting call")
|
||||
}
|
||||
case infinitime.CallStatusDeclined:
|
||||
// Attempt to decline call
|
||||
err = declineCall(conn, callObj)
|
||||
err = declineCall(ctx, conn, callObj)
|
||||
if err != nil {
|
||||
log.Warn().Err(err).Msg("Error declining call")
|
||||
}
|
||||
@ -101,9 +102,11 @@ func initCallNotifs(dev *infinitime.Device) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func modemManagerExists(conn *dbus.Conn) (bool, error) {
|
||||
func modemManagerExists(ctx context.Context, conn *dbus.Conn) (bool, error) {
|
||||
var names []string
|
||||
err := conn.BusObject().Call("org.freedesktop.DBus.ListNames", 0).Store(&names)
|
||||
err := conn.BusObject().CallWithContext(
|
||||
ctx, "org.freedesktop.DBus.ListNames", 0,
|
||||
).Store(&names)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
@ -122,9 +125,11 @@ func getPhoneNum(conn *dbus.Conn, callObj dbus.BusObject) (string, error) {
|
||||
}
|
||||
|
||||
// getPhoneNum accepts a call using a DBus connection
|
||||
func acceptCall(conn *dbus.Conn, callObj dbus.BusObject) error {
|
||||
func acceptCall(ctx context.Context, conn *dbus.Conn, callObj dbus.BusObject) error {
|
||||
// Call Accept() method on DBus object
|
||||
call := callObj.Call("org.freedesktop.ModemManager1.Call.Accept", 0)
|
||||
call := callObj.CallWithContext(
|
||||
ctx, "org.freedesktop.ModemManager1.Call.Accept", 0,
|
||||
)
|
||||
if call.Err != nil {
|
||||
return call.Err
|
||||
}
|
||||
@ -132,9 +137,11 @@ func acceptCall(conn *dbus.Conn, callObj dbus.BusObject) error {
|
||||
}
|
||||
|
||||
// getPhoneNum declines a call using a DBus connection
|
||||
func declineCall(conn *dbus.Conn, callObj dbus.BusObject) error {
|
||||
func declineCall(ctx context.Context, conn *dbus.Conn, callObj dbus.BusObject) error {
|
||||
// Call Hangup() method on DBus object
|
||||
call := callObj.Call("org.freedesktop.ModemManager1.Call.Hangup", 0)
|
||||
call := callObj.CallWithContext(
|
||||
ctx, "org.freedesktop.ModemManager1.Call.Hangup", 0,
|
||||
)
|
||||
if call.Err != nil {
|
||||
return call.Err
|
||||
}
|
||||
|
14
dbus.go
14
dbus.go
@ -1,10 +1,14 @@
|
||||
package main
|
||||
|
||||
import "github.com/godbus/dbus/v5"
|
||||
import (
|
||||
"context"
|
||||
|
||||
func newSystemBusConn() (*dbus.Conn, error) {
|
||||
"github.com/godbus/dbus/v5"
|
||||
)
|
||||
|
||||
func newSystemBusConn(ctx context.Context) (*dbus.Conn, error) {
|
||||
// Connect to dbus session bus
|
||||
conn, err := dbus.SystemBusPrivate()
|
||||
conn, err := dbus.SystemBusPrivate(dbus.WithContext(ctx))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -19,9 +23,9 @@ func newSystemBusConn() (*dbus.Conn, error) {
|
||||
return conn, nil
|
||||
}
|
||||
|
||||
func newSessionBusConn() (*dbus.Conn, error) {
|
||||
func newSessionBusConn(ctx context.Context) (*dbus.Conn, error) {
|
||||
// Connect to dbus session bus
|
||||
conn, err := dbus.SessionBusPrivate()
|
||||
conn, err := dbus.SessionBusPrivate(dbus.WithContext(ctx))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
2
go.mod
2
go.mod
@ -15,7 +15,7 @@ require (
|
||||
github.com/mozillazg/go-pinyin v0.19.0
|
||||
github.com/rs/zerolog v1.26.1
|
||||
github.com/urfave/cli/v2 v2.3.0
|
||||
go.arsenm.dev/infinitime v0.0.0-20220505193916-1533865e4c42
|
||||
go.arsenm.dev/infinitime v0.0.0-20220511202257-9ed74726c478
|
||||
go.arsenm.dev/lrpc v0.0.0-20220510090735-af77b121f888
|
||||
golang.org/x/text v0.3.7
|
||||
modernc.org/sqlite v1.17.2
|
||||
|
4
go.sum
4
go.sum
@ -396,8 +396,8 @@ github.com/yuin/goldmark v1.3.8/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1
|
||||
github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||
github.com/yuin/goldmark v1.4.4 h1:zNWRjYUW32G9KirMXYHQHVNFkXvMI7LpgNW2AgYAoIs=
|
||||
github.com/yuin/goldmark v1.4.4/go.mod h1:rmuwmfZ0+bvzB24eSC//bk1R1Zp3hM0OXYv/G2LIilg=
|
||||
go.arsenm.dev/infinitime v0.0.0-20220505193916-1533865e4c42 h1:t3gXRa6TEPZ7mOGxkccYke7afkVe5qL+DGHFPkHF+WI=
|
||||
go.arsenm.dev/infinitime v0.0.0-20220505193916-1533865e4c42/go.mod h1:1cBQ3fp6QlRbSqu9kEBAHsVThINj31FtqHIYVsQ7wgg=
|
||||
go.arsenm.dev/infinitime v0.0.0-20220511202257-9ed74726c478 h1:HO+fteXuSnnT7po1PhGJK6nk8qMAGN2RqDaVP4sRN8g=
|
||||
go.arsenm.dev/infinitime v0.0.0-20220511202257-9ed74726c478/go.mod h1:1cBQ3fp6QlRbSqu9kEBAHsVThINj31FtqHIYVsQ7wgg=
|
||||
go.arsenm.dev/lrpc v0.0.0-20220510090735-af77b121f888 h1:WrcoTvWsmg5YHq/nWRBMdcRlNfFPfVtfi6eBEVyod8w=
|
||||
go.arsenm.dev/lrpc v0.0.0-20220510090735-af77b121f888/go.mod h1:goK9z735lfXmqlDxu9qN7FS8t0HJHN3PjyDtCToUY4w=
|
||||
go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
|
||||
|
29
main.go
29
main.go
@ -19,11 +19,14 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
_ "embed"
|
||||
"flag"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/signal"
|
||||
"strconv"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"github.com/gen2brain/dlgs"
|
||||
@ -74,8 +77,24 @@ func main() {
|
||||
LogLevel: level,
|
||||
}
|
||||
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
|
||||
sigCh := make(chan os.Signal, 1)
|
||||
go func() {
|
||||
<-sigCh
|
||||
cancel()
|
||||
time.Sleep(200 * time.Millisecond)
|
||||
os.Exit(0)
|
||||
}()
|
||||
signal.Notify(
|
||||
sigCh,
|
||||
syscall.SIGINT,
|
||||
syscall.SIGTERM,
|
||||
)
|
||||
|
||||
// Connect to InfiniTime with default options
|
||||
dev, err := infinitime.Connect(opts)
|
||||
dev, err := infinitime.Connect(ctx, opts)
|
||||
if err != nil {
|
||||
log.Fatal().Err(err).Msg("Error connecting to InfiniTime")
|
||||
}
|
||||
@ -136,25 +155,25 @@ func main() {
|
||||
}
|
||||
|
||||
// Start control socket
|
||||
err = initCallNotifs(dev)
|
||||
err = initCallNotifs(ctx, dev)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Error initializing call notifications")
|
||||
}
|
||||
|
||||
// Initialize notification relay
|
||||
err = initNotifRelay(dev)
|
||||
err = initNotifRelay(ctx, dev)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Error initializing notification relay")
|
||||
}
|
||||
|
||||
// Initializa weather
|
||||
err = initWeather(dev)
|
||||
err = initWeather(ctx, dev)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Error initializing weather")
|
||||
}
|
||||
|
||||
// Initialize metrics collection
|
||||
err = initMetrics(dev)
|
||||
err = initMetrics(ctx, dev)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Error intializing metrics collection")
|
||||
}
|
||||
|
11
metrics.go
11
metrics.go
@ -1,6 +1,7 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"path/filepath"
|
||||
"time"
|
||||
@ -10,7 +11,7 @@ import (
|
||||
_ "modernc.org/sqlite"
|
||||
)
|
||||
|
||||
func initMetrics(dev *infinitime.Device) error {
|
||||
func initMetrics(ctx context.Context, dev *infinitime.Device) error {
|
||||
// If metrics disabled, return nil
|
||||
if !k.Bool("metrics.enabled") {
|
||||
return nil
|
||||
@ -49,7 +50,7 @@ func initMetrics(dev *infinitime.Device) error {
|
||||
// If heart rate metrics enabled in config
|
||||
if k.Bool("metrics.heartRate.enabled") {
|
||||
// Watch heart rate
|
||||
heartRateCh, _, err := dev.WatchHeartRate()
|
||||
heartRateCh, err := dev.WatchHeartRate(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -67,7 +68,7 @@ func initMetrics(dev *infinitime.Device) error {
|
||||
// If step count metrics enabled in config
|
||||
if k.Bool("metrics.stepCount.enabled") {
|
||||
// Watch step count
|
||||
stepCountCh, _, err := dev.WatchStepCount()
|
||||
stepCountCh, err := dev.WatchStepCount(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -85,7 +86,7 @@ func initMetrics(dev *infinitime.Device) error {
|
||||
// If battery level metrics enabled in config
|
||||
if k.Bool("metrics.battLevel.enabled") {
|
||||
// Watch battery level
|
||||
battLevelCh, _, err := dev.WatchBatteryLevel()
|
||||
battLevelCh, err := dev.WatchBatteryLevel(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -103,7 +104,7 @@ func initMetrics(dev *infinitime.Device) error {
|
||||
// If motion metrics enabled in config
|
||||
if k.Bool("metrics.motion.enabled") {
|
||||
// Watch motion values
|
||||
motionCh, _, err := dev.WatchMotion()
|
||||
motionCh, err := dev.WatchMotion(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -19,6 +19,7 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"github.com/godbus/dbus/v5"
|
||||
@ -27,9 +28,9 @@ import (
|
||||
"go.arsenm.dev/itd/translit"
|
||||
)
|
||||
|
||||
func initNotifRelay(dev *infinitime.Device) error {
|
||||
func initNotifRelay(ctx context.Context, dev *infinitime.Device) error {
|
||||
// Connect to dbus session bus
|
||||
bus, err := newSessionBusConn()
|
||||
bus, err := newSessionBusConn(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -40,7 +41,9 @@ func initNotifRelay(dev *infinitime.Device) error {
|
||||
}
|
||||
var flag uint = 0
|
||||
// Becode monitor for notifications
|
||||
call := bus.BusObject().Call("org.freedesktop.DBus.Monitoring.BecomeMonitor", 0, rules, flag)
|
||||
call := bus.BusObject().CallWithContext(
|
||||
ctx, "org.freedesktop.DBus.Monitoring.BecomeMonitor", 0, rules, flag,
|
||||
)
|
||||
if call.Err != nil {
|
||||
return call.Err
|
||||
}
|
||||
|
44
socket.go
44
socket.go
@ -105,23 +105,16 @@ func (i *ITD) WatchHeartRate(ctx *server.Context) error {
|
||||
return err
|
||||
}
|
||||
|
||||
heartRateCh, cancel, err := i.dev.WatchHeartRate()
|
||||
heartRateCh, err := i.dev.WatchHeartRate(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
go func() {
|
||||
// For every heart rate value
|
||||
for {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
// Stop notifications if done signal received
|
||||
cancel()
|
||||
return
|
||||
case heartRate := <-heartRateCh:
|
||||
for heartRate := range heartRateCh {
|
||||
ch <- heartRate
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
return nil
|
||||
@ -137,23 +130,16 @@ func (i *ITD) WatchBatteryLevel(ctx *server.Context) error {
|
||||
return err
|
||||
}
|
||||
|
||||
battLevelCh, cancel, err := i.dev.WatchBatteryLevel()
|
||||
battLevelCh, err := i.dev.WatchBatteryLevel(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
go func() {
|
||||
// For every heart rate value
|
||||
for {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
// Stop notifications if done signal received
|
||||
cancel()
|
||||
return
|
||||
case battLevel := <-battLevelCh:
|
||||
for battLevel := range battLevelCh {
|
||||
ch <- battLevel
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
return nil
|
||||
@ -169,23 +155,16 @@ func (i *ITD) WatchMotion(ctx *server.Context) error {
|
||||
return err
|
||||
}
|
||||
|
||||
motionValsCh, cancel, err := i.dev.WatchMotion()
|
||||
motionValsCh, err := i.dev.WatchMotion(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
go func() {
|
||||
// For every heart rate value
|
||||
for {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
// Stop notifications if done signal received
|
||||
cancel()
|
||||
return
|
||||
case motionVals := <-motionValsCh:
|
||||
for motionVals := range motionValsCh {
|
||||
ch <- motionVals
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
return nil
|
||||
@ -201,23 +180,16 @@ func (i *ITD) WatchStepCount(ctx *server.Context) error {
|
||||
return err
|
||||
}
|
||||
|
||||
stepCountCh, cancel, err := i.dev.WatchStepCount()
|
||||
stepCountCh, err := i.dev.WatchStepCount(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
go func() {
|
||||
// For every heart rate value
|
||||
for {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
// Stop notifications if done signal received
|
||||
cancel()
|
||||
return
|
||||
case stepCount := <-stepCountCh:
|
||||
for stepCount := range stepCountCh {
|
||||
ch <- stepCount
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
return nil
|
||||
|
20
weather.go
20
weather.go
@ -1,6 +1,7 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"math"
|
||||
@ -60,13 +61,13 @@ type OSMData []struct {
|
||||
|
||||
var sendWeatherCh = make(chan struct{}, 1)
|
||||
|
||||
func initWeather(dev *infinitime.Device) error {
|
||||
func initWeather(ctx context.Context, dev *infinitime.Device) error {
|
||||
if !k.Bool("weather.enabled") {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Get location based on string in config
|
||||
lat, lon, err := getLocation(k.String("weather.location"))
|
||||
lat, lon, err := getLocation(ctx, k.String("weather.location"))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -76,7 +77,7 @@ func initWeather(dev *infinitime.Device) error {
|
||||
go func() {
|
||||
for {
|
||||
// Attempt to get weather
|
||||
data, err := getWeather(lat, lon)
|
||||
data, err := getWeather(ctx, lat, lon)
|
||||
if err != nil {
|
||||
log.Warn().Err(err).Msg("Error getting weather data")
|
||||
// Wait 15 minutes before retrying
|
||||
@ -181,10 +182,14 @@ func initWeather(dev *infinitime.Device) error {
|
||||
|
||||
// getLocation returns the latitude and longitude
|
||||
// given a location
|
||||
func getLocation(loc string) (lat, lon float64, err error) {
|
||||
func getLocation(ctx context.Context, loc string) (lat, lon float64, err error) {
|
||||
// Create request URL and perform GET request
|
||||
reqURL := fmt.Sprintf("https://nominatim.openstreetmap.org/search.php?q=%s&format=jsonv2", url.QueryEscape(loc))
|
||||
res, err := http.Get(reqURL)
|
||||
req, err := http.NewRequestWithContext(ctx, http.MethodGet, reqURL, nil)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
res, err := http.DefaultClient.Do(req)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
@ -218,9 +223,10 @@ func getLocation(loc string) (lat, lon float64, err error) {
|
||||
}
|
||||
|
||||
// getWeather gets weather data given a latitude and longitude
|
||||
func getWeather(lat, lon float64) (*METResponse, error) {
|
||||
func getWeather(ctx context.Context, lat, lon float64) (*METResponse, error) {
|
||||
// Create new GET request
|
||||
req, err := http.NewRequest(
|
||||
req, err := http.NewRequestWithContext(
|
||||
ctx,
|
||||
http.MethodGet,
|
||||
fmt.Sprintf(
|
||||
"https://api.met.no/weatherapi/locationforecast/2.0/complete?lat=%.2f&lon=%.2f",
|
||||
|
Loading…
Reference in New Issue
Block a user