effect.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package rgb
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/spf13/cobra"
  6. intdevice "github.com/wobkey/rgb/internal/device"
  7. "github.com/wobkey/rgb/internal/rgb"
  8. "github.com/wobkey/rgb/internal/via"
  9. )
  10. var effectName string
  11. func NewEffectCmd() *cobra.Command {
  12. return &cobra.Command{
  13. Use: "effect <name>",
  14. Short: "Set RGB effect",
  15. Long: "Set the RGB lighting effect on the connected keyboard.",
  16. Args: cobra.ExactArgs(1),
  17. Run: func(cmd *cobra.Command, args []string) {
  18. proto, kb, err := OpenDevice()
  19. if err != nil {
  20. fmt.Fprintf(os.Stderr, "Error: %v\n", err)
  21. os.Exit(1)
  22. }
  23. defer proto.Close()
  24. if err := proto.EnableHandshake(); err != nil {
  25. fmt.Fprintf(os.Stderr, "Handshake failed: %v\n", err)
  26. os.Exit(1)
  27. }
  28. e, err := rgb.ParseEffect(args[0])
  29. if err != nil {
  30. fmt.Fprintf(os.Stderr, "Error: %v\n", err)
  31. os.Exit(1)
  32. }
  33. availEffects := GetAvailableEffects(kb)
  34. if availEffects != nil {
  35. found := false
  36. for _, ef := range availEffects {
  37. if ef == e {
  38. found = true
  39. break
  40. }
  41. }
  42. if !found {
  43. fmt.Fprintf(os.Stderr, "Warning: effect %q may not be supported by %s\n", args[0], kb.Name)
  44. }
  45. }
  46. if err := proto.SetValue(via.RGBLight, uint8(rgb.Mode), uint8(e)); err != nil {
  47. fmt.Fprintf(os.Stderr, "Error setting effect: %v\n", err)
  48. os.Exit(1)
  49. }
  50. fmt.Printf("Effect set to %q\n", args[0])
  51. },
  52. }
  53. }
  54. func GetAvailableEffects(kb intdevice.Keyboard) []rgb.Effect {
  55. if kb.Name == "Wobkey Impact 80" {
  56. return []rgb.Effect{
  57. rgb.Static, rgb.Breathing, rgb.Rainbow, rgb.RainbowWave,
  58. rgb.Snake, rgb.Tail, rgb.Gradient,
  59. }
  60. }
  61. return nil
  62. }