From be5bdc625beae85c10760bf95bba8fa47752ab2b Mon Sep 17 00:00:00 2001 From: Arsen Musayelyan Date: Sun, 24 Oct 2021 11:02:29 -0700 Subject: [PATCH] Add watch commands to itctl --- cmd/itctl/main.go | 1 + cmd/itctl/watch/battery.go | 76 +++++++++++++++++++++++++++++++++ cmd/itctl/watch/heart.go | 75 +++++++++++++++++++++++++++++++++ cmd/itctl/watch/motion.go | 86 ++++++++++++++++++++++++++++++++++++++ cmd/itctl/watch/steps.go | 75 +++++++++++++++++++++++++++++++++ cmd/itctl/watch/watch.go | 34 +++++++++++++++ 6 files changed, 347 insertions(+) create mode 100644 cmd/itctl/watch/battery.go create mode 100644 cmd/itctl/watch/heart.go create mode 100644 cmd/itctl/watch/motion.go create mode 100644 cmd/itctl/watch/steps.go create mode 100644 cmd/itctl/watch/watch.go diff --git a/cmd/itctl/main.go b/cmd/itctl/main.go index 1823a57..f63e12e 100644 --- a/cmd/itctl/main.go +++ b/cmd/itctl/main.go @@ -24,6 +24,7 @@ import ( _ "go.arsenm.dev/itd/cmd/itctl/notify" "go.arsenm.dev/itd/cmd/itctl/root" _ "go.arsenm.dev/itd/cmd/itctl/set" + _ "go.arsenm.dev/itd/cmd/itctl/watch" "os" diff --git a/cmd/itctl/watch/battery.go b/cmd/itctl/watch/battery.go new file mode 100644 index 0000000..f0edb50 --- /dev/null +++ b/cmd/itctl/watch/battery.go @@ -0,0 +1,76 @@ +/* + * itd uses bluetooth low energy to communicate with InfiniTime devices + * Copyright (C) 2021 Arsen Musayelyan + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package watch + +import ( + "fmt" + "os" + "os/signal" + "syscall" + + "github.com/rs/zerolog/log" + "github.com/spf13/cobra" + "github.com/spf13/viper" + "go.arsenm.dev/itd/api" +) + +// heartCmd represents the address command +var batteryCmd = &cobra.Command{ + Use: "battery", + Aliases: []string{"batt"}, + Short: "Watch InfiniTime's battery level for changes", + Run: func(cmd *cobra.Command, args []string) { + client := viper.Get("client").(*api.Client) + + battLevelCh, cancel, err := client.WatchBatteryLevel() + if err != nil { + log.Fatal().Err(err).Msg("Error getting battery level channel") + } + defer cancel() + + signalCh := make(chan os.Signal, 1) + go func() { + <-signalCh + cancel() + os.Exit(0) + }() + signal.Notify(signalCh, + syscall.SIGINT, + syscall.SIGTERM, + ) + + for battlevel := range battLevelCh { + fmt.Printf("%d%%\n", battlevel) + } + }, +} + +func init() { + watchCmd.AddCommand(batteryCmd) + + // Here you will define your flags and configuration settings. + + // Cobra supports Persistent Flags which will work for this command + // and all subcommands, e.g.: + // addressCmd.PersistentFlags().String("foo", "", "A help for foo") + + // Cobra supports local flags which will only run when this command + // is called directly, e.g.: + // addressCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") +} diff --git a/cmd/itctl/watch/heart.go b/cmd/itctl/watch/heart.go new file mode 100644 index 0000000..e6e17bd --- /dev/null +++ b/cmd/itctl/watch/heart.go @@ -0,0 +1,75 @@ +/* + * itd uses bluetooth low energy to communicate with InfiniTime devices + * Copyright (C) 2021 Arsen Musayelyan + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package watch + +import ( + "fmt" + "os" + "os/signal" + "syscall" + + "github.com/rs/zerolog/log" + "github.com/spf13/cobra" + "github.com/spf13/viper" + "go.arsenm.dev/itd/api" +) + +// heartCmd represents the address command +var heartCmd = &cobra.Command{ + Use: "heart", + Short: "Watch InfiniTime's heart rate for changes", + Run: func(cmd *cobra.Command, args []string) { + client := viper.Get("client").(*api.Client) + + heartRateCh, cancel, err := client.WatchHeartRate() + if err != nil { + log.Fatal().Err(err).Msg("Error getting heart rate channel") + } + defer cancel() + + signalCh := make(chan os.Signal, 1) + go func() { + <-signalCh + cancel() + os.Exit(0) + }() + signal.Notify(signalCh, + syscall.SIGINT, + syscall.SIGTERM, + ) + + for heartRate := range heartRateCh { + fmt.Println(heartRate, "BPM") + } + }, +} + +func init() { + watchCmd.AddCommand(heartCmd) + + // Here you will define your flags and configuration settings. + + // Cobra supports Persistent Flags which will work for this command + // and all subcommands, e.g.: + // addressCmd.PersistentFlags().String("foo", "", "A help for foo") + + // Cobra supports local flags which will only run when this command + // is called directly, e.g.: + // addressCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") +} diff --git a/cmd/itctl/watch/motion.go b/cmd/itctl/watch/motion.go new file mode 100644 index 0000000..58fe0af --- /dev/null +++ b/cmd/itctl/watch/motion.go @@ -0,0 +1,86 @@ +/* + * itd uses bluetooth low energy to communicate with InfiniTime devices + * Copyright (C) 2021 Arsen Musayelyan + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package watch + +import ( + "fmt" + "os" + "os/signal" + "syscall" + + "github.com/rs/zerolog/log" + "github.com/spf13/cobra" + "github.com/spf13/viper" + "go.arsenm.dev/itd/api" +) + +// heartCmd represents the address command +var motionCmd = &cobra.Command{ + Use: "motion", + Short: "Watch InfiniTime's motion values for changes", + Run: func(cmd *cobra.Command, args []string) { + client := viper.Get("client").(*api.Client) + + motionValCh, cancel, err := client.WatchMotion() + if err != nil { + log.Fatal().Err(err).Msg("Error getting motion value channel") + } + defer cancel() + + signalCh := make(chan os.Signal, 1) + go func() { + <-signalCh + cancel() + os.Exit(0) + }() + signal.Notify(signalCh, + syscall.SIGINT, + syscall.SIGTERM, + ) + + for motionVals := range motionValCh { + if viper.GetBool("shell") { + fmt.Printf( + "X=%d\nY=%d\nZ=%d\n", + motionVals.X, + motionVals.Y, + motionVals.Z, + ) + } else { + fmt.Printf("%+v\n", motionVals) + } + } + }, +} + +func init() { + watchCmd.AddCommand(motionCmd) + + // Here you will define your flags and configuration settings. + + // Cobra supports Persistent Flags which will work for this command + // and all subcommands, e.g.: + // addressCmd.PersistentFlags().String("foo", "", "A help for foo") + + // Cobra supports local flags which will only run when this command + // is called directly, e.g.: + // addressCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") + motionCmd.Flags().BoolP("shell", "s", false, "Output data in shell-compatible format") + viper.BindPFlag("shell", motionCmd.Flags().Lookup("shell")) +} diff --git a/cmd/itctl/watch/steps.go b/cmd/itctl/watch/steps.go new file mode 100644 index 0000000..2ad4667 --- /dev/null +++ b/cmd/itctl/watch/steps.go @@ -0,0 +1,75 @@ +/* + * itd uses bluetooth low energy to communicate with InfiniTime devices + * Copyright (C) 2021 Arsen Musayelyan + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package watch + +import ( + "fmt" + "os" + "os/signal" + "syscall" + + "github.com/rs/zerolog/log" + "github.com/spf13/cobra" + "github.com/spf13/viper" + "go.arsenm.dev/itd/api" +) + +// heartCmd represents the address command +var stepsCmd = &cobra.Command{ + Use: "steps", + Short: "Watch InfiniTime's step count for changes", + Run: func(cmd *cobra.Command, args []string) { + client := viper.Get("client").(*api.Client) + + stepCountCh, cancel, err := client.WatchStepCount() + if err != nil { + log.Fatal().Err(err).Msg("Error getting step count channel") + } + defer cancel() + + signalCh := make(chan os.Signal, 1) + go func() { + <-signalCh + cancel() + os.Exit(0) + }() + signal.Notify(signalCh, + syscall.SIGINT, + syscall.SIGTERM, + ) + + for stepCount := range stepCountCh { + fmt.Println(stepCount, "Steps") + } + }, +} + +func init() { + watchCmd.AddCommand(stepsCmd) + + // Here you will define your flags and configuration settings. + + // Cobra supports Persistent Flags which will work for this command + // and all subcommands, e.g.: + // addressCmd.PersistentFlags().String("foo", "", "A help for foo") + + // Cobra supports local flags which will only run when this command + // is called directly, e.g.: + // addressCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") +} diff --git a/cmd/itctl/watch/watch.go b/cmd/itctl/watch/watch.go new file mode 100644 index 0000000..7fd653f --- /dev/null +++ b/cmd/itctl/watch/watch.go @@ -0,0 +1,34 @@ +/* + * itd uses bluetooth low energy to communicate with InfiniTime devices + * Copyright (C) 2021 Arsen Musayelyan + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package watch + +import ( + "github.com/spf13/cobra" + "go.arsenm.dev/itd/cmd/itctl/root" +) + +// watchCmd represents the watch command +var watchCmd = &cobra.Command{ + Use: "watch", + Short: "Watch values from InfiniTime for changes", +} + +func init() { + root.RootCmd.AddCommand(watchCmd) +}